2.19k likes | 2.61k Views
第 6 章 EDA 技术的应用. 本章通过 VHDL 实现的设计实例,进一步介绍了 EDA 技术在组合逻辑,时序逻辑,状态机设计和存储器设计方面的应用。 学习目标 通过对本章内容的学习,学生应该能够做到: 了解: VHDL 编程特点 理解: VHDL 设计流程和层次化设计方法 应用:掌握常用数字逻辑部件 VHDL 建模方法与设计技巧。. 主要内容. 6. 1 组合逻辑电路的设计应用 6. 2 时序逻辑电路的设计应用 6.3状态机的设计 6.4存储器的设计 6.5EDA综合设计 . 6.1 组合逻辑电路的设计应用.
E N D
第6章 EDA技术的应用 本章通过VHDL实现的设计实例,进一步介绍了EDA技术在组合逻辑,时序逻辑,状态机设计和存储器设计方面的应用。 学习目标 通过对本章内容的学习,学生应该能够做到: 了解:VHDL编程特点 理解:VHDL设计流程和层次化设计方法 应用:掌握常用数字逻辑部件VHDL建模方法与设计技巧。
主要内容 • 6.1组合逻辑电路的设计应用 • 6.2时序逻辑电路的设计应用 • 6.3状态机的设计 • 6.4存储器的设计 • 6.5EDA综合设计
6.1 组合逻辑电路的设计应用 • 在本节所要描述的组合逻辑电路有编码器、选择器、译码器、加法器、三态门、奇偶检验电路、码制转换器等。下面逐一地对它们进行介绍。
6.1.1 编码器设计 • 在数字系统中,往往需要改变原始数据的表示形式,以便存储、传输和处理,这一过程称为编码。例如,将二进制码变换为具有抗干扰能力的格雷码,能减少传输和处理时的误码;对图像、语音数据进行压缩,使数据量大大减少,能降低传输和存储开销。实现编码操作的数字逻辑电路称为编码器,常见的有二进制码编码器和优先编码器。优先编码器是对某一时刻输入信号的优先级别进行识别和编码的数字逻辑器件,在优先编码器中优先级别高的信号排斥级别低的,即具有单方面排斥的特性,每一个信号都有一个优先级,编码器的输出指明具有最高优先级的有效信号。当具有最高优先级的信号有效时,其他优先级较低的信号无效。
例6-1一个8到3的优先级编码器功能真值表如表6-1所示。其优先级别依次为DIN8D到DIN1(从高到低)。输出DO[2..0]代表一个二进制数,指明被设置为1的输入信号中优先级别最高者。E0(高电平有效)用于指示输入是否为有效信号。请给出该8-3优先编码器的VHDL实现方案。例6-1一个8到3的优先级编码器功能真值表如表6-1所示。其优先级别依次为DIN8D到DIN1(从高到低)。输出DO[2..0]代表一个二进制数,指明被设置为1的输入信号中优先级别最高者。E0(高电平有效)用于指示输入是否为有效信号。请给出该8-3优先编码器的VHDL实现方案。
例6-1一个8到3的优先级编码器功能真值表如表6-1所示。其优先级别依次为DIN8D到DIN1(从高到低)。输出DO[2..0]代表一个二进制数,指明被设置为1的输入信号中优先级别最高者。E0(高电平有效)用于指示输入是否为有效信号。请给出该8-3优先编码器的VHDL实现方案。例6-1一个8到3的优先级编码器功能真值表如表6-1所示。其优先级别依次为DIN8D到DIN1(从高到低)。输出DO[2..0]代表一个二进制数,指明被设置为1的输入信号中优先级别最高者。E0(高电平有效)用于指示输入是否为有效信号。请给出该8-3优先编码器的VHDL实现方案。 表6-1,8-3优先编码器真值表
解:为便于理解优先编码器的功能,首先观察表6-1,可知如DIN8=1时,则输出DO[2..0]=111,因为DIN8的级别最高,只要DIN8=1,则DIN6~DIN1的取值就无关紧要。据此可利用条件赋值语句IF-THEN-ELSE,其VHDL源程序如下。在程序中,当DIN(8)=1时,不考虑其他情况直接将输出DO置为111;依此类推当执行最后一个ELSE时,将输出DO置为000。其仿真波形输出如图6-1所示。编码器元件符号如图6-2所示。解:为便于理解优先编码器的功能,首先观察表6-1,可知如DIN8=1时,则输出DO[2..0]=111,因为DIN8的级别最高,只要DIN8=1,则DIN6~DIN1的取值就无关紧要。据此可利用条件赋值语句IF-THEN-ELSE,其VHDL源程序如下。在程序中,当DIN(8)=1时,不考虑其他情况直接将输出DO置为111;依此类推当执行最后一个ELSE时,将输出DO置为000。其仿真波形输出如图6-1所示。编码器元件符号如图6-2所示。
ARCHITECTURE BEHAV OF CODER8_3 IS • BEGIN • PROCESS(DIN) • BEGIN • IF(DIN(8)='1') THEN DO<="111"; • ELSIF(DIN(6)='1') THEN DO<="101"; • ELSIF(DIN(5)='1') THEN DO<="100"; • ELSIF(DIN(4)='1') THEN DO<="011"; • ELSIF(DIN(3)='1') THEN DO<="010"; • ELSIF(DIN(2)='1') THEN DO<="001"; • ELSE DO<="000"; • END IF; • END PROCESS; • E0<='0' when DIN="00000000" ELSE '1'; • END BEHAV;
IF(DIN(8)='1') THEN DO<="111"; • ELSIF(DIN(6)='1') THEN DO<="101"; • ELSIF(DIN(5)='1') THEN DO<="100"; • ELSIF(DIN(4)='1') THEN DO<="011"; • ELSIF(DIN(3)='1') THEN DO<="010"; • ELSIF(DIN(2)='1') THEN DO<="001"; • ELSE DO<="000"; • END IF; • END PROCESS; • E0<='0' when DIN="00000000" ELSE '1'; 图6-1 8-3优先编码器仿真波形 图6-2编码器元件符号
6.1.2译码器的设计 • 译码是编码的逆过程,它的功能是把代码状态的特定含义翻译出来,并转换成相应的控制信号,实现译码操作的电路称为译码器。译码器分为两类,一类是唯一地址译码,它是将一系列代码转换成与之一一对应的有效信号;另一类是码制转换器,其功能是将一种代码转换成另一种代码。
1.唯一地址译码器 • 常见的唯一地址译码有3-8译码器,其真值表如表6-2所示。 表6-2 3-8译码器真值表
表6-2中输入变量为3个d0,d1,d2,输出变量有8个,即y0~y7,对输入变量d0,d1,d2译码,就能确定输出端y0~y7的输出端变为有效(低电平),从而达到译码目的。它常用于计算机中对存储器单元地址译码,即将每一个地址代码转换为一个有效信号,从而选中对应的单元。表6-2中输入变量为3个d0,d1,d2,输出变量有8个,即y0~y7,对输入变量d0,d1,d2译码,就能确定输出端y0~y7的输出端变为有效(低电平),从而达到译码目的。它常用于计算机中对存储器单元地址译码,即将每一个地址代码转换为一个有效信号,从而选中对应的单元。
ARCHITECTURE rtl OF decoder3_8 IS • SIGNAL indata:STD_LOGIC_VECTOR (2 DOWNTO 0); • BEGIN • Indata <= c & b & a; • PROCESS (indata,g1,g2a,g2b) • BEGIN • IF (g1='1' AND g2a='0' AND g2b='0') THEN • CASE indata 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" ; • WHEN OTHERS=> y <= "XXXXXXXX" ; • END CASE; • ELSE Y <= "11111111" ; • END IF; • END PROCESS; • END rtl;
在例6-2中,y(0)对应真值表中的y0,y(1)对应y1,依次类推。以上是利用VHDL语言的CASE-WHEN语句实现的译码器电路。其波形仿真输出与元件符号如图6-3所示。在例6-2中,y(0)对应真值表中的y0,y(1)对应y1,依次类推。以上是利用VHDL语言的CASE-WHEN语句实现的译码器电路。其波形仿真输出与元件符号如图6-3所示。 图6-3 3-8译码器仿真输出
2.码制转换器 • 码制转换器有很多类型,如BCD码到七段数码管的译码器,将一位BCD码译为驱动数码管各电极的7个输出量a ~g。输入量DCBA是BCD码,a ~g是7个输出端,分别与数码管上的对应笔划段相连。在a ~g中,输出为1的能使对应的笔划段发光,否则对应的笔划段熄灭。例如,要使数码管显示“0”字形,则g段不亮,其它段都亮,即要求abcdefg = 1111110。
例6-3 利用VHDL设计BCD码到七段数码管的译码器,并添加一个使能信号EN,该输入信号可以不顾及BCD码的输入,使所有七段数码管的灯都不亮,其真值表如表6-3所示。(共阴极) 解:用四位二进制数表示一位十进制数的编码,称为BCD(Binary-Coded-Decimal)码或二—十进制编码。如表6-3所示,若要表示多个十进制数位的信息,则需要用多组4位码即可,每组对应一个十进制数位数字。 • 表6-3七段译码器逻辑的真值表
ARCHITECTURE one OF BCDTOLED7 IS • BEGIN • PROCESS( A ,en) • BEGIN • if en='1' then • CASE A IS • WHEN "0000" => LED7S <= "0111111" ; • WHEN "0001" => LED7S <= "0000110" ; • WHEN "0010" => LED7S <= "1011011" ; • WHEN "0011" => LED7S <= "1001111" ; • WHEN "0100" => LED7S <= "1100110" ; • WHEN "0101" => LED7S <= "1101101" ; • WHEN "0110" => LED7S <= "1111101" ; • WHEN "0111" => LED7S <= "0000111" ; • WHEN "1000" => LED7S <= "1111111" ; • WHEN "1001" => LED7S <= "1101111" ; • WHEN OTHERS => LED7S <= "1000000" ; --“-”对应非法码 • END CASE ; • else LED7s<="0000000" ; • end if; • END PROCESS ; • END one;
其中代码中"0111111"、"0000110"、"1011011"、"1001111"、"1100110"、"1101101"、"1111101"、"0000111"、"1111111"、"1101111"、"1000000"在数码管上分别为0、1、2、3、4、5、6、7、8、9 • 仿真结果如下 图6-4 BCD码到七段数码管译码器仿真输出
6.1.3.多路选择器的设计 • 多路选择器是指经过选择,把多个通道的数据传送到唯一的公共数据通道上去的数字逻辑电路,其功能相当于多刀单值开关,也叫数据选择器,数据选择器常用于信号的切换,数据选择,顺序操作,并-串转换,波形产生和逻辑函数发生器。 表6-4 4选1多路选择器真值表
ARCHITECTURE rtl OF mux4 IS • SIGNAL SEL : STD_LOGIC_VECTOR(1 DOWNTO 0); • BEGIN • SEL<=B&A; • PROCESS(INPUT,SEL) • BEGIN • CASE SEL IS • WHEN "00" =>Y<=INPUT(0); • WHEN "01" =>Y<=INPUT(1); • WHEN "10" =>Y<=INPUT(2); • WHEN OTHERS =>Y<=INPUT(3);--用others表示选择条件,以表示其他所有可能取值 • END CASE; • END PROCESS; • END rtl;
SIGNAL SEL : STD_LOGIC_VECTOR(1 DOWNTO 0); • BEGIN • SEL<=B&A; • PROCESS(INPUT,SEL) • BEGIN • CASE SEL IS • WHEN "00" =>Y<=INPUT(0); • WHEN "01" =>Y<=INPUT(1); • WHEN "10" =>Y<=INPUT(2); • WHEN OTHERS =>Y<=INPUT(3);--用others表示选择条件,以表示其他所有可能取值 图6- 5 4选1多路选择器仿真输出
例6-5用VHDL语言描述位宽w的2选1多路选择器,并给出w=4的时序仿真波形。 例6-5用VHDL语言描述位宽w的2选1多路选择器,并给出w=4的时序仿真波形。 • 解:本题考虑使用多路选择器在数据位宽为w的两路编码数据源之间进行选择,如果数据长度为w(每个数据有w位),我们可以用w个2选1多路选择器实现之,也可以用多位信号和算术运算的赋值语句实现(本例采用此方案)。
PACKAGE const IS • CONSTANT w :INTEGER:=4;- set total number of bits • CONSTANT n :INTEGER:=w - 1; -- MSB index number • END const; • USE work.const.all; • --库声明和实体 • ARCHITECTURE rtl OF mux2to1_n IS • BEGIN • Y<=A0 WHEN S='0' ELSE A1; • END; 图6- 5 2选1多路选择器仿真输出(数据位宽为4)
6.1.4 加法器设计 • 1.半加器 • 半加器有两个二进制输入、一个和输出和一个进位输出。其真值表如表6-5所示。 表6-5 半加器的真值表
例6-7 半加器的VHDL程序设计 • ARCHITECTURE half1 OF half_adder IS • SIGNAL C,D:STD_LOGIC; • BEGIN • C<=A OR B; • D<=A NAND B; • CO<=NOT D; • S<=C AND D; • END half1; 图6- 6 半加器仿真输出
2.二进制加法器 • 使用VHDL设计加法器可采用层次化结构描述,首先创建一个1位全加器实体,然后例化此1位全加器4次,建立一个更高层次的4位加法器。 • 解:1位全加器的VHDL代码如下,其输入为CIN、X和Y,输出为和S、进位输出COUT,S和COUT均以逻辑表达式形式描述。 ARCHITECTURE logicfunc OF fulladd IS BEGIN S<=X XOR Y XOR CIN; COUT<=(X AND Y) OR (CIN AND X) OR (CIN AND Y); END logicfunc;
为使该程序可调用,其元件声明语句既可以放在顶层程序的结构体内,也可放在VHDL的程序包内。例6-9给出了fulladd_package的程序包声明。为使该程序可调用,其元件声明语句既可以放在顶层程序的结构体内,也可放在VHDL的程序包内。例6-9给出了fulladd_package的程序包声明。 • 解:以下代码定义了名为fulladd_package的程序包,该VHDL代码可以和例6-8的fulladd存储在同一个文件中,也可以存储在一个单独的文件中。VHDL语法要求程序包声明要有自己的LIBRARY和USE子句,以下代码中包含了这两个子句。在程序包内部,实体fulladd被声明为一个元件。当该代码被编译时程序包fulladd_package被创建并存储在工作目录下。 • 元件fulladd作为子电路使用。
LIBRARY IEEE; • USE IEEE.STD_LOGIC_1164.ALL; • package fulladd_package is • COMPONENT fulladd • PORT(CIN,X,Y:IN STD_LOGIC; • S,COUT :OUT STD_LOGIC); • END COMPONENT; • end fulladd_package; • 以后任何实体都可以通过语句:LIBRARY WORK; USE WORK. fulladd_package.ALL访问fulladd_package,从而把元件fulladd作为子电路使用。
例6-10将1位全加器作为子电路使用,构建4位加法器的VHDL语言序。例6-10将1位全加器作为子电路使用,构建4位加法器的VHDL语言序。 • 解:4位加法器的VHDL程序设计如下 • ARCHITECTURE structure OF adder4 IS • signal C: STD_LOGIC_VECTOR(3 DOWNTO 1); • COMPONENT fulladd • PORT(CIN,X,Y:IN STD_LOGIC; • S,Cout:OUT STD_LOGIC); • END COMPONENT; • BEGIN • U0:fulladd PORT MAP(CIN,X(0),Y(0),S(0),C(1)); • U1:fulladd PORT MAP(C(1),X(1),Y(1),S(1),C(2)); • U2:fulladd PORT MAP(C(2),X(2),Y(2),S(2),C(3)); • U3:fulladd PORT MAP(C(3),X(3),Y(3),S(3),Cout); • END structure;
4位加法器功能模拟结果如图6- 7所示。在示例程序例6-9中,STD_LOGIC_VECTOR • 是数据对象STD_LOGIC的一维数组,程序中用C定义了一个3位的STD_LOGIC信号,VHDL代码中可以用C或用C(3)、C(2)、C(1)分别代表每一个单独的信号。根据VHDL的语法规定“3 DOWNTO 1”指明C(3)是最高位,C(1) 是最低位,该声明常用于多位信号的二进制表示。同理,声明“1TO 3”则指明C(1)是最高位,C(3) 是最低位。这点在进行信号赋值时要特别注意。 图6- 7 4位加法器仿真输出
例6-11利用算术赋值语句设计一个16位的加法器。例6-11利用算术赋值语句设计一个16位的加法器。 • 解:VHDL除了提供加法运算符(+)外,本书4.2.4还提供了其他的一些运算符,程序包STD_LOGIC_1164不允许STD_LOGIC类型的信号作算术运算,而程序包STD_LOGIC_signed允许作算术运算,其示例程序如下。在EDA系统中,综合编译的结果将可以根据不同的优化目标(造价或速度)产生不同的电路。
例6-11利用算术赋值语句设计一个16位的加法器。例6-11利用算术赋值语句设计一个16位的加法器。 • 解:VHDL除了提供加法运算符(+)外,本书4.2.4还提供了其他的一些运算符,程序包STD_LOGIC_1164不允许STD_LOGIC类型的信号作算术运算,而程序包STD_LOGIC_signed允许作算术运算,其示例程序如下。在EDA系统中,综合编译的结果将可以根据不同的优化目标(造价或速度)产生不同的电路。 ARCHITECTURE Behavior OF adder16 IS SIGNAL S: STD_LOGIC_VECTOR(16 DOWNTO 0); BEGIN S<=(‘0’&X)+Y+CIN; SUM<=S(15 DOWNTO 0); Cout<= SUM (16); Overflow<= SUM (16)XOR X(15)XORY(15)XOR SUM (15); END Behavior;
例6-11的VHDL结构体中定义了一个17位的信号S(16..0),新增加的S(16)用于存储来自加法器S(15)的进位输出。把X、Y和CIN相加的和赋给S,该算术赋值语句右边有一个括号:(‘0’&X),本例利用连接运算符&,将16位信号X最高位加一个‘0’形成一个17位信号,使之和赋值语句左边的信号的位数一致。例6-11的VHDL结构体中定义了一个17位的信号S(16..0),新增加的S(16)用于存储来自加法器S(15)的进位输出。把X、Y和CIN相加的和赋给S,该算术赋值语句右边有一个括号:(‘0’&X),本例利用连接运算符&,将16位信号X最高位加一个‘0’形成一个17位信号,使之和赋值语句左边的信号的位数一致。 • 为了允许算术赋值语句可以运用于STD_LOGIC类型的信号,例6-11的VHDL代码中使用了程序包STD_LOGIC_signed。该程序包实际使用了STD_LOGIC_arith程序包中定义的数据类型SIGNED和UNSIGNED,用于表示算术赋值语句中的有符号数和无符号数。这两种数据类型和STD_LOGIC_VECTOR一样是数据对象STD_LOGIC的一维数组。
3.8421码加法器 • 8421码加法器是实现十进制数相加的逻辑电路。8421码用4个二进制位表示一位十进制数(0~9),4个二进制位能表示十六个编码,但8421码只利用了其中的0000~1010十个编码,其余6个编码为非法编码。尽管利用率不高,但因人们习惯了十进制,所以8421码加法器也是一种常用的逻辑电路。 • 例6-12请编写一个VHDL模型,该模型描述的是1位8421码加法器。
解:8421码加法器与4位二进制数加法运算电路不同。这里是两个十进制数相加,和大于9时应产生进位。设参与相加的量为:被加数X、加数Y及来自低位8412码加法器的进位C-1。设X、Y及C-1按十进制相加,产生的和为Z,进位为W。X、Y、Z均为8421码。 解:8421码加法器与4位二进制数加法运算电路不同。这里是两个十进制数相加,和大于9时应产生进位。设参与相加的量为:被加数X、加数Y及来自低位8412码加法器的进位C-1。设X、Y及C-1按十进制相加,产生的和为Z,进位为W。X、Y、Z均为8421码。 • 先将X、Y及C-1按二进制相加,得到的和记为S。显然,若S ≤9,则S本身就是8421码,S的值与期望的Z值一致,进位W应为0;但是,当S >9时,S不再是8421码。此时,须对S进行修正,取S的低四位按二进制加6,丢弃进位,就能得到期望的Z值,而此时进位W应为1。1位8421码加法器框图如图6-8所示
图6-8中,C3是X、Y及C-1按二进制相加产生的进位。“4位二进制加法器”已在前面进行了详细讨论,因此本例的重点是“加6修正”电路的设计。现在分析“加6修正”电路的功能:① 应能判断 是否大于9,以决定是“加6”还是“加0”。 ②要有一个二进制加法器,被加数为,加数为6或0,其VHDL描述如下。 图6-8一位8421码加法器框图
ARCHITECTURE Behavior OF adder_8421 IS • SIGNAL S: STD_LOGIC_VECTOR(4 DOWNTO 0); • SIGNAL adjust: STD_LOGIC; • BEGIN • S<=(‘0’&X)+Y; • adjust<=’1’ when S>9 else ‘0’;--选择信号赋值语句 • Z<=S when (adjust=’0’) else Z+6; • END Behavior; 例6-11中使用了选择信号赋值语句,它根据某种判据从多种信号中选择一个给信号赋值,即其判据条件是,S>9,若条件满足则将1赋给adjust;否则将0赋给adjust。
6.1.5数值比较器 • 数值比较器就是对两数A、B进行比较,并判断其大小的数字逻辑电路。74系列的7485是常用的集成电路数值比较器,其真值表如图6-9所示。在图6-9中,级联输入端用作级联的控制输入,即当高一级芯片发现其输入数据相等时,它将查看相邻下一级低位芯片的输出,并用这些控制输入端做出最终决定。由于每个IF语句能判断两个,所以最好使用IF/ELSE结构,这与CASE结构中查找变量单一值相反,两个待比较的值需要声明为数值,为清楚标明每一个位的用途,级联的控制输入与三个比较输出端应作为独立的位来说明。数值比较器7485的VHDL程序如例6-13所示。
例6-13数值比较器7485的VHDL实现。 • ARCHITECTURE vhdl OF T7485_V IS • BEGIN • PROCESS (a, b, gtin, ltin, eqin) • BEGIN • IF a < b THEN • altb <= '1';agtb <= '0';aeqb <= '0'; • ELSIF a > b THEN • altb <= '0';agtb <= '1';aeqb <= '0'; • ELSE • ltb <= ltin;agtb <= gtin;aeqb <= eqin; • END IF; • END PROCESS; • END vhdl; 图6-9数值比较器7485真值表
6.1.5 算术逻辑运算器(ALU) • 表6-6 ALU181的运算功能表
例6-14集成ALU芯片74181的VHDL设计 • 设参加运算的两个8位数据分别为A[7..0]和B[7..0],运算模式由S[3..0]的16种组合决定,此外,设M=0,选择算术运算,M=1为逻辑运算,CN为低位的进位位;F[7..0]为输出结果,CO为运算后的输出进位位。其VHDL源程序如下:
ARCHITECTURE behav OF ALU181 IS • SIGNAL A9 : STD_LOGIC_VECTOR(8 DOWNTO 0); • SIGNAL B9 : STD_LOGIC_VECTOR(8 DOWNTO 0); • SIGNAL F9 : STD_LOGIC_VECTOR(8 DOWNTO 0); • BEGIN • A9 <= '0' & A ; B9 <= '0' & B ; • PROCESS(M,CN,A9,B9) • BEGIN • CASE S IS • WHEN "0000" => IF M='0' THEN F9<=A9 + CN ; • ELSE F9<=NOT A9; END IF; • WHEN "0001" => IF M='0' THEN F9<=(A9 or B9) + CN ; • ELSE F9<=NOT(A9 OR B9); END IF; • WHEN "0010" => IF M='0' THEN F9<=(A9 or (NOT B9))+ CN ; • ELSE F9<=(NOT A9) AND B9; END IF; • WHEN "0011" => IF M='0' THEN F9<= "000000000" - CN ; • ELSE F9<="000000000"; END IF; • WHEN "0100" => IF M='0' THEN F9<=A9+(A9 AND NOT B9)+ CN ; • ELSE F9<=NOT (A9 AND B9); END IF; • WHEN "0101" => IF M='0' THEN F9<=(A9 or B9)+(A9 AND NOT B9)+CN ; • ELSE F9<=NOT B9; END IF;
WHEN "0111" => IF M='0' THEN F9<=(A9 or (NOT B9)) - CN ; • ELSE F9<=A9 and (NOT B9); END IF; • WHEN "1000" => IF M='0' THEN F9<=A9 + (A9 AND B9)+CN ; • ELSE F9<=(NOT A9)and B9; END IF; • WHEN "1001" => IF M='0' THEN F9<=A9 + B9 + CN ; • ELSE F9<=NOT(A9 XOR B9); END IF; • WHEN "1010" => IF M='0' THEN F9<=(A9 or(NOT B9))+(A9 AND B9)+CN ; • ELSE F9<=B9; END IF; • WHEN "1011" => IF M='0' THEN F9<=(A9 AND B9)- CN ; • ELSE F9<=A9 AND B9; END IF; • WHEN "1100" => IF M='0' THEN F9<=(A9 + A9) + CN ; • ELSE F9<= "000000001"; END IF; • WHEN "1101" => IF M='0' THEN F9<=(A9 or B9) + A9 + CN ; • ELSE F9<=A9 OR (NOT B9); END IF; • WHEN "1110" => IF M='0' THEN F9<=((A9 or (NOT B9)) +A9) + CN ; • ELSE F9<=A9 OR B9; END IF; • WHEN "1111" => IF M='0' THEN F9<=A9 - CN ; • ELSE F9<=A9 ; END IF; • WHEN OTHERS => F9<= "000000000" ; • END CASE; • END PROCESS; • F<= F9(7 DOWNTO 0) ; CO <= F9(8) ; • END behav;
6.2时序逻辑电路的设计应用 • 6.2.1 触发器 • 触发器是跳变沿触发的,在每个时钟clk输入正跳变沿或负跳变沿,输入触发器的当前值被存储到触发器中,并且反映在该触发器的输出Q上。D触发器和JK触发器是构成时序逻辑电路最基本存储元件。 • 1.D触发器 • 上升沿触发的D触发器有一个数据输入端D、一个时钟输入端CLK及一个数据输出端Q。D触发器的输出只有在正沿脉冲过后,其数据D才传递到输出。真值表如表6-7所示。
ARCHITECTURE rtl OF dff1 IS • BEGIN • PROCESS(CLK) • BEGIN • IF(CLK'EVENT AND CLK='1') • THEN Q<=D; • END IF; • END PROCESS; • END rtl; 表6-7 D触发器真值表 D触发器一般还带有复位或置位输入端,有的还带有时钟使能信号输入端,后一种D触发器只有使能信号有效时,时钟信号的边沿才有效,其VHDL语言描述如例6-16所示。
例6-16带有时钟使能信号输入端的D触发器VHDL设计例6-16带有时钟使能信号输入端的D触发器VHDL设计 • 解:该D触发器的实体声明代码和结构体代码如下, 分析输出波形可知,该D触发器在时钟的上升沿时刻,且当时钟使能信号ENA=1才能更新存储器的值。若时钟的上升沿时刻,ENA=0,D触发器的值保持不变。因此数据输入的值,必须在时钟的正跳变沿前后保持一段稳定时间(即建立时间和保持时间)才能将该值稳定地存入触发器。时钟的使能信号也需要类似的稳定时间限制,实际上时钟的使能信号是一个同步控制输入(synchronous control input)。 • 其仿真波形输出如图6-10所示
ARCHITECTURE rtl OF example_dffe IS • BEGIN • PROCESS(CLK,D) • BEGIN • IF(CLK'EVENT AND CLK='1') THEN • IF(ENA='1') THEN • Q<=D; NQ<=not D; • END IF; • END IF; • END PROCESS; • END rtl; 图6- 10 D触发器仿真输出
例6-15和例6-16的D触发器的VHDL模板的差别就是多了一条IF语句,程序中D和Q的位宽决定了该模板是一位触发器模型还多位的寄存器模型。 例6-15和例6-16的D触发器的VHDL模板的差别就是多了一条IF语句,程序中D和Q的位宽决定了该模板是一位触发器模型还多位的寄存器模型。 • 例6-17请设计一个复位清0的D触发器的VHDL模板 • 解:对例6-16的D触发器作进一步的改进,即添加一个复位输入信号,以便把存储器的值重新设为0。复位输入是强制性的,无论时钟的使能信号还是数据输入都不如它的优先级别高。触发器的复位时序有两种可能,一种是同步清0,即把复位输入当作同步控制输入;另一种是异步清0,即只要复位信号有效,不管其他时钟状态,立即使输出为0。
(2) 异步清0模板: reg:PROCESS(CLK) IS BEGIN IF reset=’1’ THEN Q<=0; ELSIF(CLK'EVENT AND CLK='1') THEN IF(ENA='1') THEN Q<=D; END IF; END IF; END PROCESS reg; • (1)同步清0模板: • reg:PROCESS(CLK) IS • BEGIN • IF(CLK'EVENT AND CLK='1') • THEN • IF reset=’1’THEN • Q<=0; • ELSIF(ENA='1') THEN • Q<=D; • END IF; • END IF; • END PROCESS reg;
2.JK触发器 • JK触发器的输入端有一个置位输入、一个复位输入、两个控制输入和一个时钟输入;输出端有正向输出断和反向输出端。具有置位和清零端的JK触发器真值表如表6-8所示: 表6-8 JK触发器真值表