1、本章目录本章目录 时序电路概述时序电路概述 同步电路同步电路 基本存储单元的引用基本存储单元的引用 简单的设计例子简单的设计例子 时序分析时序分析 一段式代码风格一段式代码风格 时序电路中变量的使用时序电路中变量的使用n组合电路和时序电路组合电路和时序电路时序电路:输出是输入和当前状态的函数时序电路:输出是输入和当前状态的函数n基本记忆单元基本记忆单元D 锁存器锁存器D 触发器触发器RAM时序电路概述时序电路概述nD锁存器锁存器是是电平敏感电平敏感的记忆单元,而的记忆单元,而D触发器触发器是是边沿敏边沿敏感感的记忆单元的记忆单元n对于对于D锁存器,当时钟信号锁存器,当时钟信号c为高电平时,下一
2、个状态为高电平时,下一个状态q*=d,当时钟信号,当时钟信号c为低电平时,为低电平时,q*=q(保持)(保持)dcq(a)D 锁存器cq*0q1dD D锁存器锁存器nD锁存器的时序图(锁存器的时序图(d在在c的下降沿处被采样和保存)的下降沿处被采样和保存)D D锁存器锁存器nD触发器只有在触发器只有在clk信号的跳变沿处有效(信号的跳变沿处有效(01或或10)dclkq(b)上升沿D 触发器dclkq(c)下降沿D 触发器clkq*0q1qdclkq*0q1qd“有效有效”的的含义是指含义是指:d的值的值只有在只有在clk的边沿处的边沿处被采样和被采样和保存,并保存,并更新输出更新输出qD D
3、触发器触发器nD触发器的优点触发器的优点d端口小小的毛刺不会影响到存储的状态端口小小的毛刺不会影响到存储的状态消除了竞争的条件,交换数据的电路可以工作消除了竞争的条件,交换数据的电路可以工作nD触发器的缺点触发器的缺点是是D锁存器的两倍大小锁存器的两倍大小D D触发器触发器n时序图如下时序图如下:n Clock-to-q 延时延时(Tcq):信号信号d被采样到更新被采样到更新q的延时的延时n建立时间建立时间(Tsetup):在时钟的上升沿来临之前,在时钟的上升沿来临之前,d必须保持稳定的时间必须保持稳定的时间n保持时间保持时间(Thold):在时钟上升沿到来之后,在时钟上升沿到来之后,d必须保
4、持稳定的时间必须保持稳定的时间D D触发器触发器n时序图如下时序图如下:(续)(续)nTcq代表组合电路的传播延时代表组合电路的传播延时nTsetup 和和Thold 是时序约束,是时序约束,d必须在必须在clk的时间间隔内保持稳定。如果的时间间隔内保持稳定。如果d在在这个时隙内改变,这样就会违反建立时间和保持时间的规则,导致触发这个时隙内改变,这样就会违反建立时间和保持时间的规则,导致触发器进入亚稳态(器进入亚稳态(q不是不是0也不是也不是1)D D触发器触发器n在时序电路中,时钟信号扮演着一个很重要的角色在时序电路中,时钟信号扮演着一个很重要的角色系统可以根据时钟的布局来分类系统可以根据时
5、钟的布局来分类n全局同步电路全局同步电路所有的存储单元都在同一个全局时钟的控制下工作所有的存储单元都在同一个全局时钟的控制下工作n全局异步全局异步-局部同步电路局部同步电路(GALS)设计的器件传输分开得太远,无法使用单个同步时钟的设计的器件传输分开得太远,无法使用单个同步时钟的情况下,只能使用一个全局的异步时钟情况下,只能使用一个全局的异步时钟然而,较小的子系统内部使用一个同步的时钟然而,较小的子系统内部使用一个同步的时钟在子系统之间需要特殊的电路接口来保证正常的工作在子系统之间需要特殊的电路接口来保证正常的工作时钟信号时钟信号n全局异步电路全局异步电路没有时钟来协调存储单元的工作,大致分为
6、两类。没有时钟来协调存储单元的工作,大致分为两类。时钟时钟 的使用是没有规律的,例如行波计数器:触发器的的使用是没有规律的,例如行波计数器:触发器的时钟端口连接上一个触发器的输出时钟端口连接上一个触发器的输出q端口。(这种设计并端口。(这种设计并不完美,不推荐)不完美,不推荐)系统带有不需要时钟的存储单元(如系统带有不需要时钟的存储单元(如D锁存器)或者带有锁存器)或者带有反馈回路的组合电路(异步电路)。反馈回路的组合电路(异步电路)。时钟信号时钟信号n合理的异步电路设计和同步电路完全不同,而且合理的异步电路设计和同步电路完全不同,而且HDL的综合的综合工具不太推荐工具不太推荐状态寄存器状态寄
7、存器(state_reg):代表存储单元的状态:代表存储单元的状态下一个状态逻辑下一个状态逻辑(Next state logic):代表决定:代表决定state_next的组的组合电路合电路同步电路同步电路n操作如下:操作如下:在时钟信号的上升沿,在时钟信号的上升沿,state_next 被采样和保存在寄存器中,成为新的被采样和保存在寄存器中,成为新的state_reg的值。的值。外部输入和外部输入和state_reg 信号传输到信号传输到next-state 和输出来决定新的和输出来决定新的next-state 和新的输出信号和新的输出信号在时钟信号的上升沿,在时钟信号的上升沿,新的新的st
8、ate_next重新被采样和保存,然后重复进重新被采样和保存,然后重复进程程n需要注意的是时钟周期需要足够大来适应触发器的需要注意的是时钟周期需要足够大来适应触发器的next-state 逻辑传播延时、逻辑传播延时、clock-to-q 延时、建立时间延时延时、建立时间延时同步电路同步电路n同步设计的优势同步设计的优势单个的全局时钟让成千上万个触发器构建的电路能够统一控制和满足时序单个的全局时钟让成千上万个触发器构建的电路能够统一控制和满足时序约束。约束。一个同步的模块把组合逻辑器件从存储单元中分离出来,实现组合逻辑部一个同步的模块把组合逻辑器件从存储单元中分离出来,实现组合逻辑部分的单独优化
9、。分的单独优化。传播延时的反常情况很容易通过分析最差的时序行为来处理传播延时的反常情况很容易通过分析最差的时序行为来处理n因此,同步模块把一个复杂的时序电路变为单个的闭环反馈因此,同步模块把一个复杂的时序电路变为单个的闭环反馈回路和简化设计的流程回路和简化设计的流程同步电路同步电路n同步电路的类型同步电路的类型n常规的时序电路常规的时序电路状态表示,转变和下个状态逻辑有一个简单,常规的模状态表示,转变和下个状态逻辑有一个简单,常规的模式,例如一个自增的计数器或者一个移位寄存器。式,例如一个自增的计数器或者一个移位寄存器。n随机的时序电路随机的时序电路(FSM)更复杂的状态迁移且状态和它们的二进
10、制表示没有特殊更复杂的状态迁移且状态和它们的二进制表示没有特殊的联系。即,下一个状态逻辑是随机的。的联系。即,下一个状态逻辑是随机的。n组合成的时序逻辑组合成的时序逻辑(带有数据通路的带有数据通路的FSM,FSMD-RTL)组合常规时序电路和有限状态机,用有限状态机来控制组合常规时序电路和有限状态机,用有限状态机来控制时序电路的行为时序电路的行为同步电路同步电路n当你需要创建当你需要创建D锁存器和锁存器和D触发器的时候,可以使用下面的触发器的时候,可以使用下面的语法样式,综合工具会自动推断出来,生成合适的器件。语法样式,综合工具会自动推断出来,生成合适的器件。nD锁存器锁存器隐含的隐含的els
11、e语句会产生语句会产生D锁存器锁存器library ieee;use ieee.std_logic_1164.all;entity dlatch isport(c:in std_logic;d:in std_logic;q:out std_logic );end dlatch;architecture arch of dlatch is begin-c and d in sens.list b/c process sens.to bothprocess(c,d)beginif(c=1)then q=d;end if;end process;end arch;dcq(a)D 锁存器基本存储单元的
12、引用基本存储单元的引用n当你需要创建当你需要创建D锁存器和锁存器和D触发器的时候,可以使用下面的触发器的时候,可以使用下面的语法样式,综合工具会自动推断出来,生成合适的器件。语法样式,综合工具会自动推断出来,生成合适的器件。n上升沿上升沿D触发器触发器没有没有else语句且对时钟跳变信号敏感语句且对时钟跳变信号敏感library ieee;use ieee.std_logic_1164.all;entity dff isport(clk:in std_logic;d:in std_logic;q:out std_logic );end dff;architecture arch of dff
13、is beginprocess(clk)begin-when d changes(unlike latch)if(clkevent and clk=1)then-can also use q=d;-rising_edge(clk)end if;end process;end arch;dclkq(b)上升沿D 触发器基本存储单元的引用基本存储单元的引用n下降沿下降沿D触发器触发器只需要上升沿的程序稍作修改即可(红色为修改的部分只需要上升沿的程序稍作修改即可(红色为修改的部分)library ieee;use ieee.std_logic_1164.all;entity dff isport(c
14、lk:in std_logic;d:in std_logic;q:out std_logic );end dff;architecture arch of dff is beginprocess(clk)begin-when d changes(unlike latch)if(clkevent and clk=0)then-can also use q=d;-falling_edge(clk)end if;end process;end arch;dclkq(c)下降沿D 触发器基本存储单元的引用基本存储单元的引用n带异步复位的带异步复位的D触发器触发器library ieee;use iee
15、e.std_logic_1164.all;entity dffr isport(clk:in std_logic;reset:in std_logic;d:in std_logic;q:out std_logic );end dffr;architecture arch of dffr is beginprocess(clk,reset)beginif(reset=1)then q=0;elsif rising_edge(clk)then q=d;end if;end process;end arch;dclkq(d)带异步复位的D 触发器reset基本存储单元的引用基本存储单元的引用n寄存器
16、寄存器由多个共用同样时钟信号和复位信号的由多个共用同样时钟信号和复位信号的D触发器并联而成触发器并联而成library ieee;use ieee.std_logic_1164.all;entity reg8 isport(clk,reset:in std_logic;d:in std_logic_vector(7 downto 0);q:out std_logic_vector(7 downto 0);end reg8;architecture arch of reg8 is beginprocess(clk,reset)beginif(reset=1)then q 0);elsif(clk
17、event and clk=1)then q=d;end if;end process;end arch;基本存储单元的引用基本存储单元的引用n最简单的设计时序电路的方法是根据框图来搭建最简单的设计时序电路的方法是根据框图来搭建n构建寄存器构建寄存器n编写下一个状态和输出逻辑(组合电路)的代码编写下一个状态和输出逻辑(组合电路)的代码简单的设计例子简单的设计例子n带有同步使能端的带有同步使能端的D触发器触发器注意:注意:en的值在的值在clk的上升沿被采样的上升沿被采样n当当en=0,或者由,或者由0变为变为1,触发器保持输出,触发器保持输出q不变不变n当当en=1,或者由,或者由1变为变为0
18、,触发器保存,触发器保存q_next的值的值简单的设计例子简单的设计例子n带有同步使能端的带有同步使能端的D触发器(代码)触发器(代码)library ieee;use ieee.std_logic_1164.all;entity dff_en isport(clk:in std_logic;reset:in std_logic;en:in std_logic;d:in std_logic;q:out std_logic );end dff_en;architecture two_seg_arch of dff_en issignal q_reg:std_logic;signal q_next
19、:std_logic;begin -D FFprocess(clk,reset)beginif(reset=1)then q_reg=0;elsif(clkevent and clk=1)then q_reg=q_next;end if;end process;-next-state logic q_next=d when en=1 else q_reg;-output logic q=q_reg;end two_seg_arch;简单的设计例子简单的设计例子nT触发器触发器注意:注意:t的值在的值在clk的上升沿被采样的上升沿被采样简单的设计例子简单的设计例子nT触发器(代码)触发器(代码)
20、library ieee;use ieee.std_logic_1164.all;entity tff isport(clk:in std_logic;reset:in std_logic;t:in std_logic;q:out std_logic );end tff;architecture two_seg_arch of tff issignal q_reg:std_logic;signal q_next:std_logic;begin -D FFprocess(clk,reset)beginif(reset=1)then q_reg=0;elsif(clkevent and clk=1
21、)then q_reg=q_next;end if;end process;-next-state logic q_next=q_reg when t=0 elsenot(q_reg);-output logic q=q_reg;end two_seg_arch;简单的设计例子简单的设计例子n移位寄存器(无控制信号)移位寄存器(无控制信号)我们可以重新调整触发器使其成为一列然后把它看成一我们可以重新调整触发器使其成为一列然后把它看成一个存储器块,如下图所示。个存储器块,如下图所示。简单的设计例子简单的设计例子n移位寄存器(无控制信号)移位寄存器(无控制信号)简单的设计例子简单的设计例子n移位寄
22、存器(无控制信号)代码移位寄存器(无控制信号)代码library ieee;use ieee.std_logic_1164.all;entity shift_right_register isport(clk,reset:in std_logic;d:in std_logic;q:out std_logic );end shift_right_register;architecture two_seg_arch of shift_right_register issignal r_reg:std_logic_vector(3 downto 0);signal r_next:std_logic_
23、vector(3 downto 0);begin -registerprocess(clk,reset)beginif(reset=1)then r_reg 0);elsif(clkevent and clk=1)then r_reg=r_next;end if;end process;-next-state logic(shift right 1 bit)r_next=d&r_reg(3 downto 1);-output q=r_reg(0);end two_seg_arch;简单的设计例子简单的设计例子n通用移位寄存器通用移位寄存器设计为设计为4个操作方式:并行、左移、右移、暂停个操作方
24、式:并行、左移、右移、暂停简单的设计例子简单的设计例子n通用移位寄存器(代码)通用移位寄存器(代码)library ieee;use ieee.std_logic_1164.all;entity shift_register isport(clk,reset:in std_logic;ctrl:in std_logic_vector(1 downto 0);d:in std_logic_vector(3 downto 0);q:out std_logic_vector(3 downto 0);end shift_register;architecture two_seg_arch of shi
25、ft_register issignal r_reg:std_logic_vector(3 downto 0);signal r_next:std_logic_vector(3 downto 0);begin -registerprocess(clk,reset)beginif(reset=1)then r_reg 0);elsif(clkevent and clk=1)then r_reg=r_next;end if;end process;-next-state logicwith ctrl select r_next=r_reg when 00,-no op r_reg(2 downto
26、 0)&d(0)when 01,-sft left d(3)&r_reg(3 downto 1)when 10,-sft rght d when others;-output q=r_reg;end two_seg_arch;简单的设计例子简单的设计例子n任意序列计数器任意序列计数器Input patternOutput pattern000011011110110101101111111000library ieee;use ieee.std_logic_1164.all;entity arbi_seq_counter4 isport(clk,reset:in std_logic;q:out
27、 std_logic_vector(2 downto 0);end arbi_seq_counter4;architecture two_seg_arch of arbi_seq_counter4 issignal r_reg:std_logic_vector(2 downto 0);signal r_next:std_logic_vector(2 downto 0);begin -registerprocess(clk,reset)beginif(reset=1)then简单的设计例子简单的设计例子n任意序列计数器(续)任意序列计数器(续)r_reg 0);elsif(clkevent an
28、d clk=1)then r_reg=r_next;end if;end process;-next-state logic r_next=011 when r_reg=000 else 110 when r_reg=011 else 101 when r_reg=110 else 111 when r_reg=101 else 000;-r_reg=111 -output logic q=r_reg;end two_seg_arch;Input patternOutput pattern000011011110110101101111111000简单的设计例子简单的设计例子n自由运行的二进制
29、计数器自由运行的二进制计数器当计数器的值全部为当计数器的值全部为1时,输出最大脉冲,并自动轮回时,输出最大脉冲,并自动轮回library ieee;use ieee.std_logic_1164.all;use ieee.numeric_std.all;entity binary_counter4_pulse isport(clk,reset:in std_logic;max_pulse:out std_logic;q:out std_logic_vector(3 downto 0);end binary_counter4_pulse;architecture two_seg_arch of
30、binary_counter4_pulse issignal r_reg:unsigned(3 downto 0);signal r_next:unsigned(3 downto 0);begin -registerprocess(clk,reset)beginif(reset=1)then r_reg 0);elsif(clkevent and clk=1)then r_reg=r_next;end if;end process;-next-state logic r_next=r_reg+1;-output logic q=std_logic_vector(r_reg);max_pulse
31、=1 when(r_reg=1111)else 0;end two_seg_arch;简单的设计例子简单的设计例子n自由运行的二进制计数器自由运行的二进制计数器RTL原理图原理图简单的设计例子简单的设计例子n二进制计数器二进制计数器Syn_clrloadenq*操作操作1-00.00同步清零01-d并行载入001q+1计数000q暂停简单的设计例子简单的设计例子n二进制计数器二进制计数器library ieee;use ieee.std_logic_1164.all;use ieee.numeric_std.all;entity binary_counter4_feature isport(c
32、lk,reset:in std_logic;syn_clr,en,load:in std_logic;d:in std_logic_vector(3 downto 0);q:out std_logic_vector(3 downto 0);end binary_counter4_feature;architecture two_seg_arch of binary_counter4_feature issignal r_reg:unsigned(3 downto 0);signal r_next:unsigned(3 downto 0);begin -registerprocess(clk,r
33、eset)beginif(reset=1)then r_reg 0);elsif(clkevent and clk=1)then r_reg=r_next;end if;end process;-next-state logic r_next 0)when syn_clr=1 else unsigned(d)when load=1 else r_reg+1 when en=1 else r_reg;-output logic q=std_logic_vector(r_reg);end two_seg_arch;简单的设计例子简单的设计例子n十进制计数器十进制计数器library ieee;us
34、e ieee.std_logic_1164.all;use ieee.numeric_std.all;entity mod10_counter isport(clk,reset:in std_logic;q:out std_logic_vector(3 downto 0);end mod10_counter;architecture two_seg_arch of mod10_counter isconstant TEN:integer:=10;signal r_reg:unsigned(3 downto 0);signal r_next:unsigned(3 downto 0);begin
35、-registerprocess(clk,reset)beginif(reset=1)then r_reg 0);elsif(clkevent and clk=1)then r_reg=r_next;end if;end process;-next-state logic r_next 0)when r_reg=(TEN-1)else r_reg+1;-output logic q=std_logic_vector(r_reg);end two_seg_arch;简单的设计例子简单的设计例子n可编程的可编程的m进制计数器进制计数器可以通过改变一个常数可以通过改变一个常数m来改变计数器的进制,范
36、围为来改变计数器的进制,范围为“0010”“1111”library ieee;use ieee.std_logic_1164.all;use ieee.numeric_std.all;entity prog_counter isport(clk,reset:in std_logic;m:in std_logic_vector(3 downto 0);q:out std_logic_vector(3 downto 0);end prog_counter;architecture two_seg_clear_arch of prog_counter issignal r_reg:unsigned
37、(3 downto 0);signal r_next:unsigned(3 downto 0);begin -registerprocess(clk,reset)beginif(reset=1)then r_reg 0);elsif(clkevent and clk=1)then r_reg=r_next;end if;end process;-next-state logic r_next 0)when r_reg=(unsigned(m)-1)else简单的设计例子简单的设计例子n可编程的可编程的m进制计数器进制计数器(续续)可以通过改变一个常数可以通过改变一个常数m来改变计数器的进制,范
38、围为来改变计数器的进制,范围为“0010”“1111”r_reg+1;-output logic q=std_logic_vector(r_reg);end two_seg_clear_arch;architecture two_seg_effi_arch of prog_counter issignal r_reg:unsigned(3 downto 0);signal r_next,r_inc:unsigned(3 downto 0);begin -registerprocess(clk,reset)beginif(reset=1)then r_reg 0);elsif(clkevent
39、and clk=1)then r_reg=r_next;end if;end process;-next-state logic r_inc=r_reg+1;r_next 0)when r_inc=unsigned(m)else r_inc;-output logic q=std_logic_vector(r_reg);end two_seg_effi_arch;简单的设计例子简单的设计例子简单的设计例子n可编程的可编程的m进制计数器进制计数器(续续)RTL原理图原理图n组合电路组合电路用传播延时来描述用传播延时来描述n时序电路时序电路必须要满足建立和保持时间,用最大时钟频率来描述必须要满足建
40、立和保持时间,用最大时钟频率来描述(例如:(例如:200MHz的计数器,的计数器,2.4GHz的奔腾的奔腾II)建立时间、寄存器的建立时间、寄存器的clock-to-q延时和下一个状态的传延时和下一个状态的传播延时,都嵌套在时钟频率中。播延时,都嵌套在时钟频率中。时序分析时序分析State_next信号必须满足触发器的时序约束nstate_next的延迟受三个源影响的延迟受三个源影响state_reg的输出(部分相同反馈回路和同步时钟)的输出(部分相同反馈回路和同步时钟)和外部使用相同时钟的子系统输入同步和外部使用相同时钟的子系统输入同步和外部输入异步和外部输入异步n对于前两个项目,我们可以调
41、节时钟的频率来阻止时序对于前两个项目,我们可以调节时钟的频率来阻止时序违反违反n请看下面的时序图(展示了闭环反馈系统的时序行为)请看下面的时序图(展示了闭环反馈系统的时序行为),在,在t0时刻,时钟由时刻,时钟由0变为变为1。我们假设。我们假设state_next在建立在建立和保持的周期内不会改变和保持的周期内不会改变n在在clock-to-q(Tcq)延迟之后,寄存器的输出延迟之后,寄存器的输出state_reg在时在时刻刻t1(t0+Tcq)保持稳定)保持稳定时序分析时序分析n因为因为state_reg是是state_next逻辑的输入,逻辑的输入,state_next逻辑的输出在时间逻辑
42、的输出在时间Tnext(min)和和Tnext(max)改变,分别表示最快和最慢的路径。改变,分别表示最快和最慢的路径。n因此,因此,state_next在在t2(t1+Tnext(min))时刻改变,在)时刻改变,在t3(t1+Tnext(max))时刻)时刻稳定。稳定。时序分析时序分析n在在t5时刻,一个新的上升沿时钟到达且当前的时钟周期结束。时刻,一个新的上升沿时钟到达且当前的时钟周期结束。state_next在在t5时刻被采样。时刻被采样。时序分析时序分析n下面来考虑一下建立时间的约束,下面来考虑一下建立时间的约束,state_next信号在下一个采样边沿信号在下一个采样边沿t5到来到
43、来之前的之前的Tsetup时间内必须保持稳定。时间内必须保持稳定。(t5由时序图中的由时序图中的t4给定给定)t3t4n从时序图可以看出:从时序图可以看出:t3=t0+Tcq+Tnext(max)t4=t5-Tsetup=t0+Tc-Tsetupn上面的不等式可以改写为上面的不等式可以改写为t0+Tcq+Tnext(max)t0+Tc-Tsetupn可以化简为可以化简为Tcq+Tnext(max)+Tsetup Tcn因此,最小的时钟周期是因此,最小的时钟周期是Tc(min)=Tcq+Tnext(max)+Tsetup时序分析时序分析时序分析时序分析n对于特定的技术,对于特定的技术,D触发器的
44、触发器的Tcq和和Tsetup可以从数据手册可以从数据手册获得。获得。n让让Tcq=1ns,Tsetup=0.5ns,因为,因为1位的移位逻辑仅仅包位的移位逻辑仅仅包含线网,所以假设它线网的连接延时含线网,所以假设它线网的连接延时 是是0,因此其最,因此其最高的频率为高的频率为1/1.5 ns=666.7 MHzn下文讲述一下和其它组合块联合的例子,其延时大于下文讲述一下和其它组合块联合的例子,其延时大于0.时序分析时序分析n保持时间违反保持时间违反输入的信号在采样沿之后必须要保持一段时间输入的信号在采样沿之后必须要保持一段时间start_next 在在t0 和和 th(t0+Thold)内必
45、须保持稳定。内必须保持稳定。时序分析时序分析n保持时间违反保持时间违反state_next 最早改变的时刻是最早改变的时刻是t2th t2 且且 t2=t0+Tcq+Tnext(min)th=t0+Thold所以所以 t0+Thold t0+Tcq+Tnext(min)化简得化简得 Thold Tcq+Tnext(min)因为触发器的输出驱动下一级的输入,因为触发器的输出驱动下一级的输入,Tnext(min)约等于约等于0且且Thold Tcq器件厂商通常会保证触发器这些内在参数的满足关系,但时钟偏斜问器件厂商通常会保证触发器这些内在参数的满足关系,但时钟偏斜问题是值得我们考虑的。题是值得我们
46、考虑的。时序分析时序分析n我们也需要考虑外部输入输出的时钟特征(除了刚才提到的闭我们也需要考虑外部输入输出的时钟特征(除了刚才提到的闭环反馈回路)环反馈回路)n电路的输出可以分为:摩尔(电路的输出可以分为:摩尔(Moore)输出和米利()输出和米利(Mealy)输出)输出n对于摩尔输出,输出的信号取决于当前系统的状态,而米利输对于摩尔输出,输出的信号取决于当前系统的状态,而米利输出取决于当前系统的状态和外部输入。出取决于当前系统的状态和外部输入。n这两种输出可以同时存在于同一个电路中。这两种输出可以同时存在于同一个电路中。n这两种输出主要时间参数是这两种输出主要时间参数是Tco(在时钟的上升沿
47、后获得一个有在时钟的上升沿后获得一个有效输出所需要的时间效输出所需要的时间)时序分析时序分析nTco 是触发器的是触发器的clock-to-q延时和输出的传播延时之和延时和输出的传播延时之和nTco=Tcq+Toutputn对于米利型输出,输入可以直接影响输出。对于米利型输出,输入可以直接影响输出。一段式代码风格一段式代码风格n尽管可以把下一个状态的存储单元和输出都写在同一段代码中尽管可以把下一个状态的存储单元和输出都写在同一段代码中,但尽可能避免这样的写法,因为很容易出错。,但尽可能避免这样的写法,因为很容易出错。n思考一下这段带使能信号的思考一下这段带使能信号的D触发器代码。触发器代码。a
48、rchitecture one_seg_arch of dff_en is beginprocess(clk,reset)beginif(reset=1)then q=0;elsif(clkevent and clk=1)thenif(en=1)then q=d;end if;end if;end process;end one_seg_arch;n在在elsif里面多加了一行里面多加了一行if(en=1),我们可以解释为,当在时钟,我们可以解释为,当在时钟的上升沿到来的时候,如果的上升沿到来的时候,如果en=1,则,则q=d。缺少的。缺少的else语句隐语句隐含着当含着当en不等于不等于1时
49、,时,q的值要保持。的值要保持。一段式代码风格一段式代码风格n再思考一下再思考一下T触发器的代码。触发器的代码。architecture one_seg_arch of tff issignal q_reg:std_logic;beginprocess(clk,reset)beginif(reset=1)then q_reg=0;elsif(clkevent and clk=1)thenif(t=1)then q_reg=not q_reg;end if;end if;end process;q=q_reg;end one_seg_arch;n这里的内部信号这里的内部信号q_reg代表着触发器
50、的输出。代表着触发器的输出。“q_reg=not q_reg;”这句一眼看上去很奇怪,其实它可以解释为:左边的这句一眼看上去很奇怪,其实它可以解释为:左边的是新的值(是新的值(结果为结果为not q_reg),右边的是当前值(),右边的是当前值(q_reg)。一段式代码风格一段式代码风格n思考一下自由运行的二进制计数器,下面是一段错误的一段式思考一下自由运行的二进制计数器,下面是一段错误的一段式代码。代码。architecture not_work_one_seg_glitch_archof binary_counter4_pulse issignal r_reg:unsigned(3 dow