EDA技术与应用-EDA技术的应用_第1页
EDA技术与应用-EDA技术的应用_第2页
EDA技术与应用-EDA技术的应用_第3页
EDA技术与应用-EDA技术的应用_第4页
EDA技术与应用-EDA技术的应用_第5页
已阅读5页,还剩45页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2/4/20231第7章

EDA技术的应用

•本章概要:本章通过用硬件描述语言VHDL和VerilogHDL实现的设计实例,进一步介绍EDA技术在组合逻辑、时序逻辑电路设计以及在测量仪器、通信系统和自动控制等技术领域的综合应用。本章列出的全部HDL源程序均通过QuartusII或ModelSim工具软件的编译。•知识要点:(1)VHDL的组合逻辑、时序逻辑以及综合应用实例。 (2)VerilogHDL的组合逻辑、时序逻辑以及综合应用的实例。 (3)VHDL和VerilogHDL实现系统设计的实例。•教学安排:本章教学安排8学时。2/4/202327.1组合逻辑电路设计应用7.1.18位乘法器的设计

8位乘法器的元件符号如图7.1所示,a[7..0]和b[7..0]是被乘数和乘数输入端,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十六进制编码键盘设计

十六进制编码键盘的结构如图7.3所示,它是一个4×4矩阵结构,用x3~x0和y3~y0等8条信号线接收16个按键的信息,相应的编码器元件符号如图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译码器设计

3线-8线译码器的元件符号如图7.6所示,ENA是译码器的使能控制输入端,当ENA=1时,译码器不能工作,8线输出Y[7..0]=11111111(译码器的输出有效电平为低电平);当ENA=0时,译码器工作。C、B、A是3线数据输入端,译码器处于工作状态时,当CBA=000时,Y[7..0]=11111110(即Y[0]=0);当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数据选择器设计

16选1数据选择器的元件符号如图7.8所示,ENA是使能控制输入端,当ENA=1时,电路不能工作,输出Y=0;ENA=0时,电路处于工作状态。A[15..0]是数据输入端,S3、S2,S1和S0是数据选择控制端,当电路处于工作状态时(ENA=0),若S3S2S1S0=0000,则输入A[0]被选中,输出Y=A[0];若S3S2S1S0=0001,则输入A[1]被选中,输出Y=A[1];依此类推。

16选1数据选择器元件符号2/4/202317用VHDL描述的16选1数据选择器源程序如下: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数据选择器的源程序如下: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位二进制数据比较器设计

8位二进制数据比较器电路的元件符号如图7.8所示,A[7..0]和B[7..0]是两个数据输入端,FA是“大于”输出端,FB是“小于”输出端,FE是“等于”输出端。当A[7..0]大于B[7..0]时,FA=1;当A[7..0]小于B[7..0]时,FB=1;当A[7..0]等于B[7..0]时,FE=1。

8位数据比较器元件符号2/4/202323用VHDL描述的8位二进制数据比较器源程序如下: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位二进制数据比较器的源程序如下: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的设计对于容量不大的ROM,可以用VHDL的case语句来实现。下面是用case语句实现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是使能控制输入端,当ENA=1时,ROM不能工作,输出Q[7..0]为高阻态,ENA=0时,ROM工作,其输出的数据由输入地址决定。8×8位ROM的元件符号2/4/202329用VeilogHDL实现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时序逻辑电路设计应用

7.2.1JK触发器设计JK触发器的元件符号如图7.14所示,其中J、K是数据输入端,CLR是复位控制输入端,当CLR=0时,触发器的状态被置为0态;CLK是时钟输入端;Q和QN是触发器的两个互补输出端。

JK触发器的元件符号2/4/202332用VHDL描述的JK触发器源程序如下: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触发器源程序如下: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锁存器设计具有三态输出的8D锁存器元件符号如图所示。CLR是复位控制输入端,当CLR=0时,8位数据输出Q[7..0]=00000000。ENA是使能控制输入端,当ENA=1时,锁存器处于工作状态,输出Q[7..0]=D[7..0];ENA=0时,锁存器的状态保持不变。OE是三态输出控制端,当OE=1时,输出为高阻态;OE=0时,锁存器为正常输出状态。

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描述三态输出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位双向移位寄存器设计

8位双向移位寄存器电路的元件符号如图7.18所示,其中CLR是复位控制输入端;LOD是预置控制输入端;S是移位方向控制输入端,当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--实现右移操作

q_temp(i-1)<=q(i); ENDLOOP; q_temp(7)<=dir; ELSE2/4/202343

FORiIN0TO6LOOP--实现左移操作

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; --实现右移操作

q[7]=dir;end 2/4/202345

elsebegin q=q<<1; --实现左移操作

q[0]=dil;end

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论