




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第四章 常用基本器件设计4.1 寄存器设计4.2移位运算器设计4.3 加减法运算器设计4.4 乘法器设计4.5 同步计数器设计4.6 节拍器设计4.7 译码器设计4.8 标志线设计4.9 存储器设计 本章通过对寄存器、移位运算器、加减运算器等常用基本器件的原理、设计方法的学习,让读者学会使用Quartus II 8.0集成环境对VHDL语言及图形文件进行编辑、编译、仿真,掌握VHDL语言设计的方法。4.1 寄存器设计 寄存器是计算机器件中应用的重要器件,是理解存储原理的大门,本节首先介绍寄存器的设计。4.1.1 寄存器原理图设计 寄存器的结构相对简单,它主要由触发器、与门、或门、输入及输出端构
2、成(见图4.1)。 寄存器一般有3个或4个输入控制端,多位输入总线和同样位数的输出总线。图中的输入线cclr,如果输出有控制的话,那么还要增加一条输出控制(使能)线(这条线在图中没有)。输入的数据总线是d7.0,这是指共有8条线数据线。dout7.0标注输出也有8条线数据线。在原理图中标明线的条数是放在方括号当中,数字之间用两个点表示,这一点与用语言描述不同,硬件描述语言是用冒号来进行分隔的。图4.1 寄存器原理图4.1.2 寄存器工作原理 边沿触发器DFF只能在两个时钟节拍之间保持数据不变,置位端PRN和复位端CLRN瞬间低电位有效,它们DFF赋值不受时钟信号clk的影响,这是边沿触发器的特
3、点。图4.1的寄存器工作过程表述如下。 (1)当控制线rL=1时,外部数据d7.0可以通过与门inst21,而通过非门与rL连接的另一条线接在inst22的输入端,使inst22的输出总线为0,通过或门inst19到达触发器DFF的数据线就是d7.0(2)DFF是clk信号的上升沿边沿触发器,在clk上升沿没有到达之前,数据不能进入DFF,因而输出端dout7.0的值保持原值不变。(3)当clk=1的前沿到来时,数据d7.0进入DFF,从这时开始,输出端dout7.0的值与d7.0相同。(4)如果在d7.0的值改变之前使rL=0,那么到达DFF输入端的数据将是dout7.0,因而当clk=1上
4、升沿到来时,进入DFF触发器的是dout7.0,也就是数据的原来值。(5)瞬间cclr=1会使触发器DFF复位,值为0,致使dout7.0=0;这个寄存器的输出端没有控制门,触发器DFF的值是直接输出的,如果将寄存器输出端连入公共线路,那么必须要加控制输出电路,而它的输入线d7.0连接到公共线路不受限制。4.1.3 寄存器原程序描述 用原理图进行多位寄存器的设计很容易帮助我们理解,但在某些时候用硬件描述语言VHDL会很方便。寄存器的VHDL程序代码如下:/下面是端口说明:ENTITY jcp IS PORT ( rL : IN bit; /输入控制 clk : IN bit; /时钟 cclr
5、 : IN bit; /复位端 d : IN bit_vector(15 DOWNTO 0); /数据输入 dout : OUT bit_vector(15 DOWNTO 0); /数据输出END jcp;ARCHITECTURE BHEV OF jcp IS/下面定义中间使用变量: SIGNAL w_0 : bit_vector(15 DOWNTO 0); SIGNAL w_1 : bit_vector(15 DOWNTO 0); SIGNAL w_2 : bit_vector(15 DOWNTO 0); SIGNAL w_3 : bit; SIGNAL w_dff : bit_vector
6、(15 DOWNTO 0); SIGNAL dout_xhdl1: bit_vector(15 DOWNTO 0); /进行连接描述和行为描述BEGIN dout = dout_xhdl1; dout_xhdl1 = w_dff ; w_2 = w_0 OR w_1 ;PROCESS BEGIN WAIT UNTIL (clkEVENT AND clk = 1) OR (cclrEVENT AND cclr = 0); IF (NOT cclr = 1) THEN w_dff 0); w_dff = 0000000000000000; ELSE w_dff = w_2; END IF; END
7、 PROCESS; w_0 = d AND rL; w_1 = w_3 AND w_dff ; w_3 = NOT rL ;END BHEV;4.1.4 寄存器仿真 利用Quartus 的波形文件进行时序仿真,可以直接检验寄存器设计。一般来说,数据位数较多的设备要比位数较少的设备,从输入到输出的延时要长,为了较好地说明对工作时钟频率的把握,仿真是针对16位寄存器进行的。图4.2是时钟周期为50ns的波形时序仿真,可以看到当rL=1时,从时钟上升沿获得数据h0003到达输出端dout输出h0003的时间将近7ns,没有超过10ns。dout的输出至少保持10ns,因而在下一个时钟节拍的上升沿可以
8、正确地获得输出结果。可以想到如果要在第一个时钟上升沿后的7ns之内读取dout的值,那一定不是正确的。图4.2 时钟周期为50ns的时序仿真4.2 移位运算器设计 运算器是计算机中执行各种算术和逻辑运算操作的部件。运算器的基本操作包括加、减、乘、除四则运算,与、或、非、异或等逻辑操作,以及移位、比较和传送等操作,亦称算术逻辑部件(ALU)。本节就移位运算器的FPGA设计做详细说明。4.2.1 移位运算器原理图设计 左移位寄存器和右移寄存器组织到一起就是移位运算器。移位运算器画图比较麻烦,用VHDL描述却非常简单。移位运算器原理如图4.3所示。图4.3 移位运算器原理图设计4.2.2 移位运算器
9、程序描述ENTITY yiwei IS PORT ( clk : IN bit; clr : IN bit; yy : IN bit; zy : IN bit; L : IN bit; d : IN bit_vector(7 DOWNTO 0); zybzhi : OUT bit; yybzhi : OUT bit; q : OUT bit_vector(7 DOWNTO 0); END yiwei;ARCHITECTURE BHEV OF yiwei ISCOMPONENT reg8 PORT ( clk,L,clr : IN STD_LOGIC; data : IN STD_LOGIC_V
10、ECTOR(7 DOWNTO 0); q: OUT STD_LOGIC_VECTOR(7 DOWNTO 0);END COMPONENT;COMPONENT r PORT ( clk,rL,cclr : IN STD_LOGIC; d : IN STD_LOGIC_VECTOR(7 DOWNTO 0); dout: OUT STD_LOGIC_VECTOR(7 DOWNTO 0);END COMPONENT; SIGNAL data : bit_vector(7 DOWNTO 0); SIGNAL LL : bit; SIGNAL q_v : bit_vector(7 DOWNTO 0); S
11、IGNAL yybz : bit; SIGNAL zybz : bit; SIGNAL W_0 : bit; SIGNAL W_1 : bit; SIGNAL temp_xhdl4 : bit_vector(7 DOWNTO 1); SIGNAL temp_xhdl5 : bit_vector(6 DOWNTO 0); SIGNAL temp_xhdl6 : bit_vector(7 DOWNTO 0); SIGNAL temp_xhdl7 : bit; SIGNAL temp_xhdl8 : bit; SIGNAL zybzhi_xhdl1 : bit; SIGNAL yybzhi_xhdl
12、2 : bit; SIGNAL q_xhdl3 : bit_vector(7 DOWNTO 0); BEGIN zybzhi = zybzhi_xhdl1; yybzhi = yybzhi_xhdl2; q = q_xhdl3; W_0 = 0 ; W_1 = 0 ;LL = L OR yy OR zy ; temp_xhdl4 = q_v(7 DOWNTO 1) WHEN yy = 1 ELSE ZZZZZZZ; dat temp_xhdl5 = q_v(6 DOWNTO 0) WHEN zy = 1 ELSE ZZZZZZZ; data(7 DOWNTO 1) = temp_xhdl5 ;
13、 temp_xhdl6 = d(7 DOWNTO 0) WHEN L = 1 ELSE ZZZZZZZZ; data(7 DOWNTO 0) = temp_xhdl6 ; temp_xhdl7 = W_0 WHEN yy = 1 ELSE Z;data(7) = temp_xhdl7 ; temp_xhdl8 = W_1 WHEN zy = 1 ELSE Z; data(0) = temp_xhdl8 ;a(6 DOWNTO 0) = temp_xhdl4 ; zybzhi_xhdl1 = zybz ; yybzhi_xhdl2 = yybz ; q_xhdl3 clk,L=LL,clr=cl
14、r,data=data,q=q_v);U2 : r PORT MAP(clk=clk,.rL=LL,.d=q_v7,cclr=clr,dout=zybz);U3 : r PORT MAP(clk=clk,.rL=LL,.d=q_v0,cclr=clr,dout=yybz);END BHEV;4.2.3 移位运算器仿真 移位运算器的仿真结果如图4.4所示。图4.4 移位运算器仿真4.3 加减法运算器设计 利用补码制可以将加减法运算器组织在一个电路中。加减法运算器是计算机进行算术运算的基础设备,由加减法运算器的基本单元可以构造出乘除法运算器等。4.3.1 加减法单元原理图设计 加减法单元是在全加器
15、的b输入端连接上反向可控制器组成的(见图4.5)。 sub=1时进入全加器的是b的反码,否则是b的值直接进入全加器。图4.5 加减法单元4.3.2 加减单元编码 加减单元的电路简单,对照图4.5很容易得到下面的VHDL程序代码。ENTITY tfa IS PORT ( a : IN bit; /被加数 sub : IN bit; /取反控制 b : IN bit; /加数 cin : IN bit; /低进位 cout : OUT bit; /高进位 s : OUT bit); /本位和 END tfa;ARCHITECTURE BHEV OF tfa IS/工作变量设置: SIGNAL w_
16、7 : bit; SIGNAL w_2 : bit; SIGNAL w_3 : bit; SIGNAL w_4 : bit; SIGNAL w_5 : bit; SIGNAL cout_xhdl1 : bit; SIGNAL s_xhdl2 : bit; /逻辑连接:BEGIN cout = cout_xhdl1; s = s_xhdl2; w_4 = cin AND a ; w_2 = cin AND w_7 ; w_7 = sub XOR b ; w_3 = w_7 AND a ; cout_xhdl1 = w_2 OR w_3 OR w_4 ; s_xhdl2 = cin XOR w_5
17、 ; w_5 = w_7 XOR 10 ;END BHEV;4.3.3 多位加减法单元连接 组成多位的加减法运算器需要将多个加减单元的进位首尾连接起来。这种连接可以展开来画出原理图(见图4.6),也可以用Quartus 的多元素画法,减少图形的面积(见图4.7)。图4.6 展开绘制的4位加减单元的连接 展开画原理图虽然结构清晰,然而位数很多的时候画起来很麻烦。图3.7的多元结构画法非常节约面积。在这种多元画法中,高低位进位线的连接不能够直接标注出来,因而用缓冲元件carry放在中间,这样编译时可以通过。图4.7 多位加减单元的连接 图4.7最大的好处是位数可以任意,需要不同位数的连接时,只要将
18、多位的引脚和线路的标注修改一下就可以,而展开的画法却要一个一个地连接,十分繁琐。4.3.4 加减法运算器原理图设计 加减法运算器的原理图设计如图4.8所示,这是一个16位的加减法运算器。在16位加减单元连接的基础上,增加了一个一位进位寄存器r,还增加了一些逻辑门,并将输入输出线像图中那样连接好。 由于加减单元可以求反码,利用最低进位的输入端可以控制是否加1,这样就不难实现不带进位的加减法和带进位的加减法运算。 首先考虑用cry输入信号控制是否进行的是带进位的加减法运算。当cry=1时,寄存器r中的前次运算的进位就通过与门inst11、或门inst12连接到最低进位端,这样就可以将前次运算得到的
19、进位加到本次运算之中。因为减法的运算完全是用加法运算完成的,因而减法的借位问题完全用加法解决了。ones输入端是为决定是否加1而设置的控制端,由于sub=1时,b取反,再令ones=1才能够实现“求反加1”的运算,实现减法。但在进位加减法中,除了首次加法之外,都不需要在加1,因此需要cin=0,这时可以设定ones=0。只有做减法时才需要ones=1,用与门inst10可以避免错误发生。cclr=1清除进位。 图4.8下面的Overflow标志线只有在同符号两数相加时出现变号时为1,以便标注出溢出。图4.8 加减法运算器4.3.5 加减法运算器程序描述加减法运算器程序描述如下:ENTITY j
20、iajian IS PORT ( sub : IN bit; /减控制 clk : IN bit; /时钟 rL : IN bit; /进位保存 ones : IN bit; /1cry : IN bit; /带进位控制 cclr : IN bit; /清进位 a : IN bit_vector(7 DOWNTO 0); /被加数 b : IN bit_vector(7 DOWNTO 0); /加数 overflow : OUT bit; /溢出标志 cnz : OUT bit; /进位标志 s : OUT bit_vector(7 DOWNTO 0); /和或差END jiajian;ARC
21、HITECTURE BHEV OF jiajian IS/中间变量 SIGNAL ww : bit_vector(7 DOWNTO 0); SIGNAL w_0,w_1,w_2,w_3,w_4,w_5,w_6 : bit; SIGNAL w_16,w_8,w_10,w_11,w_12,w_13 : bit; SIGNAL w_14,w_15,overflow_xhdl1,cnz_xhdl2 : bit; SIGNAL s_xhdl3 : bit_vector(7 DOWNTO 0); /连接和逻辑BEGIN overflow = overflow_xhdl1; cnz = cnz_xhdl2;
22、 s = s_xhdl3; cnz_xhdl2 sub,cin = w_0,a = a,b = b,cout = w_1,s = ww); U2 : r PORT MAP (clk = clk,rL = rL,d = w_1,cclr = w_2,dout = w_5); w_8 = NOT a(8 - 1) ; w_10 = NOT b(8 - 1) ; w_0 = w_3 OR w_4 ; w_3 = cry AND w_5 ; w_16 = NOT sub ; w_4 = sub AND ones ; w_2 = NOT cclr ;w_13 = (w_6 AND w_16) AND a
23、(8 - 1) AND b(8 - 1) ; w_12 = (ww(8 - 1) AND w_8) AND w_16) AND w_10 ; w_14 = ww(8 - 1) XOR a(8 - 1) ; overflow_xhdl1 = w_11 OR w_12 OR w_13 ; w_15 = a(8 - 1) XOR b(8 - 1) ; w_11 = (w_14 AND w_15) AND sub ; w_6 = NOT ww(8 - 1) ; s_xhdl3 = ww ;END BHEV;/ nfa模块代码ENTITY nfa IS PORT ( sub : IN bit; /取反控
24、制端 cin : IN bit; /最低进位 a : IN bit_vector(7 DOWNTO 0); /被加数 b : IN bit_vector(7 DOWNTO 0); /加数 cout : OUT bit; /最高进位 s : OUT bit_vector(7 DOWNTO 0); /和或差 END nfa;ARCHITECTURE BHEV OF nfa IS/内部变量: SIGNAL c_in,c_out : bit_vector(7 DOWNTO 0); SIGNAL w7,w2,w3,w4,w5 : bit_vector(7 DOWNTO 0); SIGNAL cout_x
25、hdl1 : bit; SIGNAL s_xhdl2 : bit_vector(7 DOWNTO 0); /逻辑连接: BEGIN cout = cout_xhdl1; s = s_xhdl2; w4 = c_in AND a ; w2 = c_in AND w7 ;w7 = b XOR sub ; w3 = w7 AND a ; c_out = w2 OR w3 OR w4 ; s_xhdl2 = c_in XOR w5 ; w5 = w7 XOR a ; c_in(0) = cin ; c_in(7 DOWNTO 1) = c_out(6 DOWNTO 0) ; cout_xhdl1 =
26、c_out(7) ;END BHEV;/ r模块代码ENTITY r IS PORT ( rL : IN bit; /输入控制 clk : IN bit; /时钟 cclr : IN bit; /复位端 d : IN bit_vector(7 DOWNTO 0); /数据输入 dout : OUT bit_vector(7 DOWNTO 0); /数据输出 END r;ARCHITECTURE BHEV OF r IS/下面定义中间使用变量: SIGNAL w_0 : bit_vector(7 DOWNTO 0); SIGNAL w_1 : bit_vector(7 DOWNTO 0); SI
27、GNAL w_2 : bit_vector(7 DOWNTO 0); SIGNAL w_3 : bit; SIGNAL w_dff : bit_vector(7 DOWNTO 0); SIGNAL dout_xhdl1 : bit_vector(7 DOWNTO 0); /进行连接描述和行为描述BEGIN dout = dout_xhdl1; dout_xhdl1 = w_dff ; w_2 = w_0 OR w_1 ;PROCESS BEGIN WAIT UNTIL (clkEVENT AND clk = 1) OR (cclrEVENT AND cclr = 0); IF (NOT ccl
28、r = 1) THEN w_dff 0); w_dff = 00000000; ELSE w_dff = w_2; END IF; END PROCESS; w_0 = d AND rL; w_1 = w_3 AND w_dff ; w_3 = NOT rL ;END BHEV;4.3.6 加减法运算器仿真 加减法运算器的时序仿真如图4.9所示。图4.9 加减法运算器仿真 从图4.9可以看到设定条件rL=1,可以见到全程是否有进位。进位标志cnz在图中有两处反映出运算产生了进位,一处是减法运算产生的,一处是右面的加法。进位标志是进位寄存器的输出,受时钟控制,因而进位标志产生于时钟上升沿之后。由
29、于运算电路不受时钟控制,因而运算结果会在时钟上升沿之前就可以得到。 有3处加法运算产生溢出,这是:h64+h1Eh82h6E+h21h8Fh78+h24h9C 有人错误地认为溢出时一定有进位,从这3例和仿真图可以看到这种认识是不对的。4.4 乘法器设计 利用加减法运算器的功能,通过软件的方法就可以实现数的乘法或除法运算,但软件的方法太慢,要获得高速度的执行效果,最好的办法就是用硬件电路来实现。4.4.1 乘法阵列原理图设计 乘法阵列运算器的设计来源于手算乘法,由乘数的低位向高位逐一乘以被乘数,将所得积加入到和数当中,最终的和数就是所求。二进制数乘法有特殊性,部分积不是被乘数就是零,这是由当前相
30、乘的乘数数码决定的。将乘数位与被乘数作运算,就得到了一位乘积,再用加法运算器求和,得到移位的加法运算器组成阵列。图4.10是详细的4位乘法阵列运算器原理图。图4.10 乘法阵列的原理图 这个原理图与手算的乘法形式完全一致,这种乘法阵列自动扩充了位数,因而不会产生溢出。需要说明的是,这个乘法阵列只能实现无符号数的乘法,对有符号数的乘法还要增加相应的逻辑电路。 原理图方式设计的时序仿真图如图4.11所示,mg是乘积的高8位,ms是乘积的低8位。图4.11 乘法原理图时序仿真4.4.2 乘法阵列编码 乘法阵列的设计也分为行乘加器件的编码和乘法阵列编码。1行乘加器件 行乘加器件的编码与原理图设计的不同
31、是取消了缓冲器件carry,采用直接连接的方法:c_in 7:1 =c_out6:0;来实现不同序号的线路连接,这样电路的性能会得到提高。ENTITY chengfa IS PORT ( x : IN bit_vector(7 DOWNTO 0); a : IN bit_vector(7 DOWNTO 0); b : IN bit; s : OUT bit_vector(7 DOWNTO 0); cout : OUT bit); END chengfa;ARCHITECTURE BHEV OF chengfa IS SIGNAL c_in : bit_vector(7 DOWNTO 0); S
32、IGNAL c_out : bit_vector(7 DOWNTO 0); SIGNAL w_7 : bit_vector(7 DOWNTO 0); SIGNAL w_2 : bit_vector(7 DOWNTO 0); SIGNAL w_3 : bit_vector(7 DOWNTO 0); SIGNAL w_4 : bit_vector(7 DOWNTO 0); SIGNAL w_5 : bit_vector(7 DOWNTO 0); SIGNAL cout_xhdl1 : bit; SIGNAL s_xhdl2 : bit_vector(7 DOWNTO 0);BEGIN cout =
33、 cout_xhdl1;s = s_xhdl2; w_4 = c_in AND x ; w_2 = c_in AND w_7 ; c_in(7 DOWNTO 1) = c_out(6 DOWNTO 0) ; w_3 = w_7 AND x ; c_out = w_2 OR w_3 OR w_4 ; s_xhdl2 = c_in XOR w_5 ; w_5 = w_7 XOR x ; w_7 = a AND b & b & b & b & b & b & b & b ; cout_xhdl1 = c_out(7) ; c_in(0) = 0 ;END BHEV;2乘法阵列 乘法阵列的编码也将ca
34、rry元件换成直接连接,这样连接的好处可以在乘法阵列的时序仿真中有所表现。ENTITY chengfa IS PORT ( x : IN bit_vector(7 DOWNTO 0); a : IN bit_vector(7 DOWNTO 0); b : IN bit; s : OUT bit_vector(7 DOWNTO 0); cout : OUT bit); END chengfa;ARCHITECTURE BHEV OF chengfa IS SIGNAL c_in : bit_vector(7 DOWNTO 0); SIGNAL c_out : bit_vector(7 DOWNT
35、O 0); SIGNAL w_7 : bit_vector(7 DOWNTO 0); SIGNAL w_2 : bit_vector(7 DOWNTO 0); SIGNAL w_3 : bit_vector(7 DOWNTO 0); SIGNAL w_4 : bit_vector(7 DOWNTO 0); SIGNAL w_5 : bit_vector(7 DOWNTO 0); SIGNAL cout_xhdl1 : bit; SIGNAL s_xhdl2 : bit_vector(7 DOWNTO 0); BEGIN cout = cout_xhdl1; s = s_xhdl2; w_4 =
36、 c_in AND x ; w_2 = c_in AND w_7 ; c_in(7 DOWNTO 1) = c_out(6 DOWNTO 0) ; w_3 = w_7 AND x ; c_out = w_2 OR w_3 OR w_4 ; s_xhdl2 = c_in XOR w_5 ; w_5 = w_7 XOR x ; w_7 = a AND b & b & b & b & b & b & b & b ; cout_xhdl1 = c_out(7) ; c_in(0) = 0 ;END BHEV;4.4.3 有符号数乘法运算器 乘法阵列实际就是一个无符号数的乘法运算器,根据限位数的有符号表
37、示法,那么8位二进制数的表示范围是-128,127的整数。乘法的运算法则是两数绝对值相乘,且同号两数相乘结果为正,异号两数相乘,结果为负。依据这个法则,可以先取绝对值,作绝对值的乘法,然后再确定符号。1求绝对值电路 求绝对值电路如图4.12所示。如果输入数据b7.0是负数,那么最高位b7=1,电路会进行“求反加1”运算,所以s7.0就是b7.0的绝对值;如果b7=0,那么电路执行的是b+0运算,结果s7.0也是b7.0的绝对值 。图4.12 求绝对值电路求绝对值电路的VHDL描述如下: ENTITY juedui IS PORT ( b : IN bit_vector(7 DOWNTO 0);
38、 s : OUT bit_vector(7 DOWNTO 0); END juedui;ARCHITECTURE BHEV OF juedui ISCOMPONENT nfa PORT ( cin : IN bit; sub : IN bit; a : IN bit; b : IN bit_vector(8 - 1 DOWNTO 0); s : OUT bit_vector(8 - 1 DOWNTO 0);END COMPONENT;SIGNAL w_0 : bit_vector(0 TO 7); SIGNAL s_xhdl1 : bit_vector(7 DOWNTO 0); BEGIN s
39、 = s_xhdl1; w_0 b(7), sub = b(7), a = w_0, b = b, s = s_xhdl1); END BHEV;求绝对值电路就是求补码的电路,求补码电路用的地方很多。2积的符号处理 8位数的区间-128,127的整数乘法的结果,可以用数据最高位的异或输出来控制16位的求补码电路。求补码的电路对8b10000000的求补结果仍然是自身,虽然规定这是一个负数,然而并不影响乘法的正确计算。乘积的符号处理如图4.13所示。图4.14 乘积的符号处理有符号乘法运算器的程序描述如下:ENTITY duicheng IS PORT ( a : IN bit_vector(7
40、 DOWNTO 0); b : IN bit_vector(7 DOWNTO 0); s : OUT bit_vector(15 DOWNTO 0); END duicheng;ARCHITECTURE BHEV OF duicheng IS COMPONENT juedui PORT ( b : IN bit_vector(7 DOWNTO 0); s : OUT bit_vector(7 DOWNTO 0); END COMPONENT;COMPONENT chfg a : IN bit_vector(7 DOWNTO 0); b : IN bit_vector(7 DOWNTO 0);
41、mg : OUT bit_vector(7 DOWNTO 0); ms : OUT bit_vector(7 DOWNTO 0); END COMPONENT; COMPONENT juedui_16 a : IN bit_vector(7 DOWNTO 0); b : IN bit_vector(7 DOWNTO 0); d : IN bit; s : OUT bit_vector(15 DOWNTO 0); END COMPONENT SIGNAL d : bit_vector(15 DOWNTO 0); SIGNAL w_0 : bit_vector(7 DOWNTO 0); SIGNA
42、L w_1 : bit_vector(7 DOWNTO 0); SIGNAL s_xhdl1 bit_vector(15 DOWNTO 0); BEGIN s w_0, b = w_1, mg = d(15 DOWNTO 8), ms = d(7 DOWNTO 0); v_inst1 : juedui PORT MAP (b = a, s = w_0); v_inst2 : juedui PORT MAP (b = b, s = w_1); v_inst3 : juedui_16 PORT MAP (a = a(7), b = b(7), d = d, s = s_xhdl1); END BH
43、EV; 有符号乘法运算器的时序仿真如图4.15所示,从仿真图上虽然见到积的稳定输出都要经过一定的延迟时间,然而结果却十分稳定,采用时钟前沿很容易采集相应的数据。可以见到结果是正确的,乘法阵列运算是无符号的一种运算形式。图4.15 有符号乘法仿真4.5 同步计数器设计 用JK触发器可以构造异步计数器,但这种计数器不能应用在过程极短的计数设计问题中,因为由JK触发器构造的计数器,n位数的变化常需要n个时钟节拍才能完成。这样,需要在一个节拍内完成计数的问题,必须另外寻求解决办法。4.5.1 设备同步工作 如果设备器件的输入到输出的变化可以在一个时钟周期内完成,那么就可以说这个器件工作是时钟周期内完成
44、的,如果设备的所有器件都是同一个时钟周期内完成的,则称这个设备是同步工作的。设备传输信息的过程是需要时间的,如果在限定的时间内,开始输入端进入设备的信息,在输出端得不到设备的一些正确结果,这是电路设计所不允许的。由于器件的物理特性的改变,会使数据通过器件的延时发生变化,同样的器件在90ns、65ns和40ns的设计工艺中,所产生的延时肯定不同。 同步设计的设备的工作周期取决于其中延时最长的器件,如果某个器件的延时超过了多数器件很多,那么可以考虑让它工作在其他器件的倍数周期上,这样才不会影响整个设备工作的同步性。4.5.2 程序计数器 将图4.8的多位加减法器的b输入端和减控制端sub保持为0,
45、就得到一个进行加1的计算器。加1的计算器如果将运算的结果保存到一个寄存器中,加1运算时先将寄存器内容送到a端,这样就可以完成不断加1的工作。程序计数器就是这样一个能够加1,而且在需要时能够输入数的设备。 图4.16是程序计数器的原理图设计,L控制外部数据d7.0的输入,inc是加1控制端,只要inc=1,每当clk=1时,就会将寄存器reg8的值加1,然后再保存到reg8当中。图4.16 程序计数器 三态门inst9控制着外部数据进入寄存器reg8,而inst8,inst7配合着决定寄存器reg8的数据是否要反馈到加运算的输入端。当L=1时,通过非门的作用,inst8、inst7两个三态门都是
46、高阻状态,而inst9断开,inst8、inst7两个三态门接通,于是reg8的数据立即传到nfa的a7.0端,如果inc=1,那么就会将值加1,在clk前沿进入寄存器保存起来,如果inc=0,在clk前沿到来时保存的仍然是寄存器的原值。 程序计数器的VHDL描述如下。ENTITY chxjshq IS PORT ( inc : IN bit; L : IN bit; clr : IN bit; clk : IN bit; d : IN bit_vector(7 DOWNTO 0); o : IN bit_vector(7 DOWNTO 0); END chxjshq;ARCHITECTURE
47、 BHEV OF chxjshq IS COMPONENT nfa PORT ( sub : IN bit; cin : IN bit; a : IN bit_vector(8 - 1 DOWNTO 0); b : IN bit_vector(8 - 1 DOWNTO 0); cout : OUT bit; s : OUT bit_vector(8 - 1 DOWNTO 0); END COMPONENT; COMPONENT rPORT ( clk : IN bit; rL : IN bit; cclr : IN bit; d : IN bit_vector(8 - 1 DOWNTO 0);
48、 dout : OUT bit_vector(8 - 1 DOWNTO 0); SIGNAL a : bit_vector(7 DOWNTO 0); SIGNAL b : bit_vector(7 DOWNTO 0); SIGNAL data : bit_vector(7 DOWNTO 0); SIGNAL w_0 : bit; SIGNAL w_1 : bit; SIGNAL w_6 : bit; SIGNAL w_2 : bit_vector(7 DOWNTO 0); SIGNAL w_4 : bit_vector(7 DOWNTO 0); SIGNAL temp_xhdl7 : bit_
49、vector(7 DOWNTO 0); BEGIN o = w_4 ; w_0 = 0 ; w_1 = 1 ; temp_xhdl7 = d(7 DOWNTO 0) WHEN L = 1 ELSE ZZZZZZZZ; data =w_27:0 WHEN w_6 = 1ELSE ZZZZZZZZ; a = w_47:0 WHEN w_6 = 1ELSE ZZZZZZZZ; data(7 DOWNTO 0) = temp_xhdl7 ; w_6 = NOT L ; b inc,sub = w_0,a = a,b = b,s = w_2); U2 : reg8 PORT MAP (clk = clk
50、,L = w_1,clr = clr,data = data,q = w_4); END BHEV; 图3.11是程序计数器的时序仿真。从仿真图可以看到,最初的3个节拍由于加1控制端inc=1,所以不断地加。遇到clr瞬间的低电位信号,寄存器的值复位,根据加1控制端的信号,连续加到4。在置数控制端L=1的瞬间,外线上的数据h0B被寄存器接收,一直保持到瞬间加1控制端inc=1,使寄存器的值变为h0c,在遇到置数控制端L=1,使外部的数据h14进入寄存器。后面没有控制信号的变化,所以这个值一直保持着。图4.17 程序计数器仿真4.5.3 通用计数器 通用计数器是能够在需要的时候接收数据,并且能够
51、在需要的时候进行加1或减1运算与保存的设备。同步通用计数器同样可以用加减法器和寄存器组织在一起来实现,当然逻辑控制的设计上要比程序计数器复杂一些。 通用计数器要设置加1和减1控制端,将加减法计数器的b数据端口固定成1,基本结构的原理图设计如图4.18所示。图4.18 同步通用计数器 通用计数器的逻辑控制要比程序计数器复杂,可以预先进行状态真值表设计。表4.1是函数分析的真值表,自变量有inc、dec、L,受它们影响发生变化的有sub、cin、L0、L1、L2、L3。表4.1 控制变量状态真值表incdecLsubcinL0L1111111111sub=cin=decL0=inc+dec+LL1
52、=L 另外L=0时inst8、inst7这两个三态门必须打开,其他情况它们必须都打开,故L2=L3=L。 同步通用计数器程序描述如下,搞清楚了部件间的逻辑关系,编程并不复杂。ENTITY jiajian1 IS PORT ( inc : IN bit; dec : IN bit; L : IN bit; clr : IN bit; clk : IN bit; d : IN bit_vector(7 DOWNTO 0); o : OUT bit_vector(7 DOWNTO 0); END jiajian1;ARCHITECTURE BHEV OF jiajian1 IS COMPONENT
53、nfa PORT ( sub : IN bit; cin : IN bit; a : IN bit_vector(8 - 1 DOWNTO 0); b : IN bit_vector(8 - 1 DOWNTO 0); cout : OUT bit; s : OUT bit_vector(8 - 1 DOWNTO 0); END COMPONENT; COMPONENT reg8PORT ( clk : IN bit; clr : IN bit; L : IN bit; data : IN bit_vector(8 - 1 DOWNTO 0); q : OUT bit); END COMPONE
54、NT; SIGNAL a : bit_vector(7 DOWNTO 0); SIGNAL b : bit_vector(7 DOWNTO 0); SIGNAL data : bit_vector(7 DOWNTO 0); SIGNAL L0 : bit; SIGNAL L1 : bit; SIGNAL L2 : bit; SIGNAL w_0 : bit_vector(7 DOWNTO 0); SIGNAL w_1 : bit_vector(7 DOWNTO 0); SIGNAL temp_xhdl8 : bit_vector(7 DOWNTO 0); SIGNAL temp_xhdl9 :
55、 bit_vector(7 DOWNTO 0); SIGNAL o_xhdl1 : bit_vector(7 DOWNTO 0); BEGIN o = o_xhdl1; o_xhdl1 dec, sub = dec, a = a, b = b, s = w_0); U2 : reg8 PORT MAP (clk = clk,L = L0, clr = clr, data = data, q = w_1); temp_xhdl8 = d(7 DOWNTO 0) WHEN L1 = 1 ELSE ZZZZZZZZ; data(7 DOWNTO 0) = temp_xhdl8 ; temp_xhdl
56、9 = w_1(7 DOWNTO 0) WHEN L2 = 1 ELSE ZZZZZZZZ; a(7 DOWNTO 0) = temp_xhdl9 ; L0 = L1 OR inc OR dec ; L2 = NOT L1 ; L1 = L ; b(7 DOWNTO 1) = 0000000 ; b(0) = 1 ;END BHEV; 通用计数器的时序仿真如图4.19所示。图4.19 通用计数器的仿真4.6 节拍器设计 计算机同步电路设计离不开节拍器。与传统的节拍器设计电路相比,采用FPGA技术设计的节拍器外围电路更简单,灵活性更大。4.6.1 节拍器电路设计 图4.20是6节拍的节拍器设计。
57、图4.20 8-节拍逻辑电路 这个节拍器的节拍由输出引脚的分量来表示,即pi=1(i=0,1,2,3,4,5)表示当前是第i拍。输入端clk是系统时钟。clr是初始化低电位输入端,低电位有效。reset是高电位复位端,beak是节拍暂停控制端。4.6.2 节拍器程序描述 将节拍器的电路设计转换成VHDL程序。ENTITY jpq IS PORT ( clr : IN bit; clk : IN bit; reset : IN bit; brak : IN bit; p : OUT bit_vector(5 DOWNTO 0); END jpq;ARCHITECTURE BHEV OF jpq
58、IS SIGNAL p_ww : bit_vector(5 DOWNTO 0); SIGNAL w_10 : bit; SIGNAL w_3 : bit; SIGNAL w_8 : bit; SIGNAL w_9 : bit; SIGNAL w_11 : bit; SIGNAL w_12 : bit; SIGNAL w_13 : bit; SIGNAL w_14 : bit; SIGNAL w_15 : bit; SIGNAL w_16 : bit; SIGNAL p_xhdl1 : bit_vector(5 DOWNTO 0); BEGIN p = p_xhdl1; PROCESS BEGI
59、N WAIT UNTIL (clkEVENT AND clk = 1) OR (w_10EVENT AND w_10 = 0); IF (NOT w_10 = 1) THEN w_11 = 1; ELSE w_11 = w_9; END IF; END PROCESS;PROCESS BEGIN WAIT UNTIL (clkEVENT AND clk = 1) OR (w_10EVENT AND w_10 = 0); IF (NOT w_10 = 1) THEN w_16 = 0; ELSE w_16 = w_11; END IF; END PROCESS; p_ww(5) = w_12 A
60、ND w_9 ; p_ww(4) = w_12 AND w_13 ; p_ww(3) = w_12 AND w_14 ; p_ww(2) = w_12 AND w_15 ; p_ww(1) = w_12 AND w_16 ; p_ww(0) = w_12 AND w_11 ; PROCESS BEGIN WAIT UNTIL (clkEVENT AND clk = 1) OR (w_10EVENT AND w_10 = 0); IF (NOT w_10 = 1) THEN w_15 = 0; ELSE w_15 = w_16; END IF; END PROCESS; PROCESS BEGI
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年山西省建筑安全员A证考试题库
- 2025云南省建筑安全员-A证考试题库附答案
- 苏州城市学院《林木分子生物学》2023-2024学年第二学期期末试卷
- 海南师范大学《演艺娱乐经营管理》2023-2024学年第二学期期末试卷
- 华南理工大学《创业教育》2023-2024学年第二学期期末试卷
- 新余学院《实践中的马克思主义新闻观》2023-2024学年第二学期期末试卷
- 青岛幼儿师范高等专科学校《三维造型设计》2023-2024学年第二学期期末试卷
- 甘孜职业学院《汽车运用工程1》2023-2024学年第二学期期末试卷
- 郑州理工职业学院《装饰工程预决算A》2023-2024学年第二学期期末试卷
- 2025年安徽省建筑安全员-B证(项目经理)考试题库
- 【美术】第一单元第1课《情感的抒发与理念的表达》课件 2023-2024学年人教版初中美术八年级下册
- 体育与健康(水平二)《花样跳绳一级动作(18课时)》大单元教学计划
- 2024年济南工程职业技术学院高职单招(英语/数学/语文)笔试历年参考题库含答案解析
- 癔症护理查房
- 中国民航大学开题报告模板
- 人民币银行结算账户管理系统培训课件
- 钢结构施工安全培训
- 红木家具通用技术条件解析
- 超市商品结构图
- 沃尔沃S60L 2014款说明书
- 汽车零部件喷漆项目分析报告
评论
0/150
提交评论