《第7章EDA技术的应用》由会员分享,可在线阅读,更多相关《第7章EDA技术的应用(58页珍藏版)》请在金锄头文库上搜索。
1、第第7章章 EDA技术的应用技术的应用 7.1 7.1 组合逻辑电路设计应用组合逻辑电路设计应用7.2 7.2 时序逻辑电路设计应用时序逻辑电路设计应用1第第7 7章章 EDAEDA技术的应用技术的应用 本章概要:本章通过用硬件描述语言本章概要:本章通过用硬件描述语言VHDL和和Verilog HDL实现的设计实例,进一步介绍实现的设计实例,进一步介绍EDA技术在组合逻辑、时序逻技术在组合逻辑、时序逻辑电路设计以及在测量仪器、通信系统和自动控制等技术领辑电路设计以及在测量仪器、通信系统和自动控制等技术领域的综合应用。本章列出的全部域的综合应用。本章列出的全部HDL源程序均通过源程序均通过Qua
2、rtus II或或ModelSim工具软件的编译。工具软件的编译。知识要点:(知识要点:(1)VHDL的组合逻辑、时序逻辑以及综合应的组合逻辑、时序逻辑以及综合应用实例。用实例。 (2)Verilog HDL的组合逻辑、时序逻辑以及综合应的组合逻辑、时序逻辑以及综合应用的实例。用的实例。 (3)VHDL和和Verilog HDL实现系统设计的实例。实现系统设计的实例。教学安排:本章教学安排教学安排:本章教学安排8学时。学时。27.1 7.1 组合逻辑电路设计应用组合逻辑电路设计应用7.1.1 8 8位乘法器的设计位乘法器的设计 8 8位乘法器的元件符号如图位乘法器的元件符号如图7.17.1所示
3、,所示,a7.0a7.0和和b7.0b7.0是被乘数和乘数输入端,是被乘数和乘数输入端,q15.0q15.0是乘积输出端。是乘积输出端。 8位乘法器元件符号位乘法器元件符号3用用VHDL描述的描述的8位乘法器源程序如下:位乘法器源程序如下:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL; ENTITY mul ISPORT(a,b: IN integer range 0 to 255;q: OUT integer range 0 to 65535); END mul; ARCHITECTURE one OF mul IS BEGIN q S S S S S S
4、 S S S S S S S S S S S = B0000; END CASE;END PROCESS ;END struc;9Verilog HDL描述如下描述如下:Module hcoder(x,y,s);input3:0x,y;output3:0s;reg3:0s;alwaysbegincase (x,y) 8b11101110:s=0;8b11101101:s=1;8b11101011:s=2;8b11100111:s=3;8b11011110:s=4;108b11011101: s=5;8b11011011: s=6;8b11010111: s=7;8b10111110: s=8;
5、8b10111101: s=9;8b10111011: s=10;8b10110111: s=11;8b01111110: s=12;8b01111101: s=13;8b01111011: s=14;8b01110111: s=15; default :s=0;endcase endendmodule117.1.3 译码器设计译码器设计 3线线-8线译码器的元件符号如图线译码器的元件符号如图7.6所示,所示,ENA是译码器是译码器的使能控制输入端,当的使能控制输入端,当ENA=1时,译码器不能工作,时,译码器不能工作,8线输线输出出Y7.0=11111111(译码器的输出有效电平为低电平);
6、(译码器的输出有效电平为低电平);当当ENA=0时,译码器工作。时,译码器工作。C、B、A是是3线数据输入端,译线数据输入端,译码器处于工作状态时,当码器处于工作状态时,当CBA=000时,时,Y7.0=11111110(即(即Y0=0);当);当CBA=001时,时,Y7.0=11111101(即(即Y1=0);依此类推。);依此类推。 3线线-8线译码器的元件符号线译码器的元件符号12用用VHDL描述的源程序如下:描述的源程序如下:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY Decoder ISPORT(a,b,c,ena:IN BIT;
7、 y:OUT BIT_VECTOR(7 DOWNTO 0); END Decoder; ARCHITECTURE one OF Decoder ISBEGIN PROCESS(a,b,c,ena)VARIABLE cba:BIT_VECTOR(2 DOWNTO 0); BEGINcba:=(c & b & a); 13IF (ena=1) THEN y y y y y y y y y NULL;END CASE; END IF; END PROCESS; END one; 14用用Verilog HDL描述的描述的3线线-8线译码器源程序如下:线译码器源程序如下:moduledecoder(a
8、,b,c,ena,y);inputa,b,c,ena;output7:0 y;reg7:0y;alwaysbeginif (ena=1) y = b11111111; elsecase (c,b,a) b000: y= b11111110;b001: y= b11111101;15b010: y= b11111011;b011: y= b11110111;b100: y= b11101111;b101: y= b11011111;b110: y= b10111111;b111: y= b01111111; default : y= b11111111; endcaseendendmodule
9、167.1.4 16选1数据选择器设计数据选择器设计 16选选1数数据据选选择择器器的的元元件件符符号号如如图图7.8所所示示,ENA是是使使能能控控制制输输入入端端,当当ENA=1时时,电电路路不不能能工工作作,输输出出Y=0;ENA=0时时,电电路路处处于于工工作作状状态态。A15.0是是数数据据输输入入端端,S3、S2,S1和和S0是是数数据据选选择择控控制制端端,当当电电路路处处于于工工作作状状态态时时(ENA=0),若若S3S2S1S0=0000,则则输输入入A0被被选选中中,输输出出Y=A0;若若S3S2S1S0=0001,则则输输入入A1被被选选中中,输输出出Y=A1;依此类推。
10、;依此类推。 16选选1数据选择器元件符号数据选择器元件符号17用用VHDL描述的描述的16选选1数据选择器数据选择器源程序如下:源程序如下:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL; ENTITY mux16_1 ISPORT (s0,s1,s2,s3,ena: IN STD_LOGIC; a: IN STD_LOGIC_VECTOR(15 DOWNTO 0); y: OUT STD_LOGIC);END mux16_1;ARCHITECTURE one OF mux16_1 ISSIGNAL s: STD_LOGIC_VECTOR(3 DOWNTO
11、0); BEGIN s=s0&s1&s2&s3; -将将s0,s1,s2和和s3并为并为s18PROCESS(s0,s1,s2,s3,ena) BEGINIF ena=1 THEN y y y y y y y y y y y y y y y y y y b THEN fa = 1;fb = 0;fe = 0;ELSIF a b THEN fa = 0;fb = 1;fe = 0;ELSIF a = b THEN fa = 0;fb = 0;fe b) begin fa = 1; fb = 0; fe = 0; endelse if (a b) begin fa = 0; fb = 1; fe
12、= 0; endelse if (a = b) begin fa = 0; fb = 0; fe = 1; end endendmodule 26 7.1.6 ROM的设计的设计对于容量不大的对于容量不大的ROM,可以用,可以用VHDL的的case语句来实现。下语句来实现。下面是用面是用case语句实现语句实现88位位ROM的源程序的源程序 LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY from_rom ISPORT(addr : ININTEGER RANGE 0 TO 7;ena: IN STD_LOGIC;q: OUTSTD_LOGIC_
13、VECTOR(7 DOWNTO 0);END from_rom;ARCHITECTURE a OF from_rom IS BEGIN 27PROCESS (ena,addr) BEGINIF (ena=1) THEN q q q q q q q q q=01001000;END CASE;28END IF; END PROCESS ;END a; 由由VHDL源代码生成的源代码生成的88位位ROM的元件符号如图所示,的元件符号如图所示,其中其中ADDR3.0是地址输入端,是地址输入端,ENA是使能控制输入端,当是使能控制输入端,当ENA=1时,时,ROM不能工作,输出不能工作,输出Q7.0为
14、高阻态,为高阻态,ENA=0时,时,ROM工作,其输出的数据由输入地址决定。工作,其输出的数据由输入地址决定。 88位位ROM的元件符号的元件符号29用用Veilog HDL实现实现88位位ROM的源程序如下:的源程序如下:module from_rom(addr,ena,q); input 2:0 addr;input ena; output 7:0 q;reg 7:0 q;always (ena or addr)beginif (ena)q = bzzzzzzzz;elsecase (addr) 0:q = b01000001;1:q = b01000010;302:q = b010000
15、11;3:q = b01000100;4:q = b01000101;5:q = b01000110;6:q = b01000111;7:q = b01001000; default :q = bzzzzzzzz; endcase endendmodule 317.2 7.2 时序逻辑电路设计应用时序逻辑电路设计应用 7.2.1 JK触发器设计触发器设计JK触触发发器器的的元元件件符符号号如如图图7.14所所示示,其其中中J、K是是数数据据输输入入端端,CLR是是复复位位控控制制输输入入端端,当当CLR=0时时,触触发发器器的的状状态态被被置置为为0态;态;CLKCLK是时钟输入端;是时钟输入
16、端;Q Q和和QNQN是触发器的两个互补输出端。是触发器的两个互补输出端。 JK触发器的元件符号触发器的元件符号32用用VHDL描述的描述的JK触发器源程序如下:触发器源程序如下:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL; ENTITY myjkff ISPORT(j,k,clr:IN STD_LOGIC; clk:IN STD_LOGIC; q,qn:BUFFER STD_LOGIC);END myjkff;ARCHITECTURE one OF myjkff ISBEGINPROCESS(j,k,clr,clk) VARIABLE jk:STD_LO
17、GIC_VECTOR(1 DOWNTO 0); BEGIN33jk:=(j & k); IF clr=0 THEN q=0;qn q =q; qn q = 0; qn q = 1;qn q = NOT q;qn NULL;END CASE ; END IF;END PROCESS;END one; 34用用Verilog HDL描述的描述的JK触发器源程序如下:触发器源程序如下:module myjkff(j,k,clr,clk,q,qn); input j,k,clr,clk;output q,qn; reg q,qn;always (negedge clr or negedge clk)
18、beginif (clr)begin q = 0; qn = 1; endelse case (j,k)b00: begin q = q; qn = qn; endb01: begin q = 0; qn = 1; end35b10: begin q = 1; qn = 0; endb11: begin q = q; qn = qn; enddefault begin q = 0; qn = 1;end endcase endendmodule 367.2.2 8D锁存器设计锁存器设计 具有三态输出的具有三态输出的8D锁存器元件符号如图所示。锁存器元件符号如图所示。CLR是复是复位控制输入端,
19、当位控制输入端,当CLR=0时,时,8位数据输出位数据输出Q7.0=00000000。ENA是使能控制输入端,当是使能控制输入端,当ENA=1时,时,锁存器处于工作状态,输出锁存器处于工作状态,输出Q7.0D7.0;ENA=0时,锁时,锁存器的状态保持不变。存器的状态保持不变。OE是三态输出控制端,当是三态输出控制端,当OE=1时,时,输出为高阻态;输出为高阻态;OE=0时,锁存器为正常输出状态。时,锁存器为正常输出状态。 8D锁存器元件符号锁存器元件符号37用用VHDL描述的描述的8D锁存器源程序如下:锁存器源程序如下:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164
20、.ALL; ENTITY latch8 ISPORT(clr,clk,ena,oe:IN STD_LOGIC; d:IN STD_LOGIC_VECTOR(7 DOWNTO 0); q:BUFFER STD_LOGIC_VECTOR(7 DOWNTO 0);END latch8;ARCHITECTURE one OF latch8 ISSIGNAL q_temp:STD_LOGIC_VECTOR(7 DOWNTO 0); BEGIN 38u1:PROCESS(clk,clr,ena,oe) BEGINIF clr=0 THEN q_temp = 00000000; ELSIF clkEVENT
21、 AND clk=1 THENIF (ena=1) THEN q_temp = d;END IF; END IF; IF oe=1 THEN q = ZZZZZZZZ; ELSE q = q_temp; END IF; END PROCESS u1;END one; 39用用Verilog HDL描述三态输出描述三态输出8D锁存器的源程序如下:锁存器的源程序如下:module latch8v(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
22、 clk)beginif (clr)q_temp = 0;else if (ena) q_temp = d;else q_temp = q; if (oe) q = 8bzzzzzzzz; else q = q_temp; endendmodule 407.2.3 8位双向移位寄存器设计位双向移位寄存器设计 8位位双双向向移移位位寄寄存存器器电电路路的的元元件件符符号号如如图图7.18所所示示,其其中中CLR是是复复位位控控制制输输入入端端;LOD是是预预置置控控制制输输入入端端;S是是移移位位方方向向控控制制输输入入端端,当当S=1时时,是是右右移移移移位位寄寄存存器器,S=0时时,是是左左
23、移移移移位位寄寄存存器器;DIR是是右右移移串串入入输输入入信信号号;DIL是是左左移移串串入入输输入信号。入信号。 8位双向移位寄存器元件符号位双向移位寄存器元件符号41用用VHDL描述的描述的8位双向移位寄存器源程序如下:位双向移位寄存器源程序如下:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL; ENTITY rlshift ISPORT(clr,lod,clk,s,dir,dil:IN BIT; d:IN BIT_VECTOR(7 DOWNTO 0); q:BUFFER BIT_VECTOR(7 DOWNTO 0);END rlshift;ARCHIT
24、ECTURE one OF rlshift IS SIGNAL q_temp:BIT_VECTOR(7 DOWNTO 0); BEGIN PROCESS(clr,clk,lod,s,dir,dil) BEGIN42IF clr=0 THEN q_temp = 00000000;ELSIF clkEVENT AND clk=1 THENIF (lod=1) THENq_temp = d; ELSIF (S=1) THEN FOR i IN 7 downto 1 LOOP -实现右移操作实现右移操作 q_temp(i-1) = q(i);END LOOP ;q_temp(7) = dir;ELSE
25、 43FOR i IN 0 TO 6 LOOP -实现左移操作实现左移操作 q_temp(i+1) = q(i);END LOOP ;q_temp(0) = dil;END IF; END IF;q 1;-实现右移操作实现右移操作 q7 = dir; end45else begin q = q 1;-实现左移操作实现左移操作 q0 = dil; end endendmodule 467.2.4 8位二进制加减计数器设计位二进制加减计数器设计1. 设计原理设计原理 8位二进制加减计数器的元件符号如图位二进制加减计数器的元件符号如图7.20所示,所示,CLR是复是复位控制输入端;位控制输入端;EN
26、A是使能控制输入端;是使能控制输入端;LOAD是预置控制输是预置控制输入端;入端;D7.0是是8位并行数据输入端;位并行数据输入端;UPDOWN是加减控制是加减控制输入端,当输入端,当UPDOWN=0时,计数器作加法操作,时,计数器作加法操作,UPDOWN=1时,计数器作减法操作;时,计数器作减法操作;COUT是进是进/借位输出端。借位输出端。 8位二进制加减计数器元件符号位二进制加减计数器元件符号472. 基于基于VHDL的的8位二进制加减计数器设计位二进制加减计数器设计用用VHDL描述的描述的8位二进制加减计数器源程序如下:位二进制加减计数器源程序如下:LIBRARY IEEE;USE I
27、EEE.STD_LOGIC_1164.ALL;ENTITY updowncnt8 ISPORT(clr,clk,ena,load,updown:IN STD_LOGIC; d:IN INTEGER RANGE 0 TO 255;cout:OUT STD_LOGIC;q:BUFFER INTEGER RANGE 0 TO 255);END updowncnt8;ARCHITECTURE one OF updowncnt8 ISBEGIN PROCESS(clk,ena,clr,d,load,updown)48BEGIN IF CLR=0 THENq = 0; ELSIF clkEVENT AND
28、 clk=1 THENIF load = 1 THEN q = d;ELSIF ena=1 THENIF updown = 0 THEN q = q+1;IF q = 255 THEN COUT = 1; END IF;ELSE q = q-1;IF q = 0 THEN COUT = 0; END IF;END IF; END IF; END IF; END PROCESS;END one;493. 基于基于Verilog VHDL的的8位二进制加减计数器设计位二进制加减计数器设计用用Verilog HDL描述描述8位二进制加减计数器的源程序如下:位二进制加减计数器的源程序如下:module
29、 pdowncnt8(q,cout,d,load,ena,clk,clr,updown); input 7:0 d; input load,ena,clk,clr,updown; output 7:0 q; output cout; reg 7:0 q;always (posedge clk)begin if (clr)q = b00000000; else if (load)q = d;50else if (ena)if (updown) q = q+1; else q = q-1; end assign cout = (updown) ? &q:|q;endmodule 图7.20 8位二
30、进制加减计数器的仿真波形517 本章小结本章小结 硬件描述语言HDL是EDA技术中的重要组成部分,而VHDL和Verilog HDL是当前最流行的并成为IEEE标准的硬件描述语言,它们均可实现各种各样的数字系统设计。本章列举了大量使用HDL(VHDL和Verilog HDL)实现的数字逻辑电路设计实例,包括组合逻辑、时序逻辑和一些复杂系统电路的设计。 使用HDL设计复杂系统电路时,一般采用“自顶向下”(Top-Down)或“白底向上”(Bottom-Up)方法来实现。用HDL设计复杂系统电路时,往往有不直观的感觉,结合EDA工具的原理图输入设计法,可以克服这个缺点。VHDL是目前标准化程度最高
31、的硬件描述语言,具有严格的数据类型。因此,任用VHDL设计复杂系统电路时,应当考虑各底层电路接口之间的数据类型是否一致,否则很容易出现数据类型不匹配的错误。 Verilog HDL是在C语言的基础上演化而来的,具有程序结构简单容易掌握的特点。而且可综合的Verilog HDL数据类型只有二进制一种(可以用十进制、八进制和十八进制表示),完全符合数字电路的特点。因此,在用Verilog HDL设计复杂系统电路时,不容易出现数据类型不匹配的错误。527 思考题和习题思考题和习题 7.1设计含有异步清零和计算使能的16位二进制减法计算器。 7.2设计序列信号检测器,当检测到一组或多组由二进制码组成的
32、脉冲序列信号时,如果这组码与检测器预先设置的码相同则输出1,否则输出0。 7.3设计一个100天的倒计时器。 7.4设计一个同步FIFO。 7.5设计一个异步FIFO。 提示:设计该题目时,要充分考虑到异步电路设计有可能带来的危害性,以及异步多比特比较时的不稳定性。所以该题目应该用格雷码计数和比较(因为相临格雷码之间只有1比特不同)。 该题目外部接口包括:两个毫无关系的时钟(一个写时钟和一个读时钟),数据输入/输出口,以及写控制信号和读控制信号、空标志、满标志。537 思考题和习题思考题和习题 7.6设计一个加法器阵列,完成下列复数运算功能,其中R为数据的实部,I为数据的虚部。 Ra=(Ra+
33、Rc)+(Rb+Rd) Ia=(Ia+Ic)+(Ib+Id) Rc=(Ra+Rc)-(Rb+Rd) Ic=(Ia+Ic)-(Ib+Id) Rb=(Ra-Rc)+(Ib-Id) Ib=(Ia-Ic)-(Rb-Rd) Rd=(Ra-Rc)-(Ib-Id) Id=(Ia-Ic)+(Rb-Rd) 加法器阵列功能框图如图7.35所示。 其中,输入信号Ra,Rb,Rc,Rd是输入数实部,Ia,Ib,Ic,Id是虚部,数据宽度均为19位;每次向加法器阵列只能送一个操作数,包括实数R(19bit)、虚部I(19bit);操作数以a、b、c、d的顺序连续送入,在加法器阵列中要进行串/并变换。CP是时钟信号。输出
34、信号Ra,Rb,Rc,Rd是输出数实部,Ia,Ib,Ic,Id是虚部,数据宽度均为21位。 要求加法器采用快速进位链(Look Ahead);在加法器阵列中加入流水线结构(Pipeline),每一拍完成一个加法,输入连续送数,输出连续结果;逻辑要求最简化。图7.357.35加法器加法器阵列功能框列功能框图547 思考题和习题思考题和习题 7.7设计一个异步乒乓(ping-pong)FIFO。乒乓FIFO是由两个FIFO构成的,当其中一个在读时,不能够对其写;当其中一个在写时不能够对其读,也就是在一个FIFO中,读写不能够同时进行。提示:采用这样的方式,可以避免异步引起误操作,由此这里就不需要格
35、雷码。电路需要读、写两个时钟,输入、输出数据通道,读、写控制信号,读允许信号,写允许信号等。 7.8设计m序列信号发生器。m序列具有类似于随机噪声的一些统计特性,同时又便于重复产生和处理。在通信系统中,测量误码率时最理想的信源是m序列。如果m序列经过发送设备、信道和接收设备后仍为原序列,则说明传输是无误的;如果有错误,则需要进行统计。在接收设备的末端,由同步信号控制,产生一个与发送端相同的本地m序列。将本地m序列与接收端解调出的m序列逐位进行模2加运算,一旦有错,就会出现“1”码,用计数器计数,便可统计错误码元的个数及比率。发送端m序列发生器及接收端的统计部分组成的成套设备被称为误码测试仪。5
36、57 思考题和习题思考题和习题 7.9设计汉明码编译码器。在随机信道中,错码的出现是随机的,且错码之间是统计独立的,高斯白噪声引起的错码就具有这种性质。由于信息码元序列是一种随机序列,接收端是无法预知的,也无法识别其中有无错码。为了解决这个问题,可以由发送端的信道编码器在信息码元序列中增加一些监督码元。这些监督码元和信码之间有一定的关系,使接收端可以利用这种关系由信道译码器来发现或纠正可能存在的错码。在信息码元序列中加入监督码元就称为差错控制编码或称为纠错编码。不同的编码方法,有不同的检错能力或纠错能力,有的编码只能检错,不能纠错。 汉明码编译码采用前向纠错方式,这种方式在发送端发送纠错码,接收端在收到的码组中不仅能发现错码,而且还能够确定错码的准确位置,并纠正错码。这种方式的优点是不需要反向信道(传送重发指令),也不存在由于反复重发所造成的时延,实时性好,适用于实时通信系统,如语音通信等。由于发生一位错的概率相对最高并且由于它的编译码简单,故在数据通信和计算机存储系统中得到广泛应用,如在蓝牙技术和硬盘阵列中都会用到汉明码。5657再见!再见!58