版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
2/4/20231第7章
EDA技術(shù)的應(yīng)用
?本章概要:本章通過用硬件描述語言VHDL和VerilogHDL實現(xiàn)的設(shè)計實例,進(jìn)一步介紹EDA技術(shù)在組合邏輯、時序邏輯電路設(shè)計以及在測量儀器、通信系統(tǒng)和自動控制等技術(shù)領(lǐng)域的綜合應(yīng)用。本章列出的全部HDL源程序均通過QuartusII或ModelSim工具軟件的編譯。?知識要點:(1)VHDL的組合邏輯、時序邏輯以及綜合應(yīng)用實例。 (2)VerilogHDL的組合邏輯、時序邏輯以及綜合應(yīng)用的實例。 (3)VHDL和VerilogHDL實現(xiàn)系統(tǒng)設(shè)計的實例。?教學(xué)安排:本章教學(xué)安排8學(xué)時。2/4/202327.1組合邏輯電路設(shè)計應(yīng)用7.1.18位乘法器的設(shè)計
8位乘法器的元件符號如圖7.1所示,a[7..0]和b[7..0]是被乘數(shù)和乘數(shù)輸入端,q[15..0]是乘積輸出端。
8位乘法器元件符號2/4/20233
用VHDL描述的8位乘法器源程序如下:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYmulISPORT( a,b:INintegerrange0to255; q:OUTintegerrange0to65535);ENDmul;
ARCHITECTUREoneOFmulISBEGIN q<=a*b; ENDone;2/4/20234
用VerilogHDL描述的8位乘法器源程序如下:modulemul8v(a,b,q); input[7:0] a,b; output[15:0] q; assignq=a*b;
endmodule
2/4/202357.1.2十六進(jìn)制編碼鍵盤設(shè)計
十六進(jìn)制編碼鍵盤的結(jié)構(gòu)如圖7.3所示,它是一個4×4矩陣結(jié)構(gòu),用x3~x0和y3~y0等8條信號線接收16個按鍵的信息,相應(yīng)的編碼器元件符號如圖7.4所示。
x0x1x2x3y0y1y2y332107654BA98FEDC圖7.3圖7.42/4/20236VHDL描述源程序如下LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYhcoderISPORT(x,y:INSTD_LOGIC_VECTOR(3DOWNTO0);S:OUTSTD_LOGIC_VECTOR(3DOWNTO0));ENDhcoder;ARCHITECTUREstrucOFhcoderISBEGIN2/4/20237PROCESS(x,y)VARIABLExy:STD_LOGIC_VECTOR(7DOWNTO0);BEGIN
xy:=(X&y); CASExyIS WHENB"11101110"=>S<=B"0000"; WHENB"11101101"=>S<=B"0001"; WHENB"11101011"=>S<=B"0010"; WHENB"11100111"=>S<=B"0011"; WHENB"11011110"=>S<=B"0100"; WHENB"11011101"=>S<=B"0101"; WHENB"11011011"=>S<=B"0110";2/4/20238
WHENB"11010111"=>S<=B"0111"; WHENB"10111110"=>S<=B"1000"; WHENB"10111101"=>S<=B"1001"; WHENB"10111011"=>S<=B"1010"; WHENB"10110111"=>S<=B"1011"; WHENB"01111110"=>S<=B"1100"; WHENB"01111101"=>S<=B"1101"; WHENB"01111011"=>S<=B"1110"; WHENB"01110111"=>S<=B"1111"; WHENOTHERS=>S<=B"0000";ENDCASE;ENDPROCESS;ENDstruc;2/4/20239VerilogHDL描述如下:Modulehcoder(x,y,s);input[3:0] x,y;output[3:0] s;reg[3:0] s;always begin case({x,y}) 8'b11101110: s=0; 8'b11101101: s=1; 8'b11101011: s=2; 8'b11100111: s=3; 8'b11011110: s=4;2/4/202310
8'b11011101: s=5; 8'b11011011: s=6; 8'b11010111: s=7; 8'b10111110: s=8; 8'b10111101: s=9; 8'b10111011: s=10; 8'b10110111: s=11; 8'b01111110: s=12; 8'b01111101: s=13; 8'b01111011: s=14; 8'b01110111: s=15; default: s=0;
endcaseendendmodule2/4/2023117.1.3譯碼器設(shè)計
3線-8線譯碼器的元件符號如圖7.6所示,ENA是譯碼器的使能控制輸入端,當(dāng)ENA=1時,譯碼器不能工作,8線輸出Y[7..0]=11111111(譯碼器的輸出有效電平為低電平);當(dāng)ENA=0時,譯碼器工作。C、B、A是3線數(shù)據(jù)輸入端,譯碼器處于工作狀態(tài)時,當(dāng)CBA=000時,Y[7..0]=11111110(即Y[0]=0);當(dāng)CBA=001時,Y[7..0]=11111101(即Y[1]=0);依此類推。
3線-8線譯碼器的元件符號2/4/202312用VHDL描述的源程序如下:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYDecoderIS
PORT(a,b,c,ena:INBIT;
y:OUTBIT_VECTOR(7DOWNTO0));ENDDecoder;ARCHITECTUREoneOFDecoderISBEGIN
PROCESS(a,b,c,ena) VARIABLEcba:BIT_VECTOR(2DOWNTO0); BEGIN
cba:=(c&b&a);2/4/202313IF(ena='1')THENy<="11111111"; ELSE CASE(cba)IS WHEN"000"=>y<="11111110"; WHEN"001"=>y<="11111101"; WHEN"010"=>y<="11111011"; WHEN"011"=>y<="11110111"; WHEN"100"=>y<="11101111"; WHEN"101"=>y<="11011111"; WHEN"110"=>y<="10111111"; WHEN"111"=>y<="01111111"; WHENOTHERS=>NULL; ENDCASE;ENDIF; ENDPROCESS;ENDone;
2/4/202314用VerilogHDL描述的3線-8線譯碼器源程序如下:module decoder(a,b,c,ena,y);input a,b,c,ena;output[7:0] y;reg[7:0] y;always begin if(ena==1)y='b11111111; else case({c,b,a}) 'b000:y='b11111110; 'b001:y='b11111101; 2/4/202315
'b010:y='b11111011; 'b011:y='b11110111; 'b100:y='b11101111; 'b101:y='b11011111; 'b110:y='b10111111; 'b111:y='b01111111; default:y='b11111111;
endcase endendmodule
2/4/2023167.1.416選1數(shù)據(jù)選擇器設(shè)計
16選1數(shù)據(jù)選擇器的元件符號如圖7.8所示,ENA是使能控制輸入端,當(dāng)ENA=1時,電路不能工作,輸出Y=0;ENA=0時,電路處于工作狀態(tài)。A[15..0]是數(shù)據(jù)輸入端,S3、S2,S1和S0是數(shù)據(jù)選擇控制端,當(dāng)電路處于工作狀態(tài)時(ENA=0),若S3S2S1S0=0000,則輸入A[0]被選中,輸出Y=A[0];若S3S2S1S0=0001,則輸入A[1]被選中,輸出Y=A[1];依此類推。
16選1數(shù)據(jù)選擇器元件符號2/4/202317用VHDL描述的16選1數(shù)據(jù)選擇器源程序如下:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYmux16_1ISPORT(s0,s1,s2,s3,ena:INSTD_LOGIC; a:INSTD_LOGIC_VECTOR(15DOWNTO0); y:OUTSTD_LOGIC);ENDmux16_1;ARCHITECTUREoneOFmux16_1ISSIGNALs:STD_LOGIC_VECTOR(3DOWNTO0);BEGIN s<=s0&s1&s2&s3; --將s0,s1,s2和s3并為s 2/4/202318PROCESS(s0,s1,s2,s3,ena) BEGIN IFena='1'THENy<='0'; ELSE CASEsIS WHEN"0000"=>y<=a(0); WHEN"0001"=>y<=a(1); WHEN"0010"=>y<=a(2); WHEN"0011"=>y<=a(3); WHEN"0100"=>y<=a(4); WHEN"0101"=>y<=a(5); WHEN"0110"=>y<=a(6); WHEN"0111"=>y<=a(7); 2/4/202319 WHEN"1000"=>y<=a(8); WHEN"1001"=>y<=a(9); WHEN"1010"=>y<=a(10); WHEN"1011"=>y<=a(11); WHEN"1100"=>y<=a(12); WHEN"1101"=>y<=a(13); WHEN"1110"=>y<=a(14); WHEN"1111"=>y<=a(15); WHENOTHERS=>y<='X'; ENDCASE; ENDIF;ENDPROCESS;ENDone;
2/4/202320用VerilogHDL描述16選1數(shù)據(jù)選擇器的源程序如下:module mux16_1(a,s3,s2,s1,s0,ena,y);input s3,s2,s1,s0,ena;input[15:0] a;output y;reg y;always begin if(ena==1)y=0; else case({s3,s2,s1,s0}) 'b0000:y=a[0]; 'b0001:y=a[1]; 2/4/202321
'b0010:y=a[2]; 'b0011:y=a[3]; 'b0100:y=a[4]; 'b0101:y=a[5]; 'b0110:y=a[6]; 'b0111:y=a[7]; 'b1000:y=a[8]; 'b1001:y=a[9]; 'b1010:y=a[10]; 'b1011:y=a[11]; 'b1100:y=a[12]; 'b1101:y=a[13]; 'b1110:y=a[14]; 'b1111:y=a[15]; default:y=0;
endcase endendmodule
2/4/2023227.1.58位二進(jìn)制數(shù)據(jù)比較器設(shè)計
8位二進(jìn)制數(shù)據(jù)比較器電路的元件符號如圖7.8所示,A[7..0]和B[7..0]是兩個數(shù)據(jù)輸入端,F(xiàn)A是“大于”輸出端,F(xiàn)B是“小于”輸出端,F(xiàn)E是“等于”輸出端。當(dāng)A[7..0]大于B[7..0]時,F(xiàn)A=1;當(dāng)A[7..0]小于B[7..0]時,F(xiàn)B=1;當(dāng)A[7..0]等于B[7..0]時,F(xiàn)E=1。
8位數(shù)據(jù)比較器元件符號2/4/202323用VHDL描述的8位二進(jìn)制數(shù)據(jù)比較器源程序如下:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYcomp8ISPORT(a,b :INSTD_LOGIC_VECTOR(7DOWNTO0);
fa,fb,fe :OUTSTD_LOGIC);ENDcomp8;ARCHITECTUREoneOFcomp8ISBEGIN
PROCESS(a,b) BEGIN2/4/202324
IFa>bTHEN fa<='1';
fb<='0';
fe<='0'; ELSIFa<bTHEN fa<='0';
fb<='1';
fe<='0'; ELSIFa=bTHEN fa<='0';
fb<='0';
fe<='1'; ENDIF; ENDPROCESS;ENDone;
2/4/202325用VerilogHDL描述8位二進(jìn)制數(shù)據(jù)比較器的源程序如下:module comp8v(a,b,fa,fb,fe);input[7:0] a,b;output fa,fb,fe;reg[7:0] fa,fb,fe;always begin if(a>b)beginfa=1;fb=0;fe=0;end elseif(a<b)beginfa=0;fb=1;fe=0;end elseif(a==b)beginfa=0;fb=0;fe=1;endendendmodule
2/4/202326
7.1.6ROM的設(shè)計對于容量不大的ROM,可以用VHDL的case語句來實現(xiàn)。下面是用case語句實現(xiàn)8×8位ROM的源程序
LIBRARYIEEE; USEIEEE.STD_LOGIC_1164.ALL;ENTITYfrom_romIS
PORT(addr :IN INTEGERRANGE0TO7;
ena :INSTD_LOGIC; q:OUT STD_LOGIC_VECTOR(7DOWNTO0));ENDfrom_rom;ARCHITECTUREaOFfrom_romISBEGIN2/4/202327PROCESS(ena,addr) BEGIN IF(ena='1')THENq<="ZZZZZZZZ";ELSE CASEaddrIS WHEN0=>q<="01000001"; WHEN1=>q<="01000010"; WHEN2=>q<="01000011"; WHEN3=>q<="01000100"; WHEN4=>q<="01000101"; WHEN5=>q<="01000110"; WHEN6=>q<="01000111"; WHEN7=>q<="01001000"; ENDCASE; 2/4/202328ENDIF; ENDPROCESS;ENDa;
由VHDL源代碼生成的8×8位ROM的元件符號如圖所示,其中ADDR[3..0]是地址輸入端,ENA是使能控制輸入端,當(dāng)ENA=1時,ROM不能工作,輸出Q[7..0]為高阻態(tài),ENA=0時,ROM工作,其輸出的數(shù)據(jù)由輸入地址決定。8×8位ROM的元件符號2/4/202329用VeilogHDL實現(xiàn)8×8位ROM的源程序如下:modulefrom_rom(addr,ena,q); input [2:0] addr; input ena; output [7:0] q;
reg [7:0] q;always@(enaoraddr) begin if(ena) q='bzzzzzzzz;else case(addr) 0: q='b01000001; 1: q='b01000010; 2/4/202330
2: q='b01000011; 3: q='b01000100; 4: q='b01000101; 5: q='b01000110; 6: q='b01000111; 7: q='b01001000; default: q='bzzzzzzzz;
endcaseendendmodule
2/4/2023317.2時序邏輯電路設(shè)計應(yīng)用
7.2.1JK觸發(fā)器設(shè)計JK觸發(fā)器的元件符號如圖7.14所示,其中J、K是數(shù)據(jù)輸入端,CLR是復(fù)位控制輸入端,當(dāng)CLR=0時,觸發(fā)器的狀態(tài)被置為0態(tài);CLK是時鐘輸入端;Q和QN是觸發(fā)器的兩個互補輸出端。
JK觸發(fā)器的元件符號2/4/202332用VHDL描述的JK觸發(fā)器源程序如下:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYmyjkffISPORT(j,k,clr:INSTD_LOGIC;
clk:INSTD_LOGIC;
q,qn:BUFFERSTD_LOGIC);ENDmyjkff;ARCHITECTUREoneOFmyjkffISBEGINPROCESS(j,k,clr,clk)VARIABLEjk:STD_LOGIC_VECTOR(1DOWNTO0); BEGIN 2/4/202333jk:=(j&k);IFclr='0'THEN q<='0'; qn<='1';ELSIFclk'EVENTANDclk='0'THEN CASEjkIS WHEN"00"=>q<=q; qn<=qn; WHEN"01"=>q<='0'; qn<='1'; WHEN"10"=>q<='1'; qn<='0'; WHEN"11"=>q<=NOTq; qn<=NOTqn; WHENOTHERS=>NULL; ENDCASE;ENDIF;ENDPROCESS;ENDone;
2/4/202334用VerilogHDL描述的JK觸發(fā)器源程序如下:modulemyjkff(j,k,clr,clk,q,qn); input j,k,clr,clk; output q,qn;
reg
q,qn;always@(negedge
clrornegedge
clk)begin if(~clr) beginq=0; qn=1;end else case({j,k}) 'b00:beginq=q; qn=qn;end 'b01:beginq=0;qn=1;end 2/4/202335
'b10:beginq=1;qn=0;end 'b11:beginq=~q;qn=~qn;end defaultbeginq=0;qn=1;end
endcaseendendmodule
2/4/2023367.2.28D鎖存器設(shè)計具有三態(tài)輸出的8D鎖存器元件符號如圖所示。CLR是復(fù)位控制輸入端,當(dāng)CLR=0時,8位數(shù)據(jù)輸出Q[7..0]=00000000。ENA是使能控制輸入端,當(dāng)ENA=1時,鎖存器處于工作狀態(tài),輸出Q[7..0]=D[7..0];ENA=0時,鎖存器的狀態(tài)保持不變。OE是三態(tài)輸出控制端,當(dāng)OE=1時,輸出為高阻態(tài);OE=0時,鎖存器為正常輸出狀態(tài)。
8D鎖存器元件符號2/4/202337用VHDL描述的8D鎖存器源程序如下:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYlatch8ISPORT(clr,clk,ena,oe:INSTD_LOGIC;
d:INSTD_LOGIC_VECTOR(7DOWNTO0);
q:BUFFERSTD_LOGIC_VECTOR(7DOWNTO0));ENDlatch8;ARCHITECTUREoneOFlatch8ISSIGNALq_temp:STD_LOGIC_VECTOR(7DOWNTO0);BEGIN2/4/202338u1:PROCESS(clk,clr,ena,oe)BEGIN IFclr='0'THENq_temp<="00000000"; ELSIFclk'EVENTANDclk='1'THEN IF(ena='1')THEN
q_temp<=d; ENDIF; ENDIF; IFoe='1'THENq<="ZZZZZZZZ";ELSEq<=q_temp;ENDIF;ENDPROCESSu1;ENDone;
2/4/202339用VerilogHDL描述三態(tài)輸出8D鎖存器的源程序如下:modulelatch8v(clk,clr,ena,oe,q,d);input[7:0] d;input clk,clr,ena,oe;output[7:0] q;
reg[7:0] q,q_temp;always@(posedge
clk) begin if(~clr) q_temp=0; elseif(ena) q_temp=d; else q_temp=q;if(oe)q=8'bzzzzzzzz; elseq=q_temp;endendmodule
2/4/2023407.2.38位雙向移位寄存器設(shè)計
8位雙向移位寄存器電路的元件符號如圖7.18所示,其中CLR是復(fù)位控制輸入端;LOD是預(yù)置控制輸入端;S是移位方向控制輸入端,當(dāng)S=1時,是右移移位寄存器,S=0時,是左移移位寄存器;DIR是右移串入輸入信號;DIL是左移串入輸入信號。
8位雙向移位寄存器元件符號2/4/202341用VHDL描述的8位雙向移位寄存器源程序如下:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYrlshiftISPORT(clr,lod,clk,s,dir,dil:INBIT;
d:INBIT_VECTOR(7DOWNTO0);
q:BUFFERBIT_VECTOR(7DOWNTO0));ENDrlshift;ARCHITECTUREoneOFrlshiftISSIGNALq_temp:BIT_VECTOR(7DOWNTO0);BEGIN
PROCESS(clr,clk,lod,s,dir,dil) BEGIN 2/4/202342IFclr='0'THENq_temp<="00000000";ELSIFclk'EVENTANDclk='1'THEN IF(lod='1')THEN
q_temp<=d; ELSIF(S='1')THEN FORiIN7downto1LOOP--實現(xiàn)右移操作
q_temp(i-1)<=q(i); ENDLOOP; q_temp(7)<=dir; ELSE2/4/202343
FORiIN0TO6LOOP--實現(xiàn)左移操作
q_temp(i+1)<=q(i); ENDLOOP; q_temp(0)<=dil; ENDIF;ENDIF; q<=q_temp;ENDPROCESS;ENDone;2/4/202344用VerilogHDL描述8位雙向移位寄存器的源程序如下:modulerlshift8(q,d,lod,clk,clr,s,dir,dil);input[7:0] d;input lod,clk,clr,s,dir,dil;output[7:0] q;
reg[7:0] q;always@(posedge
clk)begin if(~clr) q='b00000000; elseif(lod) q=d; elseif(s)beginq=q>>1; --實現(xiàn)右移操作
q[7]=dir;end 2/4/202345
elsebegin q=q<<1; --實現(xiàn)左移操作
q[0]=dil;end
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度企業(yè)裁員補償解除勞動合同賠償協(xié)議
- 二零二五年度鐵路貨運合同貨物運輸合同糾紛解決機制協(xié)議
- 2025年度消防隊與地方旅游企業(yè)共建消防安全協(xié)議書
- 二零二五年度美發(fā)店租賃合同附贈營銷策劃支持服務(wù)
- 2025年度醫(yī)藥衛(wèi)生行業(yè)競業(yè)限制協(xié)議敬業(yè)精神規(guī)范書
- 2025年度文化娛樂產(chǎn)業(yè)股權(quán)收購意向書
- 二零二五年度管道維修工程進(jìn)度管理與監(jiān)督合同
- 二零二五年度蔬菜產(chǎn)品追溯系統(tǒng)升級改造合同2025
- 2025星巴克加盟店環(huán)保責(zé)任履行合同3篇
- 二零二五版房地產(chǎn)測繪及不動產(chǎn)登記信息共享服務(wù)合同3篇
- 農(nóng)藥合成研發(fā)項目流程
- 機電安裝工程安全管理
- 2024年上海市第二十七屆初中物理競賽初賽試題及答案
- 信息技術(shù)部年終述職報告總結(jié)
- 理光投影機pj k360功能介紹
- 六年級數(shù)學(xué)上冊100道口算題(全冊完整版)
- 八年級數(shù)學(xué)下冊《第十九章 一次函數(shù)》單元檢測卷帶答案-人教版
- 帕薩特B5維修手冊及帕薩特B5全車電路圖
- 小學(xué)五年級解方程應(yīng)用題6
- 年月江西省南昌市某綜合樓工程造價指標(biāo)及
- 作物栽培學(xué)課件棉花
評論
0/150
提交評論