Presentation is loading. Please wait.

Presentation is loading. Please wait.

时序运算模块的VHDL设计 时序电路的结构与特点 内部含有存储器件(触发器、锁存器); 信号变化受时钟控制; 通常采用状态变化进行描述;

Similar presentations


Presentation on theme: "时序运算模块的VHDL设计 时序电路的结构与特点 内部含有存储器件(触发器、锁存器); 信号变化受时钟控制; 通常采用状态变化进行描述;"— Presentation transcript:

1 时序运算模块的VHDL设计 时序电路的结构与特点 内部含有存储器件(触发器、锁存器); 信号变化受时钟控制; 通常采用状态变化进行描述;
采用进程进行设计;

2 同步时序电路的信号变化特点 同步时序电路以时钟信号为驱动; 电路内部信号的变化(或输出信号的变化)只发生在特定的时钟边沿; 设计要点:
时钟边沿的检测; 输出赋值的控制:是否改变、如何改变。

3 同步时序电路的时钟控制 采用进程描述可以有效控制执行条件,进程中的条件控制可以将时钟信号(clk)做为控制信号,只有当时钟信号变化时,进程才执行;在时钟条件不满足时,任何输入信号的变化对电路(进程)不起作用;

4 VHDL中的时钟检测方式 VHDL通常采用属性语句检测时钟边沿; 与时钟有关的属性语句:
clk'event :boolean,clk有变化时为true; clk‘last_value:bit,clk在变化之前的值;注意:上述属性语句只能在子结构中应用(作为局部量)。

5 VHDL中的时钟检测方式 例:上升沿的检测: clk'event and clk='1' ;
clk'event and clk'last_value='0' ; 在由上升沿导致的进程执行时,上述两个表达式的值都为true;而在由其他输入变化导致的进程执行时,上述表达式的值就是faith;

6 时序电路的基本单元设计 Latch:输出受时钟电平控制,在一段时间内可受输入变化影响发生而变化;(电平控制)
flip-flop:输出只在时钟边沿时刻发生变化,输入信号变化不能直接导致输出变化;(边沿控制)

7 时序电路的基本单元设计 例:D latch的设计 p.678 表 8-4 process(clk,d) begin
if clk='1' then q<=d; end if; end process; d和clk的任何变化都会导致进程执行; 仅当clk为1时,d的变化才会导致q的变化;

8 时序电路的基本单元设计 例:D flip-flop的设计:p.679 表8-6 process (clk,d ) begin
if clk'event and clk='1' then q<=d; end if ; end process ; d和clk的任何变化都会导致进程执行; 只有在clk上升沿引发的进程执行中,d的变化才会导致q的变化;

9 时序电路的基本单元设计 触发沿选择与清零设置问题: process(clk,clr) begin
if clr='1' then q<='0'; elsif clk'event and clk='1' then q<=d; end if; end process; 异步清零,上升沿触发;

10 时序电路的基本单元设计 触发沿选择与清零设置问题: process(clk,clr) begin
if clk'event and clk='0' if clr='0' then q<='0'; else q<=d; end if; end process; 下降沿触发,同步清零;

11 时序电路的基本单元设计 采用wait语句进行时钟检测: process begin wait on clk;
if clk='1' then q<=d; end if ; end process ;

12 时序电路的基本单元设计 采用wait语句进行时钟检测: process begin wait until clk='0'; q<=d;
end process;

13 关于寄存器生成的控制问题 寄存器的作用是在输入信号变化时,保持输出信号不变;当程序设计中隐含这一要求时,就会在综合时引入寄存器;
寄存器只在满足一定条件时才允许改变输出值,因此只能通过条件判断语句才会引入寄存器;

14 关于寄存器生成的控制问题 例1:寄存器的引入 process(clk,d) begin
if clk='1' then q<=d; else q<='0'; end if; end process;

15 关于寄存器生成的控制问题 例1:寄存器的引入 process(clk,d) begin
if clk='1' then q<=d; else q<='0'; end if; end process;

16 关于寄存器生成的控制问题 例2:双输出D触发器的设计比较:
library ieee;use ieee.std_logic_1164.all; entity vdffqqn is port (d,clk: in std_logic; q,qn: out std_logic); end vdffqqn; architecture beh of vdffqqn is signal qi:std_logic; begin process end beh;

17 关于寄存器生成的控制问题 例2:双输出D触发器的设计比较1: process(clk) begin
if (clk'event and clk='1') then qi <= d; q <= qi; qn <= not qi; end if; end process;

18 关于寄存器生成的控制问题 例2:双输出D触发器的设计比较2: process(clk) begin
if (clk'event and clk='1') then qi<=d; q<=d; qn<=not qi; end if; end process;

19 关于寄存器生成的控制问题 例2:双输出D触发器的设计比较3: process(clk) begin
if (clk'event and clk='1') then q <= d; qn<= not d; end if; end process;

20 关于寄存器生成的控制问题 例2:双输出D触发器的设计比较4: process(clk) begin
if (clk'event and clk='1') then qi<=d; end if; q<= qi; qn<= not qi; end process;

21 关于寄存器的设计准则 (1)一个进程中只引入一个寄存器(组);只含有一条时间测试语句;只对时间的一个边沿进行测试;
(2)引入寄存器的优选语句应该是IF/THEN语句,因为该语句更容易控制寄存器的引入;在该语句中只应设置一条边沿测试描述分句;

22 关于寄存器的设计准则 (3)严格控制带时间测试语句的IF/THEN语句中赋值语句的数量,将不必要的语句放到该语句以外;
(4)在各类条件控制语句中,注意控制条件的完整性,避免因漏掉条件而生成寄存器; (5)在过程中不能设计寄存器。

23 寄存器的设计实例 16位锁存寄存器设计 p.680 表8-8 带有时钟使能控制和输出三态控制; library ieee;
use ieee.std_logic_1164.all; entity kreg16 is port ( clk,clken,oe,clr: in std_logic; d:in std_logic_vector(1 to 16); q: out std_logic_vector(1 to 16)); end kreg16;

24 寄存器的设计实例 architecture beh of kreg16 is
signal iq: std_logic_vector(1 to 16); begin process ( clk,clr,oe,iq) if clr='1' then iq<=(others=>'0');

25 寄存器的设计实例 elsif clk'event and clk='1' then
if clken = '1' then iq<=d; end if; end if ; if oe='1' then q <= iq; else q<=(others=>'Z'); end if; end process ; end beh;

26 根据输出函数的形式,可以分为moore机和mealy机两类。
有限状态机FSM的设计 时序电路的结构与特点 根据输出函数的形式,可以分为moore机和mealy机两类。

27 Moore: y = f(s) Mealy: y = f(s0,x)
通常采用状态转换图表达电路信号的变化: Moore: y = f(s) Mealy: y = f(s0,x)

28 对每一个现态,利用选择语句,根据控制条件x决定转换次态;
FSM的设计要点 定义枚举类型表达不同的状态特点; 设置信号表达现有状态和转换的状态; 对每一个现态,利用选择语句,根据控制条件x决定转换次态; 根据现态和x决定输出y。

29 状态转换图如下所示,要求设置reset控制,能直接使状态处于s0。
Moore机设计:例1 例1 简单的Moore状态机设计 状态转换图如下所示,要求设置reset控制,能直接使状态处于s0。

30 Moore机设计:例1 library ieee; use ieee.std_logic_1164.all;
entity statmach is port(clk,input,reset: in std_logic; output: out std_logic); end statmach;

31 Moore机设计:例1 architecture beh of statmach is
type state_type is (s0,s1); --采用枚举法设置状态 signal st: state_type; --表达当前的状态 begin process(clk) --设置时钟控制模块 if reset='1' then st<=s0;--异步复位 elsif clk'event and clk='1' then --边沿检测

32 output<='1' when st=s1 else'0';
Moore机设计:例1 case st is --根据现态决定下一状态 when s0 => st<=s1; when s1 => if input='1' then st<=s0; end if; end case; end process; output<='1' when st=s1 else'0'; --根据状态决定输出 end beh;

33 该状态机有5个状态,转换图如下所示:其中输入控制ID为4位二进制数,在图中表达为16进制数;
Moore机设计:例2 例2 Moore状态机的设计 该状态机有5个状态,转换图如下所示:其中输入控制ID为4位二进制数,在图中表达为16进制数;

34 Moore机设计:例2 library ieee; use ieee.std_logic_1164.all;
entity moore2 is port(clk,rst: in std_logic; id: in std_logic_vector(3 downto 0); y: out std_logic_vector(1 downto 0)); end moore2;

35 Moore机设计:例2 architecture beh of moore2 is
signal st: std_logic_vector(2 downto 0);--状态表达 --各状态命名并根据输出的特点进行赋值 constant s0:std_logic_vector(2 downto 0):="000"; constant s1:std_logic_vector(2 downto 0):="010"; constant s2:std_logic_vector(2 downto 0):="011"; constant s3:std_logic_vector(2 downto 0):="110"; constant s4:std_logic_vector(2 downto 0):="111"; begin

36 Moore机设计:例2 process(clk,rst) --状态转移关系 begin
if rst='1' then st<=s0; --异步复位 elsif clk'event and clk='1' then --时钟边沿判断 case st is when s0=> if id=x"3" then st<=s1; else st<=s0; end if; when s1=> st<=s2; when s2=> if id=x"7" then st<=s3; end if;

37 elsif id=x"9" then st<=s4;
Moore机设计:例2 when s3=> if id=x"7" then st<=s0; elsif id=x"9" then st<=s4; end if; when s4=> if id=x"b" then st<=s0; end if; when others=>st<=s0; end case; end process; y<=st(1 downto 0); --输出方程 end beh;

38 Moore机设计:例3 例3 简单状态机设计( 教材7.4 /9.2.1) 初始态:z=0 连续2个触发沿A=1,则z=1;
例3 简单状态机设计( 教材7.4 /9.2.1) 初始态:z=0 连续2个触发沿A=1,则z=1; 若z=1且b=1, 则z保持1。

39 Moore机设计:例3 例3 简单状态机设计( 教材7.4 /9.2.1)

40 elsif a='1' then sreg<=a1;
Moore机设计:例3 architecture beh of smexamp is type sreg_type is (init,a0,a1,ok0,ok1); signal sreg:sreg_type; begin process(clk) if clk'event and clk='1' then case sreg is when init => if a='0' then sreg<=a0; elsif a='1' then sreg<=a1; end if;

41 Moore机设计:例3 when a0 => if a='0' then sreg<=ok0;
elsif a='1' then sreg<=a1; end if; when a1 => if a='0' then sreg<=a0; elsif a='1' then sreg<=ok1; when ok0 => if a='0' then sreg<=ok0; elsif a='1' and b='0' then sreg<=a1; elsif a='1' and b='1' then sreg<=ok1;

42 Moore机设计:例3 when ok1 => if a='0' and b='0' then sreg<=a0;
elsif a='0' and b='1' then sreg<=ok0; elsif a='1' then sreg<=ok1; end if; when others =>sreg<=init; end case; end process;

43 with sreg select --根据状态决定输出
Moore机设计:例3 with sreg select --根据状态决定输出 z<= '0' when init|a0|a1, '1' when ok0|ok1, '0' when others; end beh; 综合结果如下:

44 Moore机设计:例4 通过对状态图的分析,可以简化: 使用1个寄存器专门存放触发时的输入a; 则状态可以减少到3个;结构也简化了。

45 Moore机设计:例4 architecture beh of smexamp is
type sreg_type is (init,looking,ok); signal sreg:sreg_type; signal lasta:std_logic; begin process(clk) if clk'event and clk='1' then lasta<=a;

46 Moore机设计:例4 case sreg is when init => sreg<=looking;
when looking => if a=lasta then sreg<=ok; else sreg<=looking; end if; when ok => if b='1' then sreg<=ok; elsif a=lasta then sreg<=ok; else sreg<=looking; when others =>sreg<=init; end case;

47 Moore机设计:例4 end if; end process; with sreg select z<= '1' when ok,
'0' when others; end beh;


Download ppt "时序运算模块的VHDL设计 时序电路的结构与特点 内部含有存储器件(触发器、锁存器); 信号变化受时钟控制; 通常采用状态变化进行描述;"

Similar presentations


Ads by Google