1 / 88

何宾 2008.10

EDA 原理及应用. 何宾 2008.10. 第四章. 第 4 章. 数字逻辑单元设计 - 本章概要. 在复杂数字系统中,其结构总可以用若干基本逻辑单元的组合进行描述。 基本逻辑单元一般分为组合逻辑电路和时序电路两大类。在此基础上,可以更进一步进行组合。 本章所介绍的存储器、运算单元和有限自动状态机就是由基本逻辑单元组合而成的。 本章首先介绍基本的组合逻辑电路和时序电路设计, 然后介绍在数字系统设计中普遍使用的存储器电路、运算 单元和有限自动状态机。. 数字逻辑单元设计. 第四章. 基本逻辑门电路设计. ●.

zoie
Download Presentation

何宾 2008.10

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. EDA原理及应用 何宾 2008.10

  2. 第四章 第 4章 数字逻辑单元设计-本章概要 • 在复杂数字系统中,其结构总可以用若干基本逻辑单元的组合进行描述。 • 基本逻辑单元一般分为组合逻辑电路和时序电路两大类。在此基础上,可以更进一步进行组合。 • 本章所介绍的存储器、运算单元和有限自动状态机就是由基本逻辑单元组合而成的。 • 本章首先介绍基本的组合逻辑电路和时序电路设计, • 然后介绍在数字系统设计中普遍使用的存储器电路、运算 • 单元和有限自动状态机。

  3. 数字逻辑单元设计 第四章 基本逻辑门电路设计 ● • 对基本逻辑门的操作主要有:与、与非、或、或非、异或、异或非和非操作。通过使用VHDL语言中描述基本逻辑门电路操作的关键字:and(与),nand(与非),or(或),nor(或非),xor(异或),xnor(异或非),not(非)来实现对基本逻辑门的操作。一堆复杂的逻辑门操作总可以化简为集中基本逻辑门操作的组合。

  4. 数字逻辑单元设计 第四章 基本逻辑门电路设计 ● 【例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;

  5. 数字逻辑单元设计 第四章 编码器和译码器设计 ● • 在数字系统中,常常会将某一信息用特定的代码进行描述,这称为编码过程。编码过程可以通过编码器电路实现。同时,将某一特定的代码翻译成原始的信息,这称为译码过程。译码过程可以通过译码器电路实现。

  6. 数字逻辑单元设计 第四章 编码器设计 ● • 将某一信息用一组按一定规律排列的二进制代码描述称为编码。典型的有8421码、BCD码等。在使用VHDL语言设计编码器时,通过使用CASE和IF语句实现对编码器的描述。

  7. 数字逻辑单元设计 第四章 编码器设计 ● 【例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;

  8. 数字逻辑单元设计 第四章 译码器设计 ● • 译码的过程实际上就是编码过程的逆过程,即将一组按一定规律排列的二进制数还原为原始的信息。下面以最常用的3:8译码器为例,给出其VHDL语言描述。

  9. 数字逻辑单元设计 第四章 译码器设计 ●

  10. 数字逻辑单元设计-译码器设计 第四章 • 【例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;

  11. 数字逻辑单元设计 第四章 数据选择器设计 ● • CASE和IF语句描述数据缓冲器 • 在数字系统设计中,常使用CASE和IF语句描述数据缓冲器。下面给出这两种描述方法。

  12. 数字逻辑单元设计-数据选择器设计 第四章 • 【例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;

  13. 数字逻辑单元设计-数据选择器设计 第四章 • 【例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;

  14. 数字逻辑单元设计 第四章 图4.5 三态缓冲实现4选1多路选择器 三态缓冲描述数据选择器 ● • 使用三态缓冲语句也可以描述多路数据选择器。图4.5给出了4选1多路选择器的三态的原理。

  15. 数字逻辑单元设计 第四章 三态缓冲描述数据选择器 ● • 【例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;

  16. 数字逻辑单元设计 第四章 数字比较器 ● • 比较器就是对输入数据进行比较,并判断其大小的逻辑电路。在数字系统中,比较器是基本的组合逻辑单元之一,比较器主要是使用关系运算符实现的。

  17. 数字逻辑单元设计 第四章 数字比较器 ● • 【例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中的>、>=、<、<=、=、 • /=,这几种关系运算符及其它们的组合,可以设计出具有复杂比 • 较功能的比较器。

  18. 数字逻辑单元设计 第四章 运算单元 ● • 数据运算单元主要包含加法器、减法器、乘法器和除法器,由这四种运算单元和逻辑运算单元一起,可以完成复杂数学运算。在VHDL语言中,支持的几种运算有:加(+)、减(-)、乘(*)、除(/)、取余(MOD)、幂乘(**)。

  19. 数字逻辑单元设计 第四章 加法器设计 ● • 在VHDL描述加法器时,使用’+’运算符比门级描述更简单。下面给出带进位输入和输出的无符号的8比特加法器的VHDL描述。

  20. 数字逻辑单元设计 第四章 加法器设计 ● • 【例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;

  21. 数字逻辑单元设计 第四章 减法器设计 ● • 减法是加法的反运算,采用VHDL语言的‘-’符号描述减法器,比用门级描述更简单。下面给出一个无符号8位带借位的减法器的VHDL描述。

  22. 数字逻辑单元设计 第四章 减法器设计 ● • 【例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;

  23. 数字逻辑单元设计 第四章 乘法器设计 ● • 用VHDL语言实现乘法器时,乘积和符号应该为2的幂次方。PLD的优点就是在内部集成了乘法器的硬核,具体在IP核的设计中详细讨论。

  24. 数字逻辑单元设计 第四章 乘法器设计 ● • 【例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;

  25. 数字逻辑单元设计 第四章 除法器设计 ● • 除法器可以用VHDL语言的‘/’符号实现,需要注意的是在使用‘/’符号进行除法运算时,除数必须是常数,而且是2的整数幂。因为除法器的运行有这样的限制,实际上除法也可以用移位运算实现。下面给出一个除法器的VHDL描述。

  26. 数字逻辑单元设计 第四章 除法器设计 ● • 【例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;

  27. 数字逻辑单元设计-总线缓冲器设计 第四章 • 【例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;

  28. 数字逻辑单元设计-总线缓冲器设计 第四章 • 【例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; • 从上面的两个例子中可以看出,使用条件并行语句描述三态门比使用进程要简单的多。

  29. 数字逻辑单元设计-总线缓冲器设计 第四章 【例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;

  30. 数字逻辑单元设计 第四章 时序逻辑电路设计 ● • 时序逻辑电路的输出状态不仅与输入变量的状态有关,而且还与系统原先的状态有关。时序电路最重要的特点是存在着记忆单元部分,时序电路主要包括:时钟和复位、基本触发器、计数器、移位寄存器等。

  31. 数字逻辑单元设计 第四章 时钟和复位设计 ● • 时序电路由时钟驱动,时序电路只有在时钟信号的边沿到来时,其状态才发生改变。在数字系统中,时序电路的时钟驱动部分一般包括时钟信号和系统复位信号。根据时钟和复位的描述不同,时序电路一般分成同步复位电路和异步复位电路两类。

  32. 数字逻辑单元设计 第四章 时钟信号描述 ● • 在时序电路中,不论采用什么方法描述时钟信号,必须指明时钟的边沿条件(clock edge condition)。时钟沿条件有上升沿和下降沿两种。 • 时钟的上升沿条件可以用下面的语句描述: • clock’event and clock = ‘1’ • rising_edge(clock) •  时钟的下降沿条件可以用下面的语句描述: • clock’event and clock = ‘0’ • falling_edge(clock)

  33. 数字逻辑单元设计 第四章 时钟信号描述 ● • 在时序电路中,对时钟信号的驱动方法有如下几种描述方式: • 1)进程的敏感信号是时钟信号,在进程内部用if 语句描述时钟的边沿条件。 • 【例4-16】时钟信号的if描述 • process (clock_signal) • begin • if (clock_edge_condition) then • signal_out <= signal_in ; • ┇ • 其它时序语句 • ┇ • end if ; • end process ;

  34. 数字逻辑单元设计 第四章 时钟信号描述 ● • 2)在进程中用wait until语句描述时钟信号,此时进程将没有敏感信号。 • 【例4-17】时钟信号的wait until描述 • process • begin • wait until (clock_edge_condition); • signal_out <= signal_in ; • ┇ • 其它时序语句 • ┇ • end process ;

  35. 数字逻辑单元设计 第四章 时钟信号描述 ● • 注意: • 1)在对时钟边沿说明时,一定要注明是上升沿还是下降沿。 • 2)一个进程中只能描述一个时钟信号。 • 3)wait until 语句只能放在进程的最前面或最后面。

  36. 数字逻辑单元设计 第四章 复位信号描述 ● • 前面已经提到,根据复位和时钟信号的关系不同。时序电路分为同步复位电路和异步复位电路两大类。 • 1、同步复位描述 • 同步复位指:当复位信号有效,并且在给定的时钟边沿有效时,时序电路才被复位。 •   在同步复位电路中,在只有以时钟为敏感信号的进程中定义。

  37. 数字逻辑单元设计 第四章 复位信号描述 ● 【例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 ;

  38. 数字逻辑单元设计 第四章 复位信号描述 ● • 2、异步复位描述 • 异步复位指:当复位信号有效时,时序电路就被复位。在异步复位电路中,进程的敏感信号表中除时钟信号外,还有复位信号。

  39. 数字逻辑单元设计 第四章 复位信号描述 ● • 【例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 ;

  40. 数字逻辑单元设计 第四章 触发器设计 ● • 触发器是时序逻辑电路的最基本单元,触发器具有“记忆”能力。 •  根据沿触发、复位和置位方式的不同触发器可以有多种实现方式。在PLD中经常使用的触发器有D触发器、JK触发器和T触发器等。

  41. 数字逻辑单元设计 第四章 触发器设计 ● 【例4-20】带时钟使能和异步复位/置位的D触发器的VHDL描述。D触发器是数字电路中应用最多的一种时序电路。表4.1给出了带时钟使能和异步复位/置位的D触发器的真值表。

  42. 数字逻辑单元设计 第四章 触发器设计 ● 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;

  43. 数字逻辑单元设计 第四章 锁存器设计 ● • 锁存器和触发器不同之处,就在于触发方式的不同,触发器是靠敏感信号的边沿出发,而锁存器是靠敏感信号的电平触发。下面给出锁存器的VHDL描述。

  44. 数字逻辑单元设计 第四章 锁存器设计 ● 【例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;

  45. 数字逻辑单元设计 第四章 计数器设计 ● • 根据计数器的触发方式不同,计数器可以分为:同步计数器和异步计数器两种。当赋予计数器更多的功能时,计数器的功能就非常复杂了。需要注意的是,计数器是常用的定时器的核心部分,当计数器输出控制信号时,计数器也就变成了定时器了。所以只要掌握了计数器的设计方法,就可以很容易的设计定时器。本书中主要介绍同步计数器的设计。 • 同步计数器指在时钟脉冲(计数脉冲)的控制下,计数器做加法或减法的运算。

  46. 数字逻辑单元设计 第四章 计数器设计 ● • 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;

  47. 数字逻辑单元设计 第四章 计数器设计 ● 【例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;

  48. 数字逻辑单元设计 第四章 移位寄存器设计 ● • 在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等

  49. 数字逻辑单元设计 第四章 移位寄存器设计 ● • 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>

  50. 数字逻辑单元设计 第四章 移位寄存器设计 ● 【例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;

More Related