Download presentation
Presentation is loading. Please wait.
1
数字逻辑单元设计 何宾
2
数字逻辑单元设计-本章概要 在复杂数字系统中,其结构总可以用若干基本逻辑单元 的组合进行描述。
基本逻辑单元一般分为组合逻辑电路和时序电路两大类。 在此基础上,可以更进一步进行组合. 本章所介绍的存储器、运算单元和有限自动状态机就是 由基本逻辑单元组合而成的。 本章首先介绍基本的组合逻辑电路和时序电路设计, 然后介绍在数字系统设计中普遍使用的存储器电路、运算 单元和有限自动状态机。
3
数字逻辑单元设计-基本逻辑门电路设计 对基本逻辑门的操作主要有:与、与非、或、或非、 异或、异或非和非操作。通过使用VHDL语言中描述基本
逻辑门电路操作的关键字:and(与),nand(与非), or(或),nor(或非),xor(异或),xnor(异或 非),not(非)来实现对基本逻辑门的操作。一堆复杂 的逻辑门操作总可以化简为集中基本逻辑门操作的组合。
4
Use ieee.std_logic_1164.all; Entity gate is
数字逻辑单元设计-基本逻辑门电路设计 基本门电路的设计 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码等。在使用
数字逻辑单元设计-编码器设计 将某一信息用一组按一定规律排列的二进制代码描 述称为编码。典型的有8421码、BCD码等。在使用 VHDL语言设计编码器时,通过使用CASE和IF语句实现 对编码器的描述。
7
数字逻辑单元设计-编码器设计 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
数字逻辑单元设计-译码器设计 十六进制数的共阳极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语句描述数 据选择器。下面给出这两种描述方法。
12
数字逻辑单元设计-数据选择器设计设计 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选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
数字逻辑单元设计-数字比较器 比较器就是对输入数据进行比较,并判断其大小的逻 辑电路。在数字系统中,比较器是基本的组合逻辑单元之
比较器就是对输入数据进行比较,并判断其大小的逻 辑电路。在数字系统中,比较器是基本的组合逻辑单元之 一,比较器主要是使用关系运算符实现的。
15
从上面的例子可以看出,使用VHDL中的>、>=、<、<=、=、
数字逻辑单元设计-数字比较器 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中的>、>=、<、<=、=、 /=,这几种关系运算符及其它们的组合,可以设计出具有复杂比 较功能的比较器。
16
总线是一组相关信号的集合。在计算机系统常用的
数字逻辑单元设计-总线缓冲器 总线是一组相关信号的集合。在计算机系统常用的 总线有数据总线、地址总线和控制总线。由于总线上 经常需要连接很多的设备,因此必须正确的控制总线 的输入和输出,这样才不会产生总线访问的冲突,下 面将介绍总线三态控制和双向控制的VHDL描述方法。
17
数字逻辑单元设计-总线缓冲器 三态门的进程描述 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) if(en=’1’) then dout<=din; else dout<=’ZZZZZZZZ’; end if; end process; end rtl;
18
数字逻辑单元设计-总线缓冲器 三态门的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; 从上面的两个例子中可以看出,使用条件并行语句描述三态 门比使用进程要简单的多。
19
数字逻辑单元设计-总线缓冲器 双向总线缓冲器的描述 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_in<=a; end rtl;
20
数字逻辑单元设计-运算单元 数据运算单元主要包含加法器、减法器、乘法器和除 法器,由这四种运算单元和逻辑运算单元一起,可以完成
数据运算单元主要包含加法器、减法器、乘法器和除 法器,由这四种运算单元和逻辑运算单元一起,可以完成 复杂数学运算。在VHDL语言中,支持的几种运算有:加 (+)、减(-)、乘(*)、除(/)、取余(MOD)、幂 乘(**)。
21
数字逻辑单元设计-加法器设计 在VHDL描述加法器时,使用’+’运算符比门级描 述更简单。下面给出带进位输入和输出的无符号的8
22
数字逻辑单元设计-加法器设计 带进位输入和输出的无符号的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;
23
数字逻辑单元设计-减法器设计 减法是加法的反运算,采用VHDL语言的‘-’符号描述 减法器,比用门级描述更简单。下面给出一个无符号8位
24
数字逻辑单元设计-减法器设计 【例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;
25
数字逻辑单元设计-ALU设计 前面几节介绍了加法器和减法器电路的设计。通过增加一些逻辑操作,设计一个叫做算术/逻辑单元ALU的模块。
26
数字逻辑单元设计-ALU设计 类似于前面的复用开关有选择线一样,ALU也有选择线来控制所要使用的操作。
27
数字逻辑单元设计-ALU设计 设计原理: 1)由于ALU完成8种功能,所以选择线为3位; 2)此外,ALU也提供4位的y输出和四个标志 位。
cf为进位标志; ovf为溢出标志; zf为0标志(当输出为0时,该标志有效), nf为负标志(当输出的第4位为1时,该标志有 效)。
28
数字逻辑单元设计-ALU设计 为了讨论进位标志和溢出标志的不同,考虑一个8位 的加法(最高位为符号位)。
1)当无符号的数的和超过255时,进位标志被设置。 2)当有符号数的和超过了 的范围时,溢出 标志被设置。
29
数字逻辑单元设计-ALU设计 考虑下面的几个例子(最高位为符号位):
1) = =7810=4E16, cf=0, ovf=0 2) =3516+5B16=14410=9016, cf=0, ovf=1 3) =3516+D316=810=10816, cf=1, ovf=0 4) =9E16+D316=-14310=17116, cf=1,ovf=1 当满足条件:(第六位向第七位进位) xor (第七位向cf进位)时,ovf=1
30
数字逻辑单元设计-ALU设计 library IEEE; ---库声明及调用 use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity alu4 is port( a : in std_logic_vector(3 downto 0); b : in std_logic_vector(3 downto 0); alusel : in std_logic_vector(2 downto 0); y : out std_logic_vector(3 downto 0); nf : out std_logic; zf : out std_logic; cf : out std_logic; ovf : out std_logic ); end alu4;
31
数字逻辑单元设计-ALU设计 architecture Behavioral of alu4 is --功能描述 begin
process(a,b,alusel) variable temp : std_logic_vector(4 downto 0):="00000"; variable y_temp : std_logic_vector(3 downto 0):="0000"; cf<='0'; ovf<='0'; case alusel is when "000"=> y_temp:=a; when "001"=> temp:=('0'&a)+('0'&b); y_temp:=temp(3 downto 0); cf<=temp(4); ovf<=temp(3) xor a(3) xor b(3) xor temp(4);
32
数字逻辑单元设计-ALU设计 when "010"=> temp:=('0'&a)-('0'&b);
y_temp:=temp(3 downto 0); cf<=temp(4); ovf<=temp(3) xor a(3) xor b(3) xor temp(4); when "011"=> temp:=('0'&b)-('0'&a);
33
数字逻辑单元设计-ALU设计 when "100"=> y_temp:=not a; when "101"=>
y_temp:=a and b; when "110"=> y_temp:=a or b; when "111"=> y_temp:=a xor b; when others=> y_temp:=a; end case;
34
数字逻辑单元设计-ALU设计 nf<=y_temp(3); y<=y_temp; if(temp="0000") then
zf<='1'; else zf<='0'; end if; end process; end Behavioral;
35
数字逻辑单元设计-乘法器设计 用VHDL语言实现乘法器时,乘积和符号应该 为2的幂次方。PLD的优点就是在内部集成了乘法器
的硬核,具体在IP核的设计中详细讨论。
36
数字逻辑单元设计-乘法器设计 下面给出一个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;
37
数字逻辑单元设计-除法器设计 除法器可以用VHDL语言的‘/’符号实现,需要注意的是 在使用‘/’符号进行除法运算时,除数必须是常数,而且是
2的整数幂。因为除法器的运行有这样的限制,实际上除 法也可以用移位运算实现。下面给出一个除法器的VHDL 描述。
38
数字逻辑单元设计-除法器设计 除法器的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;
39
数字逻辑单元设计-除法器设计(任意除数)
40
数字逻辑单元设计-除法器设计(任意除数)
通过A中的数字向左移位,一次一位地进入移位寄 存器。对于一个A为2n宽度,B为n宽度的除法运算,Q 为2n位。其运算步骤为: 1)每次移位操作; 2)比较R和B。如果,则在商的某一位适当位置上 放上一个1,然后从R中减去B;否则在商的某一适当 位置放上一个0; 3)重复上述步骤,直到移位操作结束;
41
数字逻辑单元设计-除法器设计(任意除数)
除数不为2的整数幂的除法器VHDL描述 library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity div8 is port( numerator : in std_logic_vector(7 downto 0); denominator : in std_logic_vector(3 downto 0); quotient : out std_logic_vector(7 downto 0); remainder : out std_logic_vector(3 downto 0) ); end div8;
42
数字逻辑单元设计-除法器设计(任意除数)
architecture Behavioral of div8 is begin process(numerator,denominator) variable n1 : std_logic_vector(4 downto 0); variable n2 : std_logic_vector(7 downto 0); variable numer : std_logic_vector(7 downto 0); variable d : std_logic_vector(4 downto 0); Begin n1:="00000"; n2:=" "; numer:=numerator; d:='0' & denominator; quotient<=n2(7 downto 0); remainder<=n1(3 downto 0);
43
数字逻辑单元设计-除法器设计(任意除数)
for i in 0 to 7 loop for j in 4 downto 1 loop n1(j):=n1(j-1); end loop; n1(0):=numer(7); for k in 7 downto 1 loop numer(k):=numer(k-1); numer(0):='0'; for l in 7 downto 1 loop n2(l):=n2(l-1); if(n1(4 downto 0)>=d) then n1:=n1-d; n2(0):='1'; else n1:=n1; n2(0):='0'; end if; end process; end Behavioral;
44
时序逻辑电路的输出状态不仅与输入变量的状态有关,
数字逻辑单元设计 -时序逻辑电路设计 时序逻辑电路的输出状态不仅与输入变量的状态有关, 而且还与系统原先的状态有关。时序电路最重要的特点是 存在着记忆单元部分,时序电路主要包括: 1) 基本触发器 2) 计数器 3) 移位寄存器 4) 脉冲宽度调制等。
45
数字逻辑单元设计-触发器设计 触发器是时序逻辑电路的最基本单元,触发器具有“记 忆”能力。 根据沿触发、复位和置位方式的不同触发器可以有多种
触发器是时序逻辑电路的最基本单元,触发器具有“记 忆”能力。 根据沿触发、复位和置位方式的不同触发器可以有多种 实现方式。在PLD中经常使用的触发器有D触发器、JK触 发器和T触发器等。
46
【例4-20】带时钟使能和异 步复位/置位的D触发器的 VHDL描述 D触发器是数字电路中应 用最多的一种时序电路。表
4.1给出了带时钟使能和异 步复位/置位的D触发器的真 值表。 输入 输出 CLR PRE CE D C Q 1 X 无变化 ↑
47
数字逻辑单元设计-D触发器设计 process(clk,clr,pre,c) begin Library ieee;
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;
48
数字逻辑单元设计-JK触发器设计 JK触发器要比D触发器复杂一些。 输入 输出 R S CE J K C Q 1 X ↑ 无变化 翻转
49
数字逻辑单元设计-JK触发器设计 带时钟使能和异步复位/置位的JK 触发器的VHDL描述 Library ieee;
if(r=’1’) then q_tmp<=’0’; elsif(s=’1’) then q_tmp<=’1’; elsif rising_edge(clk) then if(ce=’0’) then q_tmp<=q_tmp; else if(j=’0’ and k=’1’) then elsif(j=’1’ and k=’0’) then elsif(j=’1’ and k=’1’) then q_tmp<=not q_tmp; end if; end process; end rtl; 带时钟使能和异步复位/置位的JK 触发器的VHDL描述 Library ieee; Use ieee.std_logic_1164.all; Entity fdd is Port(s,r,j,k,ce,c: in std_logic; q : out std_logic); end fdd; architecture rtl of dff is signal q_tmp : std_logic; begin q<=q_tmp; process(s,r,c)
50
数字逻辑单元设计-RS触发器设计 输入 输出 R S C Q ↑ 无变化 1
51
数字逻辑单元设计-RS触发器设计 library ieee; use ieee.std_logic_1164.all;
process(clk) begin if rising_edge(clk)then if (s = ‘1’ and r = ‘0’) then q_tmp<=‘1’; elsif (s=‘0’ and r=‘1’) then q_tmp<=’0’; elsif (s=‘0’ and r=‘0’) then q_tmp<=q_tmp; else null; end if; end process; end rtl; library ieee; use ieee.std_logic_1164.all; entity rsff is port(r, s, clk : in std_logic; q, qn :out std_logic); end rsff; architecture rtl of rsff is signal q_tmp : std_logic; begin q<=q_tmp;
52
锁存器和触发器不同之处,就在于触发方式的不同,触
数字逻辑单元设计-锁存器设计 锁存器和触发器不同之处,就在于触发方式的不同,触 发器是靠敏感信号的边沿出发,而锁存器是靠敏感信号的 电平触发。下面给出锁存器的VHDL描述。
53
数字逻辑单元设计-锁存器设计 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;
54
数字逻辑单元设计-计数器设计 根据计数器的触发方式不同,计数器可以分为:同步计 数器和异步计数器两种。当赋予计数器更多的功能时,计
根据计数器的触发方式不同,计数器可以分为:同步计 数器和异步计数器两种。当赋予计数器更多的功能时,计 数器的功能就非常复杂了。需要注意的是,计数器是常用 的定时器的核心部分,当计数器输出控制信号时,计数器 也就变成了定时器了。所以只要掌握了计数器的设计方 法,就可以很容易的设计定时器。本书中主要介绍同步计 数器的设计。 同步计数器指在时钟脉冲(计数脉冲)的控制下,计数 器做加法或减法的运算。
55
一个8进制(从0到7)的计数器是一个3位二进制的 计数器。下图给出了3位八进制计数器的状态图。
数字逻辑单元设计-通用计数器设计 一个8进制(从0到7)的计数器是一个3位二进制的 计数器。下图给出了3位八进制计数器的状态图。
56
数字逻辑单元设计-通用计数器设计 architecture Behavioral of count3bit is begin
process(clr,clk) if(clr='1') then q<="000"; elsif(rising_edge(clk)) then q<=q+1; end if; end process; end Behavioral; 3位计数器的VHDL语言行为级描述 library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity count3bit is Port ( clr : in STD_LOGIC; clk : in STD_LOGIC; q : inout STD_LOGIC_VECTOR (2 downto 0)); end count3bit;
57
数字逻辑单元设计-带模计数器设计 下面以模5计数器为例,介绍带模计数器的设计方 法。模5计数器就是反复的从0到4计数。即,有5个状
态和输出为 ,然后返回0。
58
数字逻辑单元设计-带模计数器设计 architecture Behavioral of mod5cnt is begin
process(clk,clr) if(clr='1') then q<="000"; elsif(rising_edge(clk)) then if(q="100") then else q<=q + 1; end if; end process; end Behavioral; 5进制计数器的VHDL语言行为级描述 library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity mod5cnt is Port ( clr : in STD_LOGIC; clk : in STD_LOGIC; q : inout STD_LOGIC_VECTOR (2 downto 0)); end mod5cnt;
59
数字逻辑单元设计-时钟分频器设计 下面设计分频器,将分频器使用25位的计数器作 为时钟的分频因子的生成。该设计将由50MHz时钟
产生190Hz时钟和47.7Hz时钟信号。下表给出了计数 器每位和分频时钟的关系。
60
数字逻辑单元设计-时钟分频器设计
61
数字逻辑单元设计-时钟分频器设计 时钟分频器VHDL语言行为级描述 library IEEE;
use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity clkdiv is Port ( clk : in STD_LOGIC; clr : in STD_LOGIC; clk190 : out STD_LOGIC; clk48 : out STD_LOGIC); end clkdiv; architecture Behavioral of clkdiv is signal q : std_logic_vector(24 downto 0); begin process(clr,clk) if(clr='1') then q<=(others=>'0'); elsif(rising_edge(clk)) then q <= q + 1; end if; end process; clk190 <= q(17); Hz clk48 <= q(19); Hz end Behavioral;
62
数字逻辑单元设计-移位寄存器设计 一个N位移位寄存器包含N个触发器。如下图,在 每一个时钟脉冲时,数据从一个触发器移动到另一个
触发器。如图所示,串行数据data_in从移位寄存器的 左边输入进来,在每个时钟到来时,q3移动到q2,q2 移动到q1,q1移动到q0。
63
数字逻辑单元设计-移位寄存器设计
64
数字逻辑单元设计-移位寄存器设计 在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等
65
数字逻辑单元设计-移位寄存器设计 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>
66
数字逻辑单元设计-移位寄存器设计 【例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;
67
2、通过VHDL的类型操作,元件例化、信号连接等不同 实现方法实现移位操作运算. 下面通过函数调用,元件例化、信号连接等不同实现
数字逻辑单元设计-移位寄存器设计 2、通过VHDL的类型操作,元件例化、信号连接等不同 实现方法实现移位操作运算. 下面通过函数调用,元件例化、信号连接等不同实现 方法实现一个16位的串行输入、串行输出的移位寄存器。
68
数字逻辑单元设计-移位寄存器设计 【例4-27】元件例化的方法实现16位 Architecture rtl of shift8 is
串入/串出移位寄存器的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;
69
数字逻辑单元设计-移位寄存器设计 【例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;
70
数字逻辑单元设计-移位寄存器设计 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;
71
数字逻辑单元设计-环形移位寄存器设计 如下图所示,如果前面移位寄存器的输出q0连 接到q3的输入端。则移位寄存器变成了环型移位寄 存器。
72
数字逻辑单元设计-环形移位寄存器设计 4位右移环形移位寄存器的VHDL语言描述 library IEEE;
use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity ring_shiftreg4 is Port ( clk : in STD_LOGIC; clr : in STD_LOGIC; q : inout STD_LOGIC_VECTOR (3 downto 0)); end ring_shiftreg4; architecture Behavioral of ring_shiftreg4 is begin process(clr,clk) if(clr='1') then q<="0001"; elsif(rising_edge(clk)) then q(3) <= q(0); q(2 downto 0) <= q(3 downto 1); end if; end process; end Behavioral;
73
数字逻辑单元设计-消抖电路设计 当按键时,不可避免的引起按键的抖动,需要大约 ms级的时间才能稳定下来。也就是说,输入到FPGA的
和1进行交替变化。 由于时钟信号变化的比按键抖动更快,因为会把错 误的信号锁存在寄存器中,这在时序电路是非常严重 的问题。因此,需要消抖电路来消除按键的抖动。如 下图所示,该电路可以完成按键的消抖,随后的设计 将验证这个电路的正确性。
74
数字逻辑单元设计-消抖电路设计
75
数字逻辑单元设计-消抖电路设计 消抖电路的VHDL语言描述 library IEEE;
use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity debounce4 is Port ( inp : in STD_LOGIC_VECTOR (3 downto 0); cclk : in STD_LOGIC; clr : in STD_LOGIC; outp : out STD_LOGIC_VECTOR (3 downto 0)); end debounce4; architecture Behavioral of debounce4 is signal delay1,delay2,delay3 : std_logic_vector(3 downto 0); begin process(cclk,clr,inp) begin if(clr='1') then delay1<="0000"; delay2<="0000"; delay3<="0000"; elsif(rising_edge(cclk)) then delay1<=inp; delay2<=delay1; delay3<=delay2; end if; end process; outp<=delay1 and delay2 and delay3; end Behavioral;
76
数字逻辑单元设计-时钟脉冲电路设计 下图给出了时钟脉冲的逻辑电路。与前面消抖 电路不同的是输入到AND门的delay3从触发器的Q
的互补输出端输出。下图给出了该电路的行为仿真 结果。
77
数字逻辑单元设计-时钟脉冲电路设计
78
数字逻辑单元设计-时钟脉冲电路设计 时钟脉冲生成的VHDL语言描述 library IEEE;
use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity clock_pluse is Port ( inp : in STD_LOGIC; cclk : in STD_LOGIC; clr : in STD_LOGIC; outp : out STD_LOGIC); end clock_pluse; architecture Behavioral of clock_pluse is signal delay1,delay2,delay3 : std_logic; begin process(clr,cclk) if(clr='1') then delay1<='0'; delay2<='0'; delay3<='0'; elsif(rising_edge(cclk)) then delay1<=inp; delay2<=delay1; delay3<=delay2; end if; end process; outp<=delay1 and delay2 and (not delay3); end Behavioral;
79
数字逻辑单元设计-脉冲宽度调制设计 本节将介绍使用脉冲宽度调制技术(Pluse-width
modulated, PWM)信号来控制直流电机。 当连接电机或其它负载时,可能向数字电路 (CPLD,FPGA和微处理器)流入很大的电流,因此最 安全和最容易的方法是使用一些类型的固态继电器 (solid-state relay, SSR)。如图4.24所示,数字电路提 供小的电流(5-10mA)到输入引脚1和2,将开启固态继 电器内的LED,来自LED的光将打开MOSFET,这样将 允许引脚3和4之间流经很大的电流。这种光电耦合电路 将数字电路隔离开,这样可以降低电路的噪声和防止对 数字电路造成的破坏。
80
数字逻辑单元设计-脉冲宽度调制设计
81
数字逻辑单元设计-脉冲宽度调制设计 SSR是适合于控制直流负载。然而,一些SSR有两 个MOSFET和背对背的二极管用来控制交流负载。当
电压和电流负载。 通常,需要为电机提供独立的电源,将两个地连在 一起。 一个例子是使用G3VM-61B1/E1固态继电器SSR, 该SSR是欧姆龙公司的一个6脚的MOSFET继电器,能 用作直流或交流SSR。最大的交流负载电压是60V,最 大负载电流是500mA(将两个MOSFET并联后可为直流 负载提供1A电流)。
82
数字逻辑单元设计-脉冲宽度调制设计 直流电机的速度取决于电机的电压,电压越高,电 机转动的越快。如果需要电机以恒定的速度旋转,将4
脚和电源连接起来,将电机连在3脚和地之间(页可以 将3脚连接到地和将连接电机道第四引脚和电源之 间)。 连接到电机的电源的极性决定了电机的转动方式。 如果转动方向错误,只需要改变电机的两个连接。 如果使用数字电路改变电机方向,需要使用H桥。 SN75440是一个四半桥驱动器,它能管理两个双 向的电机,其供电电压可以到36V,负载电流可以到 1amp
83
数字逻辑单元设计-脉冲宽度调制设计 使用数字电路来控制电机的速度,通常使用下图的 PWM信号波形。脉冲周期是恒定的,高电平的时间称
为占空是可变的。占空比表示为:
84
数字逻辑单元设计-脉冲宽度调制设计 PWM信号的直流平均值与占空是成比例的。50%占 空比的PWM其直流值为PWM信号最大值的1/2。如果
直流电机的电路。
85
数字逻辑单元设计-脉冲宽度调制设计
86
数字逻辑单元设计-脉冲宽度调制设计 PWM控制电机的VHDL语言描述 library IEEE; process(clk,clr)
begin if(clr='1') then count<="0000"; elsif(rising_edge(clk)) then if(count=period1-1) then else count<=count + 1; end if; end process; PWM控制电机的VHDL语言描述 library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity pwm4 is Port ( clk : in STD_LOGIC; clr : in STD_LOGIC; duty : in STD_LOGIC_VECTOR (3 downto 0); period1 : in STD_LOGIC_VECTOR (3 downto 0); pwm : out STD_LOGIC); end pwm4; architecture Behavioral of pwm4 is signal count : STD_LOGIC_VECTOR (3 downto 0); signal set,reset : std_logic; Begin set <= not (count(0) or count(1) or count(2) or count(3));
87
数字逻辑单元设计-脉冲宽度调制设计 process(clk) begin if(rising_edge(clk)) then
if(count=duty) then reset<='1'; else reset<='0'; end if; end process; process(clk) begin if(rising_edge(clk)) then if(set='1') then pwm<='1'; end if; if(reset='1') then pwm<='0'; end process; end Behavioral;
88
数字逻辑单元设计-存储器设计 存储器按其类型主要分为只读存储器和随机存储器两 种。虽然存储器从其工艺和原理上各不相同,但有一点是
存储器按其类型主要分为只读存储器和随机存储器两 种。虽然存储器从其工艺和原理上各不相同,但有一点是 相同的,即存储器是单个存储单元的集合体,并且按照顺 序排列。其中的每一个存储单元由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;
89
数字逻辑单元设计-存储器设计 需要注意的是,虽然在本节给出了存储器的原理描述和 实现方法,但在实际中,尤其是在FPGA的设计中,存储
需要注意的是,虽然在本节给出了存储器的原理描述和 实现方法,但在实际中,尤其是在FPGA的设计中,存储 器在FPGA内作为核提供给设计人员进行使用,设计人员 只需要对这些核进行配置,就可以生成高性能的存储器模 块,根本没有必要用VHDL语言进行原理和功能的描述。
90
数字逻辑单元设计-ROM设计 只读存储器的数据被事先保存到了每个存储单元中,在 PLD中保存数据的方法有很多。当对ROM进行读操作时,
只读存储器的数据被事先保存到了每个存储单元中,在 PLD中保存数据的方法有很多。当对ROM进行读操作时, 只要在控制信号的控制下,对操作的单元给出读取的数值 即可。 【例4-30】ROM的VHDL描述 EN为ROM的使能信号, ADDR为ROM的地址信号, CLK为ROM的时钟信号, DATA为数据信号。 图4.16 ROM的结构图
91
数字逻辑单元设计-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;
92
数字逻辑单元设计-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");
93
数字逻辑单元设计-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;
94
RAM和ROM的区别,在于RAM有读写两种操作,而 ROM只有读操作。另外,RAM对读写的时序也有着严格 的要求。
【例4-31】一个单端口RAM的VHDL的描述 EN为RAM使能信号, WE为RAM写信号, DI为RAM数据输入信号, ADDR为RAM地址信号, CLK为RAM时钟信号, DO为RAM数据输出信号。 图4.17 单端口RAM的结构
95
数字逻辑单元设计-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;
96
有限自动状态机FSM(Finate State Machine)的设计
是复杂数字系统中非常重要的一部分,是实现高效率高可 靠性逻辑控制的重要途径。大部分数字系统都是由控制单 元和数据单元组成的。数据单元负责数据的处理和传输, 而控制单元主要是控制数据单元的操作的顺序。而在数字 系统中,控制单元往往是通过使用有限状态机实现的,有 限状态机接受外部信号以及数据单元产生的状态信息,产 生控制信号序列。
97
数字逻辑单元设计-FSM原理
98
数字逻辑单元设计-FSM原理 从上面的数学模型可以看出,如果在数字系统中实现有 限状态机,则应该包含三部分:状态寄存器;下状态转移
从上面的数学模型可以看出,如果在数字系统中实现有 限状态机,则应该包含三部分:状态寄存器;下状态转移 逻辑;输出逻辑。 描述有限状态机的关键是状态机的状态集合以及这些状 态之间的转移关系。描述这种转换关系除了数学模型外, 还可以用状态转移图或状态转移表来实现。 状态转移图由三部分组成:表示不同状态的状态点、连 接这些状态点的有向箭头以及标注在这些箭头上的状态转 移条件。 状态转移表采用表格的方式描述状态机。状态转移表由 三部分组成:当前状态、状态转移事件和下一状态。
99
数字逻辑单元设计-FSM设计优点 采用有限状态机描述有以下方面的优点: 1、可以采用不同的编码风格,在描述状态机时,设计
采用有限状态机描述有以下方面的优点: 1、可以采用不同的编码风格,在描述状态机时,设计 者常采用的编码有二进制、格雷码、one hot编码,用户可 以根据自己的需要在综合时确定,而不需要修改源文件或 修改源文件中的编码格式以及状态机的描述。 2、可以实现状态的最小化,(如果one hot编码,控制 信号数量庞大)。 3、设计灵活,将控制单元与数据单元分离开。
100
数字逻辑单元设计-状态编码 设计者可以在使用状态机之前应该定义状态变量 的枚举类型,定义可以在状态机描述的源文件中,
也可以在专门的程序包中。 【例】状态变量的定义 TYPE main_con_state IS (state1,state2); 【例】状态变量的定义 signal current_state :main_con_state; signal next_state: main_con_state;
101
数字逻辑单元设计-状态编码 FSM的状态可以采用的状态编码规则有很多,在Xilinx的状态编码 “One_Hot”; “Gray”;
”Compact”; ”Johnson”; “Sequential”; “Speed1”; “User”的编码方式; 下面对这些状态编码的性能进行简单的介绍。
102
数字逻辑单元设计-状态编码 十进制数 二进制码 Gray码 Johnson码 One-hot吗 000 001 1 010 2 011
000 001 1 010 2 011 100 3 111 1000 4 110 5 101 6 7
103
数字逻辑单元设计-状态编码 1、One_Hot状态编码 ONE HOT的编码方案对每一个状态采用一个触发器,
即4个状态的状态机需4个触发器。同一时间仅1个状态位 处于有效电平(如逻辑“l”)。在使用One_Hot状态编码 时,触发器使用较多,但逻辑简单,速度快。
104
数字逻辑单元设计-状态编码 2、Gray状态编码 Gray码编码每次仅一个状态位的值发生变化。在使用
两位同时翻转的情况。采用格雷码进行状态编码时,采用 T触发器是最好的实现方式。
105
数字逻辑单元设计-状态编码 3、Compact状态编码 Compact状态编码能够使所使用的状态变量位和触发器
的数目变得最少。该编码技术基于超立方体浸润技术。当 进行面积优化的时候可以采用Compact状态编码
106
Johnson状态编码能够使状态机保持一个很长的路径, 而不会产生分支。 5、Sequential状态编码
数字逻辑单元设计-状态编码 4、Johnson状态编码 Johnson状态编码能够使状态机保持一个很长的路径, 而不会产生分支。 5、Sequential状态编码 Sequential状态编码采用一个可标示的长路径,并采用 了连续的基2编码描述这些路径。下一个状态等式被最小 化。 6、Speed1状态编码 Speed1状态编码用于速度的优化。状态寄存器中所用 的状态的位数取决于特定的有限自动状态及FSM,但一般 情况下它要比FSM的状态要多。
107
数字逻辑单元设计-FSM的分类 状态机分类很多,主要分为Moore状态机、 Mealy状态机和扩展有限状态机。下面就Moore状态
108
FSM的分类--Moore状态机 Moore型状态机与Mealy型状态机的区别在与, Moore型状态机的输出仅与状态机的状态有关,与
状态机的输入无关。
109
FSM的分类--Moore状态机 下面以序列检测器为例,说明Moore状态机的设 计。该序列检测器将检测序列“1101”,当检测到该序列
时,状态机的输出z为1。下图给出了基于Moore状态机 的序列检测器的运行原理。
110
FSM的分类--Moore状态机 下面对这个状态机进行详细说明: 1)初始状态为S0,如果输入为1则状态迁移到S1;否
则等待接收序列的头部。 2)在状态S1,如果输入为0,则必须返回状态S0;否 则迁移状态到S2(表示接收到连续的1); 3)在状态S2,如果输入为1,则停留在状态S2;否则 迁移状态到S3(表示接收到序列110); 4)在状态S3,如果输入为0,则必须返回到状态S0; 否则迁移到状态S4(表示接收到序列1101); 5)在状态S4,状态机输出为1。如果输入为0,则必 须返回到状态S0;否则迁移状态到状态S2(表示接收到 序列11)。
111
FSM的分类--Moore状态机 Moore型序列检测器的VHDL语言描述 library IEEE;
use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity seqdeta is port( clk : in std_logic; clr : in std_logic; din : in std_logic; dout : out std_logic ); end seqdeta; architecture Behavioral of seqdeta is type state is(s0,s1,s2,s3,s4); ---状态声明 signal present_state,next_state : state; begin process(clr,clk) if(clr='1') then 状态寄存器 present_state<=s0; elsif rising_edge(clk) then present_state<=next_state; end if; end process;
112
FSM的分类--Moore状态机 process(present_state,din) --下状态转移逻辑 begin
case present_state is when s0=> if(din='1') then next_state<=s1; else next_state<=s0; end if; when s1=> next_state<=s2; when s2=> if(din='0') then next_state<=s3; next_State<=s2; when s3=> if(din='1') then next_state<=s4; else next_state<=s0; end if; when s4=> if(din='0') then next_state<=s2; when others=> end case; end process;
113
FSM的分类--Moore状态机 process(present_state) --输出逻辑和当前输入无关 begin
if(present_state=s4) then dout<='1'; else dout<='0'; end if; end process; end Behavioral;
114
FSM的分类--Mealy型状态机 如下图所示,Mealy型状态机的输出由状态机的 输入和状态机的状态共同决定;
115
FSM的分类--Mealy型状态机 下面以序列检测器为例,说明Mealy状态机的设 计。该序列检测器将检测序列“1101”,当检测到该
序列时,状态机的输出z为1.下图给出了基于Mealy 状态机的序列检测器的运行原理。
116
FSM的分类--Mealy型状态机 Moore状态机检测序列时,使用了5个状态,当为 状态S4时,输出为1。
也可以使用Mealy状态机检测序列。当为状态S3 时,且输入为1时,输出z为1。状态迁移的条件表示为 当前输入/当前输出。比如当为状态S3时(接收到序列 110),输入为1,输出将变为1。下一个时钟沿有效 时,状态变化到S1,输出z变为0。 为了让z成为寄存的输出(也就是说状态变化为S1 时,输出仍然被保持1),为输出添加寄存器。即 Mealy状态机的输出和D触发器连接,这样下一个时钟 有效时,状态仍然变化到S1,但输出被锁存为1(被保 持)。
117
FSM的分类--Mealy型状态机 library IEEE; use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity seqdetb is port( clk : in std_logic; clr : in std_logic; din : in std_logic; dout : out std_logic ); end seqdetb; architecture Behavioral of seqdetb is type state is(s0,s1,s2,s3); 定义状态 signal present_state,next_state : state; begin process(clr,clk) 状态寄存器 if(clr='1') then present_state<=s0; elsif rising_edge(clk) then present_state<=next_state; end if; end process;
118
FSM的分类--Mealy型状态机 process(present_state,din) --状态转移逻辑 begin
case present_state is when s0=> if(din='1') then next_state<=s1; else next_state<=s0; end if; when s1=> next_state<=s2; when s2=> if(din='0') then next_state<=s3; else next_State<=s2; when s3=> if(din='1') then next_state<=s1; else next_state<=s0; end if; when others=> end case; end process;
119
FSM的分类--Mealy型状态机 process(clr,clk) --输出逻辑和当前输入有关 begin
if(clr='1') then dout<='0'; elsif rising_edge(clk) then if(present_state=s3 and din='1') then dout<='1'; else end if; end process;
120
数字逻辑单元设计-状态机描述规则 状态机描述方式: 三进程; 两进程; 单进程; 该状态图包含: 1)四个状态:s1,s2,s3,s4;
状态机描述方式: 三进程; 两进程; 单进程; 该状态图包含: 1)四个状态:s1,s2,s3,s4; 2)5个转移; 3)1个输入“x1”; 4)1个输出“outp”;
121
数字逻辑单元设计-状态机描述规则 1、单进程状态机的实现方法 如图4.7单进程的mealy状态机所示,采用单进程状态机
1、单进程状态机的实现方法 如图4.7单进程的mealy状态机所示,采用单进程状态机 描述时,状态的变化、状态寄存器和输出功能描述用一个 进程进行描述。
122
如图4.8所示,与单进程状态机不同的是,采用双进程 状态机时,输出函数用一个进程描述,而状态寄存器和下 一状态函数用另一个进程描述。
数字逻辑单元设计-状态机描述规则 如图4.8所示,与单进程状态机不同的是,采用双进程 状态机时,输出函数用一个进程描述,而状态寄存器和下 一状态函数用另一个进程描述。
123
数字逻辑单元设计-状态机描述规则 3、三进程状态机的实现规则 如图4.9所示,与双进程状态机不同的是,采用三进程
3、三进程状态机的实现规则 如图4.9所示,与双进程状态机不同的是,采用三进程 状态机时,输出函数用一个进程描述,而状态寄存器和下 一状态函数分别用两个进程描述。
124
习题 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、有限自动状态机的描述规则及其特点。
Similar presentations