880 likes | 1.02k Views
EDA 原理及应用. 何宾 2008.10. 第四章. 第 4 章. 数字逻辑单元设计 - 本章概要. 在复杂数字系统中,其结构总可以用若干基本逻辑单元的组合进行描述。 基本逻辑单元一般分为组合逻辑电路和时序电路两大类。在此基础上,可以更进一步进行组合。 本章所介绍的存储器、运算单元和有限自动状态机就是由基本逻辑单元组合而成的。 本章首先介绍基本的组合逻辑电路和时序电路设计, 然后介绍在数字系统设计中普遍使用的存储器电路、运算 单元和有限自动状态机。. 数字逻辑单元设计. 第四章. 基本逻辑门电路设计. ●.
E N D
EDA原理及应用 何宾 2008.10
第四章 第 4章 数字逻辑单元设计-本章概要 • 在复杂数字系统中,其结构总可以用若干基本逻辑单元的组合进行描述。 • 基本逻辑单元一般分为组合逻辑电路和时序电路两大类。在此基础上,可以更进一步进行组合。 • 本章所介绍的存储器、运算单元和有限自动状态机就是由基本逻辑单元组合而成的。 • 本章首先介绍基本的组合逻辑电路和时序电路设计, • 然后介绍在数字系统设计中普遍使用的存储器电路、运算 • 单元和有限自动状态机。
数字逻辑单元设计 第四章 基本逻辑门电路设计 ● • 对基本逻辑门的操作主要有:与、与非、或、或非、异或、异或非和非操作。通过使用VHDL语言中描述基本逻辑门电路操作的关键字:and(与),nand(与非),or(或),nor(或非),xor(异或),xnor(异或非),not(非)来实现对基本逻辑门的操作。一堆复杂的逻辑门操作总可以化简为集中基本逻辑门操作的组合。
数字逻辑单元设计 第四章 基本逻辑门电路设计 ● 【例4-1】基本门电路的设计 Library ieee; Use ieee.std_logic_1164.all; Entity gate is Port(a, b,c : in std_logic; d : out std_logic); end gate; architecture rtl of gate is begin d<=((not a) and b) or c; end rtl;
数字逻辑单元设计 第四章 编码器和译码器设计 ● • 在数字系统中,常常会将某一信息用特定的代码进行描述,这称为编码过程。编码过程可以通过编码器电路实现。同时,将某一特定的代码翻译成原始的信息,这称为译码过程。译码过程可以通过译码器电路实现。
数字逻辑单元设计 第四章 编码器设计 ● • 将某一信息用一组按一定规律排列的二进制代码描述称为编码。典型的有8421码、BCD码等。在使用VHDL语言设计编码器时,通过使用CASE和IF语句实现对编码器的描述。
数字逻辑单元设计 第四章 编码器设计 ● 【例4-2】8/3线编码器的VHDL描述 library ieee; use ieee.std_logic_1164.all; entity priority_encoder_1 is port ( sel : in std_logic_vector (7 downto 0); code :out std_logic_vector (2 downto 0)); end priority_encoder_1; architecture archi of priority_encoder_1 is begin code <= "000" when sel(0) = '1' else "001" when sel(1) = '1' else "010" when sel(2) = '1' else "011" when sel(3) = '1' else "100" when sel(4) = '1' else "101" when sel(5) = '1' else "110" when sel(6) = '1' else "111" when sel(7) = '1' else "ZZZ"; end archi;
数字逻辑单元设计 第四章 译码器设计 ● • 译码的过程实际上就是编码过程的逆过程,即将一组按一定规律排列的二进制数还原为原始的信息。下面以最常用的3:8译码器为例,给出其VHDL语言描述。
数字逻辑单元设计 第四章 译码器设计 ●
数字逻辑单元设计-译码器设计 第四章 • 【例4-4】十六进制数的共阳极7段数码显示VHDL描述 • library ieee; • use ieee.std_logic_1164.all; • use ieee.std_logic_unsigned.all; • entity decoder is • port(hex: in std_logic_vector(3 downto 0); • led : out std_logic_vector(6downto 0)); • end decoder; • architecture rtl of decoder is • begin • with hex select • LED<= "1111001" when "0001", --1 • "0100100" when "0010", --2 • "0110000" when "0011", --3 • "0011001" when "0100", --4 • "0010010" when "0101", --5 • "0000010" when "0110", --6 • "1111000" when "0111", --7 • "0000000" when "1000", --8 • "0010000" when "1001", --9 • "0001000" when "1010", --A • "0000011" when "1011", --b • "1000110" when "1100", --C • "0100001" when "1101", --d • "0000110" when "1110", --E • "0001110" when "1111", --F • "1000000" when others; --0 • end rtl;
数字逻辑单元设计 第四章 数据选择器设计 ● • CASE和IF语句描述数据缓冲器 • 在数字系统设计中,常使用CASE和IF语句描述数据缓冲器。下面给出这两种描述方法。
数字逻辑单元设计-数据选择器设计 第四章 • 【例4-5】4选1多路选择器的IF语句描述 • library ieee; • use ieee.std_logic_1164.all; • entity multiplexers_1 is • port (a, b, c, d : in std_logic; • s : in std_logic_vector (1 downto 0); • o : out std_logic); • end multiplexers_1; • architecture archi of multiplexers_1 is • begin • process (a, b, c, d, s) • begin • if (s = "00") then o <= a; • elsif (s = "01") then o <= b; • elsif (s = "10") then o <= c; • else o <= d; • end if; • end process; • end archi;
数字逻辑单元设计-数据选择器设计 第四章 • 【例4-6】4选1多路选择器的CASE语句描述 • library ieee; • use ieee.std_logic_1164.all; • entity multiplexers_2 is • port (a, b, c, d : in std_logic; s : in std_logic_vector (1 downto 0); • o : out std_logic); • end multiplexers_2; • architecture archi of multiplexers_2 is • begin • process (a, b, c, d, s) • begin • case s is • when "00" => o <= a; • when "01" => o <= b; • when "10" => o <= c; • when others => o <= d; • end case; • end process; • end archi;
数字逻辑单元设计 第四章 图4.5 三态缓冲实现4选1多路选择器 三态缓冲描述数据选择器 ● • 使用三态缓冲语句也可以描述多路数据选择器。图4.5给出了4选1多路选择器的三态的原理。
数字逻辑单元设计 第四章 三态缓冲描述数据选择器 ● • 【例4-7】4选1多路选择器的三态描述 • library ieee; • use ieee.std_logic_1164.all; • entity multiplexers_3 is • port (a, b, c, d : in std_logic; • s : in std_logic_vector (3 downto 0); • o : out std_logic); • end multiplexers_3; • architecture archi of multiplexers_3 is • begin • o <= a when (s(0)='0') else 'Z'; • o <= b when (s(1)='0') else 'Z'; • o <= c when (s(2)='0') else 'Z'; • o <= d when (s(3)='0') else 'Z'; • end archi;
数字逻辑单元设计 第四章 数字比较器 ● • 比较器就是对输入数据进行比较,并判断其大小的逻辑电路。在数字系统中,比较器是基本的组合逻辑单元之一,比较器主要是使用关系运算符实现的。
数字逻辑单元设计 第四章 数字比较器 ● • 【例4-8】8位数据比较器的VHDL描述 • library ieee; • use ieee.std_logic_1164.all; • use ieee.std_logic_unsigned.all; • entity comparator_1 is • port(A,B : in std_logic_vector(7 downto 0); • CMP : out std_logic); • end comparator_1; • architecture archi of comparator_1 is • begin • CMP <= '1' when A >= B else '0'; • end archi; • 从上面的例子可以看出,使用VHDL中的>、>=、<、<=、=、 • /=,这几种关系运算符及其它们的组合,可以设计出具有复杂比 • 较功能的比较器。
数字逻辑单元设计 第四章 运算单元 ● • 数据运算单元主要包含加法器、减法器、乘法器和除法器,由这四种运算单元和逻辑运算单元一起,可以完成复杂数学运算。在VHDL语言中,支持的几种运算有:加(+)、减(-)、乘(*)、除(/)、取余(MOD)、幂乘(**)。
数字逻辑单元设计 第四章 加法器设计 ● • 在VHDL描述加法器时,使用’+’运算符比门级描述更简单。下面给出带进位输入和输出的无符号的8比特加法器的VHDL描述。
数字逻辑单元设计 第四章 加法器设计 ● • 【例4-9】带进位输入和输出的无符号的8比特加法器的VHDL描述 • library ieee; • use ieee.std_logic_1164.all; • use ieee.std_logic_arith.all; • use ieee.std_logic_unsigned.all; • entity adders_4 is • port(A,B,CI : in std_logic_vector(7 downto 0); • SUM : out std_logic_vector(7 downto 0); • CO : out std_logic); • end adders_4; • architecture archi of adders_4 is • signal tmp: std_logic_vector(8 downto 0); • begin • SUM <= tmp(7 downto 0); • CO <= tmp(8); • tmp <= conv_std_logic_vector((conv_integer(A) + conv_integer(B) • +conv_integer(CI)),9); • end archi;
数字逻辑单元设计 第四章 减法器设计 ● • 减法是加法的反运算,采用VHDL语言的‘-’符号描述减法器,比用门级描述更简单。下面给出一个无符号8位带借位的减法器的VHDL描述。
数字逻辑单元设计 第四章 减法器设计 ● • 【例4-10】无符号8位带借位的减法器的VHDL描述 • library IEEE; • use IEEE.STD_LOGIC_1164.ALL; • use IEEE.STD_LOGIC_UNSIGNED.ALL; • entity adders_8 is • port(A,B : in std_logic_vector(7 downto 0); • BI : in std_logic; • RES : out std_logic_vector(7 downto 0)); • end adders_8; • architecture archi of adders_8 is • begin • RES <= A - B - BI; • end archi;
数字逻辑单元设计 第四章 乘法器设计 ● • 用VHDL语言实现乘法器时,乘积和符号应该为2的幂次方。PLD的优点就是在内部集成了乘法器的硬核,具体在IP核的设计中详细讨论。
数字逻辑单元设计 第四章 乘法器设计 ● • 【例4-11】下面给出一个8位和4位无符号的乘法器的VHDL描述 • library ieee; • use ieee.std_logic_1164.all; • use ieee.std_logic_unsigned.all; • entity multipliers_1 is • port(A : in std_logic_vector(7 downto 0); • B : in std_logic_vector(3 downto 0); • RES : out std_logic_vector(11 downto 0)); • end multipliers_1; • architecture beh of multipliers_1 is • begin • RES <= A * B; • end beh;
数字逻辑单元设计 第四章 除法器设计 ● • 除法器可以用VHDL语言的‘/’符号实现,需要注意的是在使用‘/’符号进行除法运算时,除数必须是常数,而且是2的整数幂。因为除法器的运行有这样的限制,实际上除法也可以用移位运算实现。下面给出一个除法器的VHDL描述。
数字逻辑单元设计 第四章 除法器设计 ● • 【例4-12】除法器的VHDL描述。 • library ieee; • use ieee.std_logic_1164.all; • use entity divider_1 is • port(DI : in unsigned(7 downto 0); • DO : out unsigned(7 downto 0)); • end divider_1; • architecture archi of divider_1 is • begin • DO <= DI / 2; • end archi;
数字逻辑单元设计-总线缓冲器设计 第四章 • 【例4-13】三态门的进程描述 • Library ieee; • Use ieee.std_logic_1164.all; • Entity tri_gate is • Port (en : in std_logic; • din : in std_logic_vector(7 downto 0); • dout : out std_logic_vector(7 downto 0)); • end tri_gate; • Architecture rtl of tri_gate is • Begin • process(din,en) • begin • if(en=’1’) then • dout<=din; • else • dout<=’ZZZZZZZZ’; • end if; • end process; • end rtl;
数字逻辑单元设计-总线缓冲器设计 第四章 • 【例4-14】三态门的WHEN-ELSE进程描述 • Library ieee; • Use ieee.std_logic_1164.all; • Entity tri_gate is • Port (en : in std_logic; • din : in std_logic_vector(7 downto 0); • dout : out std_logic_vector(7 downto 0)); • end tri_gate; • Architecture rtl of tri_gate is • begin • dout<= din when en ='1' else 'ZZZZZZZZ'; • end rtl; • 从上面的两个例子中可以看出,使用条件并行语句描述三态门比使用进程要简单的多。
数字逻辑单元设计-总线缓冲器设计 第四章 【例4-15】双向总线缓冲器的描述 Library ieee; Use ieee.std_logic_1164.all; Entity bidir is Port(a : inout std_logic_vector(15 downto 0)); End bidir; Architecture rtl of bidir is signal a_in : std_logic_vector(15 downto 0); signal a_out : std_logic_vector(15 downto 0); signal T : std_logic; Begin a<= a_out when T = '0' else "ZZZZZZZZZZZZZZZZ"; a_out<=a; end rtl;
数字逻辑单元设计 第四章 时序逻辑电路设计 ● • 时序逻辑电路的输出状态不仅与输入变量的状态有关,而且还与系统原先的状态有关。时序电路最重要的特点是存在着记忆单元部分,时序电路主要包括:时钟和复位、基本触发器、计数器、移位寄存器等。
数字逻辑单元设计 第四章 时钟和复位设计 ● • 时序电路由时钟驱动,时序电路只有在时钟信号的边沿到来时,其状态才发生改变。在数字系统中,时序电路的时钟驱动部分一般包括时钟信号和系统复位信号。根据时钟和复位的描述不同,时序电路一般分成同步复位电路和异步复位电路两类。
数字逻辑单元设计 第四章 时钟信号描述 ● • 在时序电路中,不论采用什么方法描述时钟信号,必须指明时钟的边沿条件(clock edge condition)。时钟沿条件有上升沿和下降沿两种。 • 时钟的上升沿条件可以用下面的语句描述: • clock’event and clock = ‘1’ • rising_edge(clock) • 时钟的下降沿条件可以用下面的语句描述: • clock’event and clock = ‘0’ • falling_edge(clock)
数字逻辑单元设计 第四章 时钟信号描述 ● • 在时序电路中,对时钟信号的驱动方法有如下几种描述方式: • 1)进程的敏感信号是时钟信号,在进程内部用if 语句描述时钟的边沿条件。 • 【例4-16】时钟信号的if描述 • process (clock_signal) • begin • if (clock_edge_condition) then • signal_out <= signal_in ; • ┇ • 其它时序语句 • ┇ • end if ; • end process ;
数字逻辑单元设计 第四章 时钟信号描述 ● • 2)在进程中用wait until语句描述时钟信号,此时进程将没有敏感信号。 • 【例4-17】时钟信号的wait until描述 • process • begin • wait until (clock_edge_condition); • signal_out <= signal_in ; • ┇ • 其它时序语句 • ┇ • end process ;
数字逻辑单元设计 第四章 时钟信号描述 ● • 注意: • 1)在对时钟边沿说明时,一定要注明是上升沿还是下降沿。 • 2)一个进程中只能描述一个时钟信号。 • 3)wait until 语句只能放在进程的最前面或最后面。
数字逻辑单元设计 第四章 复位信号描述 ● • 前面已经提到,根据复位和时钟信号的关系不同。时序电路分为同步复位电路和异步复位电路两大类。 • 1、同步复位描述 • 同步复位指:当复位信号有效,并且在给定的时钟边沿有效时,时序电路才被复位。 • 在同步复位电路中,在只有以时钟为敏感信号的进程中定义。
数字逻辑单元设计 第四章 复位信号描述 ● 【例4-18】同步复位的VHDL描述 process (clock_signal) begin if (clock_edge_condition) then if (reset_condition) then signal_out <= reset_value; else signal_out <= signal_in ; ┇ end if ; end if ; end process ;
数字逻辑单元设计 第四章 复位信号描述 ● • 2、异步复位描述 • 异步复位指:当复位信号有效时,时序电路就被复位。在异步复位电路中,进程的敏感信号表中除时钟信号外,还有复位信号。
数字逻辑单元设计 第四章 复位信号描述 ● • 【例4-19】异步复位的VHDL描述 • process (reset_signal, clock_signal) • begin • if (reset_condition) then • signal_out <= reset_value; • elsif (clock_edge_condition) then • signal_out <= signal_in ; • ┇ • end if ; • end process ;
数字逻辑单元设计 第四章 触发器设计 ● • 触发器是时序逻辑电路的最基本单元,触发器具有“记忆”能力。 • 根据沿触发、复位和置位方式的不同触发器可以有多种实现方式。在PLD中经常使用的触发器有D触发器、JK触发器和T触发器等。
数字逻辑单元设计 第四章 触发器设计 ● 【例4-20】带时钟使能和异步复位/置位的D触发器的VHDL描述。D触发器是数字电路中应用最多的一种时序电路。表4.1给出了带时钟使能和异步复位/置位的D触发器的真值表。
数字逻辑单元设计 第四章 触发器设计 ● process(clk,clr,pre,c) begin if(clr=’1’) then q_tmp<=’0’; elsif(pre=’1’) then q_tmp<=’1’; elsif rising_edge(clk) then if(ce=’1’) then q_tmp<=d; else q_tmp<=q_tmp; end if; end if; end process; end rtl; Library ieee; Useieee.std_logic_1164.all; Entity fdd is Port(clk,d,clr,pre,ce : in std_logic; q : out std_logic); end fdd; architecture rtl of dff is signal q_tmp : std_logic; begin q<=q_tmp;
数字逻辑单元设计 第四章 锁存器设计 ● • 锁存器和触发器不同之处,就在于触发方式的不同,触发器是靠敏感信号的边沿出发,而锁存器是靠敏感信号的电平触发。下面给出锁存器的VHDL描述。
数字逻辑单元设计 第四章 锁存器设计 ● 【例4-23】锁存器的VHDL描述 Library ieee; Use ieee.std_logic_1164.all; Entity latch is Port(gate,data,set : in std_logic; Q : out std_logic); End latch; Architecture rtl of latch is Begin process(gate,data,set) Begin if(set=’0’) then Q<=’1’; elsif(gate=’1’) then Q<=data; end if; end process; end rtl;
数字逻辑单元设计 第四章 计数器设计 ● • 根据计数器的触发方式不同,计数器可以分为:同步计数器和异步计数器两种。当赋予计数器更多的功能时,计数器的功能就非常复杂了。需要注意的是,计数器是常用的定时器的核心部分,当计数器输出控制信号时,计数器也就变成了定时器了。所以只要掌握了计数器的设计方法,就可以很容易的设计定时器。本书中主要介绍同步计数器的设计。 • 同步计数器指在时钟脉冲(计数脉冲)的控制下,计数器做加法或减法的运算。
数字逻辑单元设计 第四章 计数器设计 ● • Process(clr,clk) • Begin • If(clr=’1’) then • Count_tmp<=”000000”; • Elsif rising_edge(clk) then • If (dir=’1’) then • Count_tmp<=count_tmp+1; • Else • Count_tmp<=count_tmp-1; • End if; • End if; • End process; • End rtl; • 【例4-24】可逆计数器的描述 • Library ieee; • Use ieee.std_logic_1164.all; • Use ieee.std_logic_unsigned.all; • Entity updowncounter64 is • Port(clk,clr,dir : in std_logic; • Q : out std_logic_vector(4 downto0)); • End updowncounter64; • Architecture rtl of updowncounter64 is • Signal count_tmp: std_logic_vector(4downto 0); • Begin • Q<=count_tmp;
数字逻辑单元设计 第四章 计数器设计 ● 【例4-25】四比特带有最大计数限制的计数器VHDL描述 library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; entity counters_8 is generic (MAX : integer := 16); port(C, CLR : in std_logic; Q : out integer range 0 to MAX-1); end counters_8; architecture archi of counters_8 is signal cnt : integer range 0 to MAX-1; begin Q <= cnt; process (C, CLR) begin if (CLR='1') then cnt <= 0; elsif (rising_edge(C)) then cnt <= (cnt + 1) mod MAX ; end if; end process; end archi;
数字逻辑单元设计 第四章 移位寄存器设计 ● • 在VHDL语言中,对移位寄存器的描述有三种方式: • 1)并置操作符 • shreg <= shreg (6 downto 0) & SI; • 2)FOR-LOOP语句 • for i in 0 to 6 loop • shreg(i+1) <= shreg(i); • end loop; • shreg(0) <= SI; • 3)预定义的移位操作符SLL或SRL等
数字逻辑单元设计 第四章 移位寄存器设计 ● • 1、预定义的移位操作符 • (1)算术左移的VHDL描述 • <signed_sig>/<unsigned_sig> sla <shift_amount_in_integer> • (2)逻辑左移的VHDL描述 • <signed_sig>/<unsigned_sig> sll <shift_amount_in_integer> • (3)算术右移的VHDL描述 • <signed_sig>/<unsigned_sig> sra <shift_amount_in_integer> • (4)逻辑右移的VHDL描述 • <signed_sig>/<unsigned_sig> srl <shift_amount_in_integer>
数字逻辑单元设计 第四章 移位寄存器设计 ● 【例4-26】移位操作符实现逻辑左移的VHDL描述 library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity logical_shifters_2 is port(DI : in unsigned(7 downto 0); SEL : in unsigned(1 downto 0); SO : out unsigned(7 downto 0)); end logical_shifters_2; architecture archi of logical_shifters_2 is begin process(<clock>) begin if ( <clock>'event and <clock> ='1') then case SEL is when "00" => SO<= DI ; when "01" => SO <= DI sll 1; when "10" => SO<= DI sll 2; when "11" => SO <=DI sll 3; when others => SO<= DI ; end case; end if; end process; end archi;