導航:首頁 > 源碼編譯 > 邏輯電路設計怎麼編譯

邏輯電路設計怎麼編譯

發布時間:2025-03-28 15:24:11

⑴ EPLDPLD器件的設計步驟

設計EPLD器件通常需要經過以下幾個步驟:

首先,對電路邏輯功能進行描述。PLD器件的邏輯功能可以通過兩種方式來表述,一是直觀的原理圖描述,它能直接將小規模集成電路的功能映射到PLD上,但表述可能不夠簡練。另一種是硬體描述語言(HDL)描述,如ABEL和VHDL。ABEL支持布爾方程、真值表和狀態機,適用於簡單的邏輯功能如計數器、解碼器等;而VHDL,作為一種行為描述語言,類似C語言的編程結構,描述復雜邏輯設計時更為簡潔,具有強大的邏輯描述和模擬能力,成為硬體設計的主流趨勢。

接著,使用計算機軟體編程和模擬。無論是HDL描述還是原理圖,都必須通過軟體編譯,將邏輯功能轉換成布爾代數表達式,並根據PLD器件特性適配為JED文件,即熔斷絲文件。在實際應用前,常常通過軟體模擬驗證設計的正確性,確保其符合設計要求。

最後,通過編程器將JED文件下載到PLD器件。這個過程涉及JED文件的下載,通常需要專門的編程器,如河洛公司的ALL系列或南京西爾特公司的Super系列。編程器通過計算機的並行列印介面將JED文件傳輸到PLD器件中,實現邏輯功能在實際器件中的實現。

⑵ 如何實現CPLD計數功能的調試

一、實驗目的

1. 熟悉CPLD的開發軟體的基本使用。
2. 掌握CPLD邏輯電路設計方法。
3. 會用邏輯分析儀進行數字電路的測試分析。

二、實驗任務和內容

1. 在CPLD中設計一個多位計數器電路,設計要求為:
(1)6位十進制加法/減法計數器,運行過程中可改變加法或減法;
(2)輸入計數信號頻率最高1MHz,信號電平為0~5V的脈沖信號。
(3)6位數碼管動態掃描顯示,顯示亮度均勻,不閃爍。
(4)有手動清零按鍵。
2.對設計的電路進行軟體模擬
3.計數器電路的CPLD下載、實驗調試。
4.使用虛擬邏輯分析儀進行調試和測試

三、實驗器材
1. 1.SJ-8002B電子測量實驗箱 1台
2.計算機(具有運行windows2000和圖形化控制項的能力 1台
3.函數發生器 1台
4. SJ-7002 CPLD實驗板 1塊
5 . 短接線若干

四、實驗原理
4.1 CPLD介紹

可編程邏輯器(PLD)是70年代發展起來的一種劃時代的新型邏輯器件,一般來說,PLD器件是由用戶配置以完成某種邏輯功能的電路。80年代末,美國ALTERA和XILINX公司採用E2CMOS工藝,分別推出大規模和超大規模的復雜可編程邏輯器件(CPLD)和現場可編程邏輯門陣列器件(FPGA),這種晶元在達到高度集成度的同時,所具有的應用靈活性和多組態功能是以往的LSI/VLSI電路無法比擬的。到90年代,CPLD/FPGA發展更為迅速,不僅具有電擦除特性,而且出現了邊緣掃描及在線編程等高級特性。另外,外圍I/O模塊擴大了在系統中的應用范圍和擴展性。較常用的有XILIN X公司的EPLD和ALTERA及LATTICE公司的CPLD。
CPLD/FPGA的設計開發採用功能強大的EDA工具,通過符合國際標準的硬體描述語言(如VHDL或VERILOG-HDL)來進行電子系統設計和產品開發,開發工具的通用性,設計語言的標准化以及設計過程幾乎與所用的CPLD/FPGA器件的硬體結構沒有關系,所以設計成功的邏輯功能軟體有很好的兼容性和可移植性,開發周期短;易學易用,開發便捷。
盡管CPLD、FPGA以及其它類型的PLD器件的結構各有其特點和長處,但是概括起來它們都是由三大部分組成的:(1)一個二維的邏輯塊陣列,構成器件的邏輯組成核心;(2)輸入/輸出塊(3)連接邏輯塊的互聯資源,連線資源由各種長度的線段組成,也包括用於連接邏輯塊之間,邏輯塊與輸入輸出部分的可編程連接開關。
本CPLD實驗電路板選用ALTERA公司的EPM7128SLC84器件,EPM7128SLC84的特點為:84引腳Pin,內部有128個宏單元、2500個等效邏輯門、15ns的速度、PLCC84封裝形式。除電源引腳、地線引腳、全局控制引腳和JTAG引腳外,共提供了64個可用I/O腳,這些引腳可以任意配置為輸入、輸出和雙向方式。

圖1 CPLD晶元EPM7128SLC84外形圖

4.2 CPLD(FPGA)器件的設計和驗證步驟

一般可分為設計輸入、編譯、功能模擬和時延模擬、器件下載(編程)、硬體電路三個設計步驟以及相應的功能模擬、時序模擬和器件測試三個設計驗證過程。

(1).設計輸入:設計輸入有多種方式,目前最常用的有電路圖和硬體描述語言兩種,對於簡單的設計,可採用原理圖的方式設計,對於復雜的設計可使用原理圖或硬體描述語言(Verilog、AHDL、VHDL語言),或者兩者混用,採用層次化設計方法,分模塊層次地進行描述。原理圖設計方法主要是按照數字系統的功能採用具體的邏輯器件組合來實現的,把這些由具體器件實現邏輯功能的電路圖輸入到軟體當中。這種設計方法比較直觀。硬體描述語言設計方法主要把數字系統的邏輯功能用硬體語言來描述
(2)編譯:編譯前先選擇器件的系列、型號,分配輸入/輸出管腳進行管腳,然後開始編譯編譯是指從設計輸入文件到熔絲圖文件(CPLD)或位流文件(FPGA)的編譯過程。在該過程中,編譯軟體自動地對設計文件進行綜合、優化,並針對所選中的器件進行映射、布局、布線、產生相應的熔絲圖或位流數據文件。
(3)模擬:分為功能模擬(Functional)和時延(Timing)模擬:編譯成功的設計並不一定完全正確,可通過模擬來驗證電路是否達到設計要求,基本思路是首先用波形編輯器編輯模擬文件,給輸入載入不同的激勵信號,然後運行模擬器,產生對應的輸出,根據輸入和輸出的關系,以此判別設計的正確性。
(4)器件編程:器件編程就是將熔絲圖文件或位流數據文件下載到相應的CPLD或FPGA器件中。
(5)系統硬體電路測試

圖2 CPLD設計流程

4.3 設計軟體的使用

對CPLD的設計可使用ALTERA公司的MAX-PLUSⅡ或Quartus Ⅱ,設計的主要步驟為:
(1)創建或打開一個工程。
(2)原理圖輸入方式:新建一個圖形文件,輸入符號(代表子模塊或元件、輸入輸出引腳),連線,存檔。如圖4所示為採用兩片74190級聯的兩位十進制計數器電路,文件名為Z74190.gdf。
(3)文本輸入方式:新建一個文本文件,輸入HDL語言編寫的電路,存檔。
(4)選擇晶元為CPLD實驗電路板選用的EPM7128SLC84器件,分配引腳。
(5)波形模擬,首先新建空白的波形文件,導入本設計電路的輸入輸出節點,給輸入節點按照需要指定時鍾信號和高低電平,開始模擬,得到結果,再分析結果。如圖5為Z74190.gdf的模擬文件波形。
(6)CPLD程序的下載:我們採用的是並口下載電纜ByteBlaster,它可以對MAX7000S系列進行在線編程。該下載電纜具有以下幾個部分:與PC機並行口相連的25針插座頭、與PCB板插座相連的10針插頭。其示意圖如3所示。

圖 3 並行電纜下載示意圖

設計舉例:圖 4和圖 5分別是用原理圖方式設計的2位十進制計數器的原理圖和軟體模擬波形圖。

圖4兩位十進制計數器電路圖 圖11-5 兩位十進制計數器電路模擬波形圖

4.4 CPLD實驗電路板原理和虛擬邏輯分析儀使用
實驗電路板的組成和虛擬邏輯分析儀的使用在本實驗指導書的「實驗四 邏輯分析儀的原理和應用」中已作了說明,請讀者參考。圖6 為CPLD板的詳細電路圖。CPLD與62芯插座定義表見表1和CPLD可供用戶自定義的引腳見表2。

使用CPLD板的1.000MHz的晶振時鍾,需放置CPLD板上S1短路塊位置在右面。
表1 CPLD和62芯插座連線引腳定義
引腳名稱 CPLD
晶元引腳
62芯插座引腳
說明
引腳名稱
CPLD對應腳
62芯插座引腳
說明

DO0
P40
16
連接邏輯分析儀的24個輸入通道
DO24
P63
28
系統保留

DO1
P36
48
DO25
P76
60

DO2
P41
17
DO26
P64
29

DO3
P44
49
DO27
P75
61

DO4
P45
18
DO28
P68
30

DO5
P46
50
VCC
P3,P13,
P26,P3
P43,P5,
P66,P78
31,62
+5V電源

DO6
P48
19

DO7
P49
51

DO8
P50
20

DO9
P51
52
GND
P1,P7,
P19,P32,
P42,P47,
P59,P72,
P82,P84
13,44
電源地

DO10
P55
21

DO11
P52
53

DO12
P54
22

DO13
P65
54

DO14
P57
23
CPLD時鍾源
sourceCLK
P83
45
由S1短路
選擇接
CPLD-CLK1

DO15
P67
55

DO16
P56
24

DO17
P69
56

DO18
P58
25
outsideclk
P39
15
選擇接(P83)

DO19
P70
57
allCLR
P35
47
系統總清零

DO20
P61
26
outside_tri
P37
14
外部觸發

DO21
P73
58

DO22
P60
27

DO23
P74
59

表2 用戶可用的CPLD自定義I/O引腳

P4 P5
P6
P8
P9
P10
P11
P15
P16
P17
P18
P20
P21

P22
P24
P25
P27
P28
P29
P30
P31
P77
P79
P80
P81

圖6 CPLD實驗板電路原理圖

五、設計指導:
設計和調試的過程是:①任務分析,層次分解,得到頂層設計框圖,大致確定每個子模快(子電路)的功能、輸入和輸出;②子模快電路設計和軟體模擬;③完成頂層電路設計,頂層模擬;④分配引腳,下載,連線和調試。
軟體模擬注意盡量給定符合實際電路工作的輸入電平、時鍾,模擬最小間隔不小於20ns,模擬時間長短適中。

5.1 設計任務分析

根據設計任務,可分為兩大部分:多位計數器電路和計數結果動態顯示電路。根據CPLD電路的層次化設計功能,設計出如圖7所示的頂層設計框圖。
6位十進制的計數器對輸入的脈沖計數,有加減計數控制和清零計數值控制,輸出6位十進制計數值,每位都用4位BCD碼表示,共有24根線。
根據動態掃描顯示的需要,必須設計一個6位BCD選1的多路數據選擇器,輸出的一位BCD碼(4根線)送給BCD-七段解碼器譯成段信號,從CPLD輸出給數碼管的7段。同時多路數據選擇器的控制選通信號需要3根,必須與6位數碼管的位選信號同步。
位選信號來自電路板的時鍾(1MHz)分頻,在用解碼器解碼(每次只能選中一個數碼管)。要保證多位顯示均勻和不閃爍,請計算和設計分頻的頻
電路的設計均有原理圖設計和HDL語言文本設計兩種方法,根據電路的特點和各人的情況,自己選用。
對每個子模快進行軟體模擬,先創建波形文件,設定時間間隔和解釋時間,編輯輸入波形,運行模擬,分析結果是否正確。若不正確,則修改設計,重新編譯後,再模擬,直到正確為止。

(1)6位十進制的計數器子模塊設計:
沒有現成電路可用,所以必須自己設計。
為什麼不選用二進制計數器?(從顯示要求、二進制轉換為BCD電路的難易等考慮)
設計方法一:選用6個1位的可逆帶清零十進制計數器級聯得到。注意進位/借位信號的時序。
設計方法二:使用HDL語言編程,注意同時滿足十進制、加、減的進位和借位。

(2)6位BCD選1的多路數據選擇器設計:
沒有現成電路可用,所以必須自己設計。
可選用多個數據選擇器來組合。要求控制選通信號需要3根,按000-001-010-011-100-101變化,只有6個狀態。

(3)BCD-七段解碼器設計:
有現成電路選用,注意共陰和共陽數碼管的區別。

位選信號產生

①位選解碼:每次選中一個,可選用什麼解碼器?注意位選電平是高電平有效還是低電平有效。

②位選控制:要求為6個狀態,設計電路可採用狀態機的方法,但仔細分析6個狀態之間的關系後,可得出符合_________的計數器。

設計方法:語言和圖形均可。

分頻電路:位選信號來自電路板的時鍾(1MHz)分頻,要保證多位顯示均勻和不閃爍,先計算分頻電路要求的輸出頻率,在設計分頻電路。可使用計數器分頻。

5.3分配引腳和編譯、下載

引腳分配要滿足CPLD電路板上已有的連線情況,把主要的輸入信號和重要的中間結果同時分配給邏輯分析儀的輸入通道A0~A23,可以利用邏輯分析儀進行測試,觀察到電路實際的內部工作時序。每次分配引腳後,需重新編譯後,再下載。

六、調試和測試結果
6.1實驗硬體連接

根據各人設計的計數器電路和分配的引腳連線,計數器輸入控制信號連接開關和按鍵,計數脈沖信號連接到函數發生器的TTL(CMOS)輸出端。計數器的輸出位選分別連接6個數碼管的為選端L1~L6注意,左邊的數碼管為低位,7段信號分別連接。
6.2調試和測試

按照以下順序對計數器電路進行測試,如不正確,請按下面步驟檢查:連線——引腳分配——CPLD電路設計。改正錯誤,再測試,若是CPLD電路錯誤,需重新編譯和重新下載。

①檢查動態掃描電路

數碼管7段信號全部直接接地,位選分別連接CPLD輸出位信號,這時,6個數碼管應該穩定顯示「888888」。

②檢查加法計數器是否正確

連接數碼管7段信號到CPLD指定輸出引腳,位選分別連接CPLD輸出位信號,選計數器輸入連接函數發生器的TTL電平信號輸出端,設置函數發生器為方波,頻率為1~2Hz,加/減控制信號輸入「加」有效,觀察數碼管的顯示,應是加1計數,更新頻率即為輸入信號頻率。提高輸入信號頻率,使計數更新快,檢查計數器進位和高位計數是否正確。

③檢查減法計數器是否正確

加/減控制信號輸入「減」有效,測試方法同上。

④檢查「清零」控制是否正確。

⑶ 請問如何將C或匯編源程序或燒到自己製作的PCB板上 謝謝···

一. 安裝單片機程序編譯軟體KEIL。
1.點擊圖標 運行直至安裝完成。
2.點擊圖標 運行KEIL,然後選擇菜單「project」點擊「new……」點擊「 」建立新的工程。填寫好工程文件名選擇保存路徑後按「保存」,此時彈出一個窗口如下圖所示

點擊Atmel左邊的+號展開CPU的型號,選擇「AT89C51」按「確定」再生成一個對話框如下圖,再按「是」即可。

這時在工程左邊的文件指示欄中多了一個 這樣的圖標,點其左邊的+號可展開當前所包含的文件。
選擇菜單「File」「new」新建一個文本編輯器,按保存按鈕,在彈出的窗口填入文件名後綴為.C ,然後按保存即把這個C文本文件保存到這個工程的目錄下。
再在工程左邊的文件指示欄中指著 點擊右鍵選擇 選項把剛才建立的C文件加入來,按「Add」即可加入,這時就可以在C文本編輯器里編號程序了。
寫好程序後選擇菜單「project」選擇「 」打開的對話框如下圖所示

如果彈出來的不是這個對話框時可以重復一次「project」選擇「 」便可以打開,打開後在 這個方框里打上勾然後按「確定」才可以編譯生成單片機的燒寫文件HEX文件。這些選項都設置好並寫好源程序後就可以在菜單選項project選項中選擇 選項對源程序進行編譯,生成的HEX文件就在工程的目錄下。
本文章後面附帶的是HJSMSY-V1.0開發板的測試源程序,讀者可以將其復制到編譯器里編譯。此程序為一個簡單的計算器功能程序,數寫鍵依次對應電路板上的數字0--9,「A」鍵功能為清除,「B」鍵功能為等於,「C」鍵功能為+,「D」鍵功能為-,「E」鍵功能為*,「F」鍵功能為除。

二. 把單片機開發板用9針串口線與電腦連接好,用配套的USB供電線將單片機開發板供電,並關閉電路板上的電源開關。運行STC晶元燒寫軟體,
點擊圖標
打開下載界面如下圖

按這個圖裡面的設置設好參數後,點擊「Open File/打開文件」打開HEX文件,在打開的對話框中找到剛才所建立工程的目錄,在此目錄下可以找到剛才編譯得到的HEX文件,如果找不到則是還沒有在 這個方框里打上勾,回到工程里打上勾並按 編譯一次就行了。打開HEX文件確定後就點擊下載軟體的 ,再打開單片機開發板上的電源開關,這時電腦便自動與單片機連接並把程序下載到單片機里,下載完成後會有聲音提示的,或者可以在軟體界面上看得到。註:STC系列單片機是在開機的瞬間下載程序的,如果還未能連接成功可以關掉電源再開一次即可。

//HJSMSY-V1.0單片機開發板測試程序.C
//-----------------------------------------------
// <<計算器>>
//-----------------------------------------------
//編寫人:李春起
//編定日期:2010.06.26
//修改日期:
//============================================================
#include <AT89X52.H>
#define uchar unsigned char
#define uint unsigned int
uint comdata,vardata,dispdata;
unsigned char flag=0,incflag=0,maxflag=10,maxvar=1;
//===========共陽數碼管段碼表==================================
uchar code SEG7[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar code ACT[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
//================引腳定義=======================================
sbit yy=P3^2;
sbit jk=P3^4;
sbit k1=P2^3;
sbit k2=P2^2;
sbit k3=P2^1;
sbit k4=P2^0;
//=====子函數聲明======================================
void init(void);
void delay1(uint z);
void kk(void);
//===========程序初始化===============================
void init(void)
{
TMOD=0x01;
TH0=0xf4;
TL0=0x48;
ET0=1;
TR0=1;
EA=1;
}
//=====空操作延時子程序=======================
void delay1(uint z)
{
uint j,y;
yy=0;
for(j=0;j<z;j++)
{for(y=0;y<100;y++){;}}
yy=1;
for(j=0;j<z;j++)
{
for (y=0;y<3422;y++);
}
}
//========鍵盤掃描子程序===================
void kk(void)
{ P2=0xf0;
if(P2!=0xf0)
{
P2=0xef;
if(!k1){delay1(15);comdata=vardata;vardata=0;incflag=1;} //k13
if(!k2){delay1(15);comdata=vardata;vardata=0;incflag=2;} //k14
if(!k3){delay1(15);comdata=vardata;vardata=0;incflag=3;} //k15
if(!k4){delay1(15);comdata=vardata;vardata=0;incflag=4;} //k16
P2=0xdf;
if(!k1){delay1(15);if(vardata>6553){goto ab1;};vardata=((vardata*10)/maxflag+8*maxvar);dispdata=vardata;} //k9
ab1:if(!k2){delay1(15);if(vardata>6553){goto ab2;};vardata=((vardata*10)/maxflag+9*maxvar);dispdata=vardata;} //k10
ab2:if(!k3){delay1(15);vardata=0;dispdata=vardata;} // k11
if(!k4){delay1(15);switch (incflag){
case 1:{vardata=(comdata+vardata);dispdata=vardata;}break;
case 2:{vardata=(comdata-vardata);dispdata=vardata;}break;
case 3:{vardata=(comdata*vardata);dispdata=vardata;}break;
case 4:{vardata=(comdata/vardata);dispdata=vardata;}break;
default:break;
}
}//k12
P2=0xbf;
if(!k1){delay1(15);if(vardata>6553){goto ab3;};vardata=((vardata*10)/maxflag+4*maxvar);dispdata=vardata;} //k5
ab3:if(!k2){delay1(15);if(vardata>6553){goto ab4;};vardata=((vardata*10)/maxflag+5*maxvar);dispdata=vardata;} //k6
ab4:if(!k3){delay1(15);if(vardata>6553){goto ab5;};vardata=((vardata*10)/maxflag+6*maxvar);dispdata=vardata;} //k7
ab5:if(!k4){delay1(15);if(vardata>6553){goto ab6;};vardata=((vardata*10)/maxflag+7*maxvar);dispdata=vardata;} //k8
ab6:P2=0x7f;
if(!k1){delay1(15);if(vardata>6553){goto ab7;};vardata=((vardata*10)/maxflag+0*maxvar);dispdata=vardata;} //k1
ab7:if(!k2){delay1(15);if(vardata>6553){goto ab8;};vardata=((vardata*10)/maxflag+1*maxvar);dispdata=vardata;} //k2
ab8:if(!k3){delay1(15);if(vardata>6553){goto ab9;};vardata=((vardata*10)/maxflag+2*maxvar);dispdata=vardata;} //k3
ab9:if(!k4){delay1(15);if(vardata>6553){goto ab10;};vardata=((vardata*10)/maxflag+3*maxvar);dispdata=vardata;} //k4
ab10:;
}
}
//======定時器0中斷服務子程序================
void time0(void) interrupt 1
{
TH0=0xf4;
TL0=0x48;
P0=0xff;P1=0xff;
// 時鍾顯示子程序
switch(flag)
{
case 0:{P0=SEG7[dispdata%10];P1=ACT[0];flag=1;}break;
case 1:{P0=SEG7[(dispdata/10)%10];P1=ACT[1];flag=2;}break;
case 2:{P0=SEG7[(dispdata/100)%10];P1=ACT[2];flag=3;}break;
case 3:{P0=SEG7[(dispdata/1000)%10];P1=ACT[3];flag=4;}break;
case 4:{P0=SEG7[dispdata/10000];P1=ACT[4];flag=5;}break;
case 5:{P0=SEG7[0];P1=ACT[5];flag=0;}
default:break;
}
}
//=========主函數======================================
void main()
{
init();
yy=1;
jk=0;
while(1)
{
if((vardata/1000)>=9){maxflag=10;maxvar=0;}
else {maxflag=1;maxvar=1;}
kk();
}
}

閱讀全文

與邏輯電路設計怎麼編譯相關的資料

熱點內容
更改用戶許可權linux 瀏覽:501
陣列卡在伺服器中起什麼作用 瀏覽:706
動手學習深度學習編譯器 瀏覽:544
matlab聚類函數命令 瀏覽:42
程序員推薦啥鍵盤 瀏覽:642
多空資金指標源碼查詢 瀏覽:166
8u伺服器什麼意思 瀏覽:657
易語言游戲多開源碼 瀏覽:379
雲伺服器橫向安全措施 瀏覽:576
javaforx64 瀏覽:598
美語音標pdf 瀏覽:636
壓縮氣壓強 瀏覽:938
EPC伺服器什麼 瀏覽:260
網路課堂緩解壓力 瀏覽:984
java上傳flash 瀏覽:333
linux斷開連接命令 瀏覽:911
離我們最近的解壓館 瀏覽:436
伺服器的遠程連接是什麼意思 瀏覽:336
空氣壓縮機行業分析 瀏覽:646
androidfragment框架 瀏覽:447