Presentation is loading. Please wait.

Presentation is loading. Please wait.

EDA原理及应用 何宾 2008.10.

Similar presentations


Presentation on theme: "EDA原理及应用 何宾 2008.10."— Presentation transcript:

1 EDA原理及应用 何宾

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

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

4 数字逻辑单元设计 第四章 基本逻辑门电路设计 【例4-1】基本门电路的设计 Library ieee;
【例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<= " " when "0001", --1 " " when "0010", --2 " " when "0011", --3 " " when "0100", --4 " " when "0101", --5 " " when "0110", --6 " " when "0111", --7 " " when "1000", --8 " " when "1001", --9 " " when "1010", --A " " when "1011", --b " " when "1100", --C " " when "1101", --d " " when "1110", --E " " when "1111", --F " " when others; --0 end rtl;

11 数字逻辑单元设计 第四章 数据选择器设计 CASE和IF语句描述数据缓冲器
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) 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) 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 数字逻辑单元设计 第四章 数字比较器 从上面的例子可以看出,使用VHDL中的>、>=、<、<=、=、
【例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;
【例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语句描述时钟信号,此时进程将没有敏感信号。
 2)在进程中用wait until语句描述时钟信号,此时进程将没有敏感信号。 【例4-17】时钟信号的wait until描述 process begin wait until (clock_edge_condition); signal_out <= signal_in ; 其它时序语句 end process ;

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

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

37 数字逻辑单元设计 第四章 复位信号描述 【例4-18】同步复位的VHDL描述 process (clock_signal) begin
【例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 process ;

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

39 数字逻辑单元设计 第四章 复位信号描述 【例4-19】异步复位的VHDL描述
【例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触发器的真值表。 输入 输出 CLR PRE CE D C Q 1 X 无变化

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 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) if(set=’0’) then Q<=’1’; elsif(gate=’1’) then Q<=data; end if; end process; end rtl;

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

46 数字逻辑单元设计 第四章 计数器设计 ● Process(clr,clk) 【例4-24】可逆计数器的描述 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 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 downto 0)); End updowncounter64; Architecture rtl of updowncounter64 is Signal count_tmp: std_logic_vector(4 downto 0); Begin Q<=count_tmp;

47 数字逻辑单元设计 第四章 计数器设计 ● 【例4-25】四比特带有最大计数限制的计数器VHDL描述 process (C, CLR)
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)并置操作符
在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描述
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;
【例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;

51 数字逻辑单元设计 第四章 移位寄存器设计 2、通过VHDL的类型操作,元件例化、信号连接等不同实现方法实现移位操作运算。下面通过函数调用,元件例化、信号连接等不同实现方法实现一个16位的串行输入、串行输出的移位寄存器。

52 数字逻辑单元设计 第四章 移位寄存器设计 ● 【例4-27】元件例化的方法实现16位
串入/串出移位寄存器的VHDL描述 Library ieee; Use ieee.std_logic_1164.all; Entity shift8 is Port (a,clk : in std_logic; B : out std_logic); End shift8; Architecture rtl of shift8 is Component dff Port(d,clk : in std_logic; Q : out std_logic); End component; Signal z : std_logic_vector(15 downto 0); Begin z(0)<=a; G1: for i in 0 to 15 generate Dffx : dff port map(z(i),clk,z(i+1)); End generate; b<=z(15); end rtl;

53 数字逻辑单元设计 第四章 移位寄存器设计 ● 【例4-28】类型操作实现16位
移位寄存器的VHDL描述 library ieee; use ieee.std_logic_1164.all; entity shift_registers_1 is port(C, SI : in std_logic; SO : out std_logic); end shift_registers_1; architecture archi of shift_registers_1 is signal tmp: std_logic_vector(15 downto 0); begin SO <= tmp(7); process (c) if rising_edge(c) then for i in 0 to 14 loop tmp(i+1) <= tmp(i); end loop; tmp(0) <= SI; end if; end process; end archi;

54 数字逻辑单元设计 第四章 移位寄存器设计 ● architecture archi of shift_registers_5 is
【例4-29】并置操作实现16位串入/ 并出移位寄存器的VHDL描述 library ieee; use ieee.std_logic_1164.all; entity shift_registers_5 is port(C, SI : in std_logic; PO : out std_logic_vector(15 downto 0)); end shift_registers_5; architecture archi of shift_registers_5 is signal tmp: std_logic_vector(7 downto 0); begin PO <= tmp; process (C) if rising_edge(C) then tmp <= tmp(14 downto 0)& SI; end if; end process; end archi;

55 数字逻辑单元设计 第四章 存储器设计   存储器按其类型主要分为只读存储器和随机存储器两种。虽然存储器从其工艺和原理上各不相同,但有一点是相同的,即存储器是单个存储单元的集合体,并且按照顺序排列。其中的每一个存储单元由N位二进制位构成,表示存放的数据的值。   由于这些特点,所以可以用VHDL的类型语句进行描述。  1、用整数描述:    TYPE mem is array(integer range<>) of integer;  2、用位矢量描述:   SUBTYPE wrd IS std_logic_vector(k-1 downto 0);   Type mem is array(0 to 2**w-1) of wrd;

56 数字逻辑单元设计 第四章 存储器设计   需要注意的是,虽然在本节给出了存储器的原理描述和实现方法,但在实际中,尤其是在FPGA的设计中,存储器在FPGA内作为核提供给设计人员进行使用,设计人员只需要对这些核进行配置,就可以生成高性能的存储器模块,根本没有必要用VHDL语言进行原理和功能的描述。

57 数字逻辑单元设计 第四章 ROM设计  只读存储器的数据被事先保存到了每个存储单元中,在PLD中保存数据的方法有很多。当对ROM进行读操作时,只要在控制信号的控制下,对操作的单元给出读取的数值即可。 【例4-30】ROM的VHDL描述   EN为ROM的使能信号,   ADDR为ROM的地址信号,   CLK为ROM的时钟信号,   DATA为数据信号。 图4.16 ROM的结构图

58 数字逻辑单元设计 第四章 ROM设计 ● library ieee; use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all; entity rams_21a is port (clk : in std_logic; en : in std_logic; addr : in std_logic_vector(5 downto 0); data : out std_logic_vector(19 downto 0)); end rams_21a;

59 数字逻辑单元设计 第四章 ROM设计 ● architecture syn of rams_21a is
type rom_type is array (63 downto 0) of std_logic_vector (19 downto 0); signal ROM : rom_type:= (X"0200A", X"00300", X"08101", X"04000", X"08601", X"0233A",X"00300", X"08602", X"02310", X"0203B", X"08300", X"04002",X"08201", X"00500", X"04001", X"02500", X"00340",X"00241",X"04002", X"08300", X"08201", X"00500", X"08101", X"00602",X"04003", X"0241E", X“00301”, X"00102", X"02122", X"02021",X"00301", X"00102", X"02222", X"04001", X"00342", X"0232B",X"00900", X"00302", X"00102", X"04002", X"00900", X"08201",X"02023", X"00303", X"02433", X"00301", X"04004", X"00301",X"00102", X"02137",X"02036", X"00301", X"00102", X"02237", X"04004", X"00304", X"04040", X"02500", X"02500", X"02500",X"0030D", X"02341", X"08201", X"0400D");

60 数字逻辑单元设计 第四章 ROM设计 ● begin process (clk) if rising_edge(clk) then
  if (en = '1') then    data <= ROM(conv_integer(addr));   end if;  end if; end process; end syn;

61 数字逻辑单元设计 第四章 RAM设计   RAM和ROM的区别,在于RAM有读写两种操作,而ROM只有读操作。另外,RAM对读写的时序也有着严格的要求。  【例4-31】一个单端口RAM的VHDL的描述 EN为RAM使能信号,   WE为RAM写信号,   DI为RAM数据输入信号,   ADDR为RAM地址信号,   CLK为RAM时钟信号,   DO为RAM数据输出信号。

62 数字逻辑单元设计 第四章 RAM设计 ● architecture syn of rams_01 is
 type ram_type is array (63 downto 0) of std_logic_vector (15 downto 0);  signal RAM: ram_type; begin  process (clk)  begin  if clk'event and clk = '1' then   if en = '1' then    if we = '1' then    RAM(conv_integer(addr)) <= di;    end if;    do <= RAM(conv_integer(addr)) ;   end if;  end if;  end process; end syn; library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity rams_01 is port (clk : in std_logic; we : in std_logic; en : in std_logic; addr : in std_logic_vector(5 downto 0); di : in std_logic_vector(15 downto 0); do : out std_logic_vector(15 downto 0)); end rams_01;

63 数字逻辑单元设计 第四章 FIFO设计 先进先出的对列FIFO在数字系统设计中有着非常重要的应用,它经常用来对付时间不同步情况下的数据操作问题,在这里通过VHDL语言进行了描述。但在实际的PLD设计时,设计者可以很方便的使用EDA厂商提供的IP核自动生成FIFO,而无须用VHDL语言进行复杂的原理描述。 FIFO和RAM有很多相同的地方,唯一不同的是,FIFO的操作没有地址,而只有内部的指针,保证数据在FIFO中先入先出顺序的正确性。FIFO一般由下列单元:存储单元,写指针,读指针、满、空标志和读写控制信号等构成。

64 数字逻辑单元设计 第四章 FSM设计   有限自动状态机FSM(Finate State Machine)的设计是复杂数字系统中非常重要的一部分,是实现高效率高可靠性逻辑控制的重要途径。大部分数字系统都是由控制单元和数据单元组成的。数据单元负责数据的处理和传输,而控制单元主要是控制数据单元的操作的顺序。而在数字系统中,控制单元往往是通过使用有限状态机实现的,有限状态机接受外部信号以及数据单元产生的状态信息,产生控制信号序列。

65 数字逻辑单元设计 第四章 FSM原理

66 数字逻辑单元设计 第四章 FSM原理   从上面的数学模型可以看出,如果在数字系统中实现有限状态机,则应该包含三部分:状态寄存器;下状态转移逻辑;输出逻辑。   描述有限状态机的关键是状态机的状态集合以及这些状态之间的转移关系。描述这种转换关系除了数学模型外,还可以用状态转移图或状态转移表来实现。   状态转移图由三部分组成:表示不同状态的状态点、连接这些状态点的有向箭头以及标注在这些箭头上的状态转移条件。   状态转移表采用表格的方式描述状态机。状态转移表由三部分组成:当前状态、状态转移事件和下一状态。

67 数字逻辑单元设计 第四章 FSM分类 状态机分类很多,主要分为Moore状态机、Mealy状态机和扩展有限状态机。
 状态机分类很多,主要分为Moore状态机、Mealy状态机和扩展有限状态机。  下面就Moore状态机、Mealy状态机的原理和应用进行详细的介绍。

68 数字逻辑单元设计 第四章 Mealy型状态机 Mealy型状态机的输出由状态机的输入和状态机的状态共同决定;
Mealy型状态机的输出由状态机的输入和状态机的状态共同决定; 【例4-31】Mealy型状态机的VHDL描述

69 数字逻辑单元设计 第四章 Mealy型状态机 begin
process (state, <input1>, <input2>, ...) 定义过程,输出和输入及状态有关 begin if (state = st3_<name> and <input1> = '1') then <output>_i <= '1'; else <output>_i <= '0'; end if; end process;

70 数字逻辑单元设计 第四章 Mealy型状态机 ●
process (state, <input1>, <input2>, ...) 定义过程,确定状态的迁移 begin next_state <= state; case (state) is when st1_<name> => if <input_1> = '1' then next_state <= st2_<name>; end if; when st2_<name> => if <input_2> = '1' then next_state <= st3_<name>; when st3_<name> => next_state <= st1_<name>; when others => end case; end process;

71 数字逻辑单元设计 第四章 Moore型状态机 Moore型状态机的输出仅与状态机的状态有关,与状态机的输入无关。

72 数字逻辑单元设计 第四章 Moore型状态机 ● 【例4-31】Moore型状态机的VHDL语言的描述
type state_type is (st1_<name_state>, st2_<name_state>, ...); --定义状态 signal state, next_state : state_type; signal <output>_i : std_logic; -- example output signal 定义所有输出信号 SYNC_PROC: process (<reset>,<clock>) 定义状态的迁移 begin if (<reset> = '1') then state <= st1_<name_state>; <output> <= '0'; elsif (rising_edge(<clock>)) then state <= next_state; <output> <= <output>_i; 定义所有的输出 end if; end process;

73 数字逻辑单元设计 第四章 Moore型状态机 process (state) begin
process (state) begin if state = st3_<name> then <output>_i <= '1'; else <output>_i <= '0'; end if; end process;

74 数字逻辑单元设计 第四章 Moore型状态机 ●
process (state, <input1>, <input2>, ...) 定义不同状态下的输出 begin next_state <= state; case (state) is when st1_<name> => if <input_1> = '1' then next_state <= st2_<name>; end if; when st2_<name> => if <input_2> = '1' then next_state <= st3_<name>; when st3_<name> => next_state <= st1_<name>; when others => end case; end process;

75 数字逻辑单元设计 第四章 Moore型状态机
虽然在这里将两种类型的状态机加以区分,但是在实际的状态机的设计中,设计人员根本不需要这些差别,只要满足状态机设计的规则和状态机运行的条件,采用任何一种状态机都可以实现,并且设计人员可以在实际的设计过程中形成自己独特的状态机的VHDL的设计风格。

76 数字逻辑单元设计 第四章 FSM设计原则 有限状态机的设计应遵循以下原则: 1、分析控制器设计指标, 建立系统算法模型图,即状态转移图;
 有限状态机的设计应遵循以下原则:  1、分析控制器设计指标, 建立系统算法模型图,即状态转移图;  2、分析被控对象的时序状态, 确定控制器有限状态机的各个状态及输入、输出条件;  3、应用VHDL 语言完成状态机的描述。

77 数字逻辑单元设计 第四章 FSM设计优点 采用有限状态机描述有以下方面的优点:
 采用有限状态机描述有以下方面的优点:  1、可以采用不同的编码风格,在描述状态机时,设计者常采用的编码有二进制、格雷码、one hot编码,用户可以根据自己的需要在综合时确定,而不需要修改源文件或修改源文件中的编码格式以及状态机的描述。  2、可以实现状态的最小化,(如果one hot编码,控制信号数量庞大)。  3、设计灵活,将控制单元与数据单元分离开。

78 FSM的状态可以采用的状态编码规则有很多,在Xilinx的状态编码
数字逻辑单元设计 第四章 状态编码   FSM的状态可以采用的状态编码规则有很多,在Xilinx的状态编码    “One_Hot”;    “Gray”;    ”Compact”;    ”Johnson”;    “Sequential”;    “Speed1”;    “User”的编码方式;   下面对这些状态编码的性能进行简单的介绍。

79 数字逻辑单元设计 1、One_Hot状态编码 第四章 状态编码
  1、One_Hot状态编码   ONE HOT的编码方案对每一个状态采用一个触发器,即4个状态的状态机需4个触发器。同一时间仅1个状态位处于有效电平(如逻辑“l”)。在使用One_Hot状态编码时,触发器使用较多,但逻辑简单,速度快。

80 数字逻辑单元设计 第四章 状态编码 2、Gray状态编码
  2、Gray状态编码   Gray码编码每次仅一个状态位的值发生变化。在使用Gray状态编码时,触发器使用较少,速度较慢,不会产生两位同时翻转的情况。采用格雷码进行状态编码时,采用T触发器是最好的实现方式。

81 数字逻辑单元设计 第四章 状态编码 3、Compact状态编码
  3、Compact状态编码 Compact状态编码能够使所使用的状态变量位和触发器的数目变得最少。该编码技术基于超立方体浸润技术。当进行面积优化的时候可以采用Compact状态编码

82 数字逻辑单元设计 第四章 状态编码 4、Johnson状态编码 Johnson状态编码能够使状态机保持一个很长的路径,而不会产生分支。
 4、Johnson状态编码   Johnson状态编码能够使状态机保持一个很长的路径,而不会产生分支。 5、Sequential状态编码   Sequential状态编码采用一个可标示的长路径,并采用了连续的基2编码描述这些路径。下一个状态等式被最小化。 6、Speed1状态编码   Speed1状态编码用于速度的优化。状态寄存器中所用的状态的位数取决于特定的有限自动状态及FSM,但一般情况下它要比FSM的状态要多。

83 数字逻辑单元设计 第四章 状态定义   设计者可以在使用状态机之前应该定义状态变量的枚举类型,定义可以在状态机描述的源文件中,也可以在专门的程序包中。  【例4-32】状态的定义   TYPE main_con_state IS (state1,state2) ;  【例4-33】状态变量的定义 signal current_state :main_con_state; signal next_state: main_con_state;

84 数字逻辑单元设计 第四章 状态机描述规则   状态机描述方式: 三进程; 两进程; 单进程;

85 数字逻辑单元设计 第四章 状态机描述规则 1、单进程状态机的实现方法
  1、单进程状态机的实现方法   如图4.7单进程的mealy状态机所示,采用单进程状态机描述时,状态的变化、状态寄存器和输出功能描述用一个进程进行描述。

86 数字逻辑单元设计 第四章 状态机描述规则 2、双进程状态机的实现规则
 2、双进程状态机的实现规则 如图4.8所示,与单进程状态机不同的是,采用双进程状态机时,输出函数用一个进程描述,而状态寄存器和下一状态函数用另一个进程描述。

87 数字逻辑单元设计 第四章 状态机描述规则 3、三进程状态机的实现规则
  3、三进程状态机的实现规则   如图4.9所示,与双进程状态机不同的是,采用三进程状态机时,输出函数用一个进程描述,而状态寄存器和下一状态函数分别用两个进程描述。

88 第4章 习 题 1、用VHDL语言设计一个3:8译码器。 2、用VHDL语言描述D触发器和JK触发器。 3、用VHDL语言设计一个16位的计数器。 4、设计一个100分频的分频器。 5、使用不同的方法完成一个32位的移位寄存器的设计。 6、比较RAM和FIFO的特点和区别。 7、用VHDL语言描述一个512*16(深度512,数据宽度16比特)的单端口RAM存储器。 8、用VHDL语言描述一个512*16的先进先出队列FIFO。 9、用VHDL语言描述一个y=a*b+a*c的乘法和加法单元的实现。 10、用VHDL语言描述一个y=(a-b)/16的乘减运算的实现。 11、有限自动状态机的分类及其特点。 12、有限自动状态机的编码方式及其特点。 13、有限自动状态机的描述规则及其特点。


Download ppt "EDA原理及应用 何宾 2008.10."

Similar presentations


Ads by Google