FSM状态机设计规则

FSM状态机设计规则
FSM状态机设计规则

状态机设计

FSM简介:

FSM 分两大类:米里型和摩尔型,组成要素有输入(包括复位),状态(包括当前状态的操作),状态转移条件,状态的输出条件,图1为状态机结构图。设计FSM 的方法和技巧多种多样,但是总结起来有两大类:第一种,将状态转移和状态的操作和判断等写到一个模块(process、block)中。另一种是将状态转移单独写成一个模块,将状态的操作和判断等写到另一个模块中(在V erilog代码中,相当于使用两个“always”block)。其中较好的方式是后者。其原因如下:

首先FSM 和其他设计一样,最好使用同步时序方式设计,好处不再赘述。而状态机实现后,状态转移是用寄存器实现的,是同步时序部分。状态的转移条件的判断是通过组合逻辑判断实现的,之所以第二种比第一种编码方式合理,就在于第二种编码将同步时序和组合逻辑分别放到不同的程序块(process,block)中实现。这样做的好处不仅仅是便于阅读、理解、维护,更重要的是利于综合器优化代码,利于用户添加合适的时序约束条件,利于布局布线器实现设计。

图1为状态机结构图

显式的FSM 描述方法可以描述任意的FSM(参考V erilog 第四版P181 有限状态机的说明)。两个always 模块。其中一个是时序模块,一个为组合逻辑。时序模块设计与书上完全一致,表示状态转移,可分为同步与异步复位。

同步:

always @(posedge clk)

if (!reset)

…………

异步:

always @(posedge clk or negedge reset)

if (!reset)

…………

组合逻辑用case 语句,sensitive list 包括当然状态(current state)和输入(a,b,c…)。

编者注:以下是编者从“State Machine Coding Styles for Synthesis”一文中摘取的程序代码,是一个简单状态机的示例,采用两个always块的方法:

module bm1_s (err, n_o1, o2, o3, o4,i1, i2, i3, i4, clk, rst);

output err, n_o1, o2, o3, o4;

input i1, i2, i3, i4, clk, rst;

reg err, n_o1, o2, o3, o4;

parameter [2:0] //可以在此处添加综合约束属性来限定状态机的编码:binary,one-hot,gray,etc…

IDLE = 3'd0,

S1 = 3'd1,

S2 = 3'd2,

S3 = 3'd3,

ERROR = 3'd4;

reg [2:0] state, next;

always @(posedge clk or posedge rst)//异步复位,时序逻辑

if (rst) state <= IDLE;

else state <= next;

always @(state or i1 or i2 or i3 or i4) begin //组合逻辑,敏感列表包含当前状态以及所有的状态机输入

next = 3'bx;//设置默认值,以便防止因为if或者case语句不完整综合生成锁存器

err = 0; n_o1 = 1;

o2 = 0; o3 = 0; o4 = 0;

case (state)

IDLE: begin

next = ERROR;//如果下面所有的if条件都不符合,则对next赋该默认值if (!i1) next = IDLE;

if (i1 & i2) next = S1;

if (i1 & !i2 & i3) next = S2;

end

S1: begin

next = ERROR;

if (!i2) next = S1;

if (i2 & i3) next = S2;

if (i2 & !i3 & i4) next = S3;

n_o1 = 0;

o2 = 1;

end

S2: begin

next = ERROR;

if (i3) next = S2;

if (!i3 & i4) next = S3;

o2 = 1;

o3 = 1;

end

S3: begin

next = S3;

if (!i1) next = IDLE;

if (i1 & i2) next = ERROR;

o4 = 1;

end

endmodule

对于状态机的输出可以通过寄存器寄存一下,消除毛刺,这将另外需要一个always块,也就是状态机三个always块的写法。

编码风格:

1. 避免生成锁存器

一个完备的状态机(健壮性强)应该具备初始化(reset)状态和默认(default)状态。当芯片加电或者复位后,状态机应该能够自动将所有判断条件复位,并进入初始化状态。需要注

明的一点是,大多数FPGA有GSR(Global Set/Reset)信号,当FPGA加电后,GSR 信号拉高,对所有的寄存器,RAM 等单元复位/置位,这时配置于FPGA的逻辑并未生效,所以不能保证正确的进入初始化状态。所以使用GSR 进入FPGA的初始化状态,常常会产生种种不必一定的麻烦。一般简单方便的方法是采用异步复位信号,当然也可以使用同步复位,但是要注意同步复位的逻辑设计。状态机也应该有一个默认(default)状态,当转移条件不满足,或者状态发生了突变时,要能保证逻辑不会陷入“死循环”。这是对状态机健壮性的一个重要要求,也就是常说的要具备“自恢复”功能。对应于编码就是对case,if-else 语句要特别注意,要写完备的条件判断语句。VHDL 中,当使用CASE 语句的时候,要使用“When Others”建立默认状态。使用“IF...THEN...ELSE”语句的时候,要在“ELSE”指定默认状态。V erilog 中,使用“case”语句的时候要用“default”建立默认状态,使用“if...else”语句的注意事项相似。

另外有一个技巧:大多数综合器都支持V erilog 编码状态机的完备状态属性--“full case”。这个属性用于指定将状态机综合成完备的状态,如Synplicity 的综合工具(Synplify/Synplify Pro)支持的命令格式如下:

case (current_state) // synthesis full_case

2’b00 : next_state <= 2’b01;

2’b01 : next_state <= 2’b11;

2’b11 : next_state <= 2’b00;

//这两段代码等效

case (current_state)

2’b00 : next_state <= 2’b01;

2’b01 : next_state <= 2’b11;

2’b11 : next_state <= 2’b00;

default : next_state <= 2bx;

Synplicity 还有一个关于状态机的综合属性,叫“// synthesis parallel_case”其功能是检查所有的状态是“并行的”(parallel),也就是说在同一时间只有一个状态能够成立。

编者注:使用上述两个综合约束属性会造成综合前后仿真结果的不一致,请慎重使用。

2. 参数定义用parameter

状态的定义用parameter 定义,不推荐使用`define 宏定义的方式,因为‘define 宏定义在编译时自动替换整个设计中所定义的宏,而parameter 仅仅定义模块内部的参数,定义的参数不会与模块外的其他状态机混淆。

3. 时序电路中一定要使用”<=”非阻塞赋值方式

V erilog的非阻塞行赋值模拟的是实际硬件中串行寄存器的行为,排除了很多潜在的竞争冒险。在使用非阻塞赋值的时候,很多设计者采用"intra-assignment timing delay"(在非阻塞赋值前人为加入一个很小单位的延时)。如下例:

always @(posedge clk or posedge rst)

if (rst)

state <= #1 IDLE;

else

state <= #1 nextstate;

关于这种写法的阐释有下面几点:

I. 首先,这种描述是行为级描述方式,仅仅在仿真时起作用,在综合时会自动被综合器忽略。也就是通常所说的延时描述是不可综合的。

II. 这种描述的好处之一是:它简单模拟了赋值过程寄存器内部的clock-to-output 的延时,在做行为级功能仿真的时候,也可以发现一些由于寄存器固有延迟造成的时序和功能问题。

III. 避免了由RTL 级代码向门级描述转变过程中的一些潜在错误,如保持时间带来的问题。

4 不论是二进制编码的FSM,还是独热码FSM,复位时状态寄存器应该赋值为IDLE状态,如下:

always@( posedge clk or posedge rst )

if( rst ) state <= #1 IDLE;

else state <= #1 next;

如果实现简化的独热码FSM,复位时状态寄存器首先赋值为全零,然后再立即置位状态寄存器的IDLE位。注意:两个非阻塞性赋值作用在同一位上。这完全符合V erilog标准

规定,在此情况下,最后的非阻塞性赋值会代替前面所有的非阻塞性赋值,即更新状态机的IDLE位,如下所示:

always@( posedge clk or posedge rst )

if( rst ) begin

state <= 5'b0;

state[IDLE] <= 1'b1;

end

else state <= next;

5 状态机中组合逻辑块的赋值

在组合always块中只能使用阻塞性赋值。来自同步always块的状态寄存器和状态机的所有输入触发组合always块,该块更新下一状态。应该在组合always块的最前面为下一状态赋一个默认值,块内的case语句会更新该默认值。通常下一状态有三种默认值:全x;预定的恢复状态,如IDLE;状态寄存器的当前值。如果默认值为全x,那么前仿真模型会使状态机在没有任何明确的状态转移时,输出未知。这不仅有利于状态机的调试,还有利于综合,因为综合工具将x作为"无关"。一些设计(如卫星应用,媒体应用,需要使用FSM触发器作为检测扫描链的设计和使用正规验证工具做等价检测的设计)要求下一状态是已知的,而不是全x。通常这些设计下一状态的默认值应该是IDLE或全零,才能满足设计的要求。将下一状态

初始化为默认值,可能比在每个case语句中指定明确的状态转移更简单。

6 Synplify中状态机设计:

可以在Synplify中添加在state定义时添加如下约束属性来限定状态机的编码:

reg [2:0] state /* synthesis syn_encoding = "onehot" */;

Synplify中包含一个强大的FSM编辑器,可以产生在时间和面积上均得到优化的状态机设计,但这将忽略一些状态机中未定义的状态(invalid state),如果必须在状态机进入了未定义的状态后能自动回到有效状态,可以在状态机生成时添加一个安全属性(safe),使得到达无效状态时能回到初始状态,这对电路的时间和面积产生很小的影响:reg [2:0] state /* synthesis syn_encoding = "safe,onehot" */;

这种方法可能与源代码中实际描述的不一致,对于大多数设计来说这不会产生问题,但如果必须与源代码中描述的状态机流程图相吻合,可以通过约束属性关掉FSM编辑器:reg [4:0] state /* synthesis syn_preserve=1 */;但这将严重影响电路的时间和面积特性,下表是将三种方法应用在Altera Flex10k 和Xilinx Virtex上的比较:

编者注:对第5条和第6条在Synplic ity公司的Application Note ”Designing Safe V erilog State Machines with Synplify”中有更详细的说明。

7 几种状态机编码比较:

状态机编码有gray、binary、one-hot 等,其中Binary、gray-code 编码使用最少的触发器,较多的组合逻辑。而one-hot 编码反之。由于CPLD 更多的提供组合逻辑资源,而FPGA更多的提供触发器资源,所以CPLD 多使用gray-code,而FPGA多使用one-hot 编码。另一方面,对于小型设计使用gray-code 和binary 编码更有效,而大型状态机使用one-hot更高效。看synplicity 的文档,推荐在24 个状态以上会用格雷码,在5~24 个状态会用独热码,

在4 个状态以内用二进制码,肯定独热码比二进制码在实现FSM 部分会占更多资源,但是译码输出控制简单,所以如果状态不是太多,独热码较好。状态太少译码不会太复杂,二进制就可以了。状态太多,前面独热码所占资源太多,综合考虑就用格雷码了。在代码中添加综合器的综合约束属性或者在图形界面下设置综合约束属性可以比较方便的改变状态的编码。在synplify 综合时,把FSM compile 勾上,就算用binary 表示,综合器会自动综合成one-hot 模式。

也可在coding 时直接添加描述:

VHDL

attribute TYPE_ENCODING_style of : type is ONEHOT;

V erilog

Reg[2:0] state; // synthesis syn_encoding = "value"(onehot)

其中one-hot编码又分为几种:verbose one-hot 、simplified one-hot、one-hot with zero-idle,关于其具体区别请参考“State Machine Coding Styles for Synthesis“一文。

8 同步状态机输入变量的处理

所有的输入变量都必须与状态机时钟同步,否则,状态机的实际运行可能出现奇怪的现

象,会莫名其妙地出现非法状态。所有的状态机都不可避免地可能死锁,在运行中间歇地中止。为什么呢?这是因为,实际上所有的物理状态机是用物理门实现的,而物理门的传播延时不为0。输入信号经过不同的物理门组合到不同的状态触发器输入端D的传播延时有细微的差别。如果输入信号正好在错误的时间改变,那么较快的通路会探测到变化,而较慢的通路则不会。时钟是不变的,所以必定有一个触发器会出现错误的电平。这样就导致状态转移错

误,整个状态机电路就会误动作。这种设计错误通常不被人注意,因为误动作的几率很小。所以,一定要注意异步输入。解决异步输入的办法是同步器,通常二级同步器能够预防错误的状态入口。虽然可能性很小,还是必须注意一个统计问题,即异步输入还是有可能传播通过同步器。因为两个同步阶段的出现,这种可能性被大大地减小了。一些空间或军事设计需要使用三级同步器,但是对于商业和工业级设计,二级同步器已经足够了。为了最大的减小延迟,第一级使用下降沿触发,第二级使用上升沿触发。

9 FSM输出产生

FSM的输出逻辑可以编码为一个独立的连续赋值块,也可以编码为一个组合逻辑always块。如果输出赋值编码到组合always块中,那么输出赋值就可以放到V erilog的task中,每

个case语句调用task。将输出赋值与组合always块分开,不仅有利于在需要更改时改变输出逻辑,还可以避免综合工具产生意外的锁存器。双always块状态机中,如果将输出赋值放在组合always块内,那么应该在always块的顶部初始化输出为默认值,任何case语句将输出改变为合适值。通常,这种方法使用的代码比在每个case语句中为输出赋值更少,并且可以突出输出的变化。Mealy和寄存输出使用连续赋值或在组合always块中,很容易添加Mealy输出,具体如下:

assign rd_out = ( state == READ ) & !rd_strobe_n;

case( state )

...

READ: if( ! rd_strobe_n ) rd_out = 1'b1;

需要注意的是经过状态转移组合输出会出现很窄的毛刺。由于时钟的倾斜,不等的时钟到输出延时Tco和不等的组合逻辑传播延时,毛刺会不断出现。这种毛刺可能很窄,也可能在大多数逻辑分析仪和一些示波器上看见。被这些输出驱动的电路的敏感沿肯定有毛刺,并且可能导致电路错误。更糟糕的是,毛刺的宽度随着温度和功耗变化。为此我们可以在时序always 块内使用非阻塞性赋值实现寄存输出。FSM可以使用一个时序always块,也可以在第二个时序always块添加相应的代码。此外如果状态比较简单,还可以定义这样一种状态机,它的输出就是状态位:assign {OUT3, OUT2, OUT1, OUT0} = state[3:0];

这样每个输出的时序都可预测,并且传播延时最小。这样的输出是没有毛刺的,因为假设输入的建立时间Ts和保持时间Th是可观测的,那么每个时钟最多只有一个触发器变化。如果一个输出对于两个连续的状态都是逻辑1,并且输入采取同步方法,那么就可以保证输出的下降沿不会出现毛刺。

数字逻辑模拟试卷

4、如果竞争的结果导致电路最终进入同一稳定总态,则称为临界竞争。 ( ) 5、门电路的扇出是表示输出电压与输入电压之间的关系。 ( ) 三、简答题(每题5分,共10分) 1、请列出3种“曾经是模拟的”现在却“已经成为数字的”系统,并简述为什么会有这种转变。 2、采用CMOS 晶体管实现的“与非门”和“或非门”,哪个速度快?为什么? 四、应用题(共70分) 1、已知接收端收到的汉明码码字a7a6a5a4a3a2a1=1100010,问在最多一位错的情况下发送端发送的码字是什么?(5分) 2、用卡诺图化简下列函数:(5分) ()()15,14,13,2,1,012,11,10,5,4,3,,,d F Z Y X W += ∑ 3、旅客列车分为特快A ,直快B 和慢车C ,它们的优先顺序为:特快、直快、慢车。同一时间内,只能有一趟列车从车站开出,即只能给出一个开车信号,试设计满足上述要求的开车信号控制电路。(10分) (1)列出真值表(5分) (2) 写出最简的输出逻辑表达式(5分) 4、运用一个MSI 器件实现余3码向8421BCD 码的转换。(10分) 5、运用“圈到圈”逻辑设计思想,采用74X138译码器和适当的逻辑门设计一个1位十进制数2421码的奇偶位产生电路(假定采用奇检验)。(10分)

1)作出状态/输出表(5分)。 2)说明它是Mealy 机还是Moore 机(2分) 3)说明这个电路能对何种输入序列进行检测。(3分) 7、作“0101”序列检测器的Mealy 型状态表和Moore 型状态表。凡收到输入序列为“0101”时,输出为1;并规定检测的“0101”序列不重叠。典型输入输出序列如下:(10分) 输入X :1 1 0 1 0 1 0 1 0 0 1 1 输出Z :0 0 0 0 0 1 0 0 0 0 0 0 看下面的例子就清楚了: 某序列检测器有一个输入端x 和一个输出端Z 。输入端 x 输入一串随机的二进制代码,当输入序列中出现011时,输出Z 产生一个1输出,平时Z 输出0 。典型输入、输出序列如下。 输入 x: 1 1 1 1 1 1 1 输出 Z: 1 1 试作出该序列检测器的原始状态图和原始状态表。 解.假定用Mealy 型同步时序逻辑电路实现该序列检测器的逻辑功能。 设: 状态A ------为电路的初始状态。 状态B ------表示收到了序列"011"中的第一个信号"0"。 状态C ------表示收到了序列"011"中的前面两位"01" 。 状态D ------表示收到了序列"011"。 ※ 当电路处在状态A 输入x 为0时,应令输出Z 为0转向状态B ;而处在状态A 输入x 为1时,应令输出Z 为0停留在状态A ,因为输入1不是序列"011"的第一个信号,故不需要记住。该转换关系如图5.16(a )所示。 Q1 Q2

用状态机设计的交通灯控制器

/module traffic (clock, reset, sensor1, sensor2, red1, yellow1, green1, red2, yellow2, green2); input clock, reset, sensor1, sensor2; output red1, yellow1, green1, red2, yellow2, green2; // Define the states. Enumerated type pragma allows Spectrum to chose encoding. parameter /*exemplar enum ee1 */ st0 = 0, st1 = 1, st2 = 2, st3 = 3, st4 = 4, st5 = 5, st6 = 6, st7 = 7; reg [2:0] /* exemplar enum ee1 */ state, nxstate ; reg red1, yellow1, green1, red2, yellow2, green2; // Update the state with the next state on the clock edge // or reset value. always @(posedge clock or posedge reset) begin if (reset) state = st0 ; else state = nxstate; end // // Calculate the next state and the outputs // based on the present state and the inputs // always @(state or sensor1 or sensor2) begin // Default values for the outputs

Verilog设计练习十例及答案

设计练习进阶 前言: 在前面九章学习的基础上,通过本章的练习,一定能逐步掌握Verilog HDL设计的要点。我们可以先理解样板模块中每一条语句的作用,然后对样板模块进行综合前和综合后仿真,再独立完成每一阶段规定的练习。当十个阶段的练习做完后,便可以开始设计一些简单的逻辑电路和系统。很快我们就能过渡到设计相当复杂的数字逻辑系统。当然,复杂的数字逻辑系统的设计和验证,不但需要系统结构的知识和经验的积累,还需要了解更多的语法现象和掌握高级的Verilog HDL系统任务,以及与C语言模块接口的方法(即PLI),这些已超出的本书的范围。有兴趣的同学可以阅读Verilog语法参考资料和有关文献,自己学习,我们将在下一本书中介绍Verilog较高级的用法。 练习一.简单的组合逻辑设计 目的: 掌握基本组合逻辑电路的实现方法。 这是一个可综合的数据比较器,很容易看出它的功能是比较数据a与数据b,如果两个数据相同,则给出结果1,否则给出结果0。在Verilog HDL中,描述组合逻辑时常使用assign 结构。注意equal=(a==b)1:0,这是一种在组合逻辑实现分支判断时常使用的格式。 模块源代码: " qual(equal),.a(a),.b(b)); 简单时序逻辑电路的设计 目的:掌握基本时序逻辑电路的实现。

在Verilog HDL中,相对于组合逻辑电路,时序逻辑电路也有规定的表述方式。在可综合的Verilog HDL模型,我们通常使用always块和@(posedge clk)或@(negedge clk)的结构来表述时序逻辑。下面是一个1/2分频器的可综合模型。 eset(reset),.clk_in(clk),.clk_out(clk_out)); endmodule 仿真波形: 练习:依然作clk_in的二分频clk_out,要求输出与上例的输出正好反相。编写测试模块,给出仿真波形。 练习三. 利用条件语句实现较复杂的时序逻辑电路 目的:掌握条件语句在Verilog HDL中的使用。 与常用的高级程序语言一样,为了描述较为复杂的时序关系,Verilog HDL提供了条件语句供分支判断时使用。在可综合风格的Verilog HDL模型中常用的条件语句有if…else和case…endcase两种结构,用法和C程序语言中类似。两者相较,if…else用于不很复杂的分支关系,实际编写可综合风格的模块、特别是用状态机构成的模块时,更常用的是case…endcase 风格的代码。这一节我们给的是有关if…else的范例,有关case…endcase结构的代码已后会经常用到。 下面给出的范例也是一个可综合风格的分频器,是将10M的时钟分频为500K的时钟。

第14章 状态机设计(state machine design)

第14章 状态机设计(State Machine Design) 讲到VHDL设计而不讲state machine,感觉上就是不太完整,我们先来看看什么是state machine,它应该是一种流程控制的设计,在有限的状态中,根据判别信号的逻辑值决定后面要进入哪一个状态,这样的讲法似乎有些抽象,我们先来看看下面的状态图。 图14-1所显示的是一个十字路口的红绿灯控制设计,在一开始时信号Reset 会被设为逻辑’0’,此时state machine会在Reset状态,一直等到信号Reset变成逻辑’1’时,state machine才会进入真正的控制状态。在之后的三个状态中,我们各定义了一个counter,当进入Red或是之后的Green及Yellow状态时,相对的counter值即会开始递减。当counter值递减到0时,state machine即会改变到下一个状态。 当然state machine的执行就是依照这种方式进行,但是其中仍有许多的细节是设计者所要注意的,在接下来的章节中,我们会依据实际的例子来介绍state machine的设计方式。 14-1State Machine的建立 在这一节我们所举的例子是一个类似检查密码的设计,在一般办公室的门口都会有门禁管制,进门前须先输入一组四个数字的密码,当密码确认无误后门才会打开,除此之外还有更改密码的功用。我们先来看看其状态图。 在图14-2中一共有四个状态,一开始会维持在idle状态,当要更改或是第一次输入密码时,需要按下一个特殊的“密码更改”按键,此时InpinN信号会变成逻辑’0’的状态,状态机即会进入LoadPin的状态,接着再输入四个数字的密码,密码输入完毕按下“输入”按键,状态机即回到原先的idle状态。 在另一方面,当处于平时状态,有人进入门口要输入密码前,他也必需要按下另一个特殊键“密码输入”,表示之后输入的数字是待验证的密码,此时InData 信号会变成逻辑’0’,于是状态机进入InPin的状态。在输入四个数字之后,一个

实验四 有限状态机设计(2学时)

实验四有限状态机设计(2学时) 实验内容一: 状态机是指用输入信号和电路状态(状态变量)的逻辑函数去描述时序逻辑电路功能的方法,也叫时序机。有限状态机是指在设计电路中加入一定的限制条件,一般用来实现数字系统设计中的控制部分。 根据时序电路输出信号的特点可将时序电路划为Mealy 型和Moore 型两种。Moore型电路中,输出信号仅仅取决于存储电路的状态。Mealy型电路中,输出信号不仅取决于存储电路的状态,而且还取决于输入变量。图1是某Mealy型电路的状态转换图,图中圆圈内的S0、S1等代表电路的状态,状态转换箭头旁斜杠“/”上边的数字代表输入信号,斜杠“/”下边的数字代表输出信号。假设电路的当前状态为S0,当输入信号为0时,电路的下一个状态仍为S0,输出信号为0;当输入信号为1时,电路的下一个状态为S1,输出为1。 图1 Mealy状态机 下面的程序中使用两个进程来描述该状态机。第一个进程负责状态转化,在CP上升沿到达时,当前状态(PresetState)向下一个状态(NextState)的转换;第二个进程负责检测输入信号(DIN)和当前状态(PresetState)的值,并由CASE-WHEN 语句决定输出信号(OP)和下一个状态值(NextState)的值。请补充下图中虚线“…”部分省略掉的程序,然后对完整程序进行编译,并用Tools->Netlist Views->State Machine Viewer和RTL Viewer工具查看该状态机的状态图和RTL顶层图。

… … 实验内容二: 论文《基于VHDL的一个简单Mealy状态机》中设计了一个Mealy状态机用来检测数据流“1101010”,用以验证状态机在数据检测上的应用。请在读懂文中程序的基础上,在Quartus Ⅱ软件中通过编译仿真得到状态图和波形图,仿真中输入波形的设置应能体现该状态机的用途。 实验报告: 本次实验占用两个学时,请于12周周四(5月12日)上课时交实验报告。对于实验内容一,报告的内容应重在程序的完善上,对于实验内容二,报告的内容应重在对论文中源程序的分析和理解,以及仿真的波形图上。

北京邮电大学 数字逻辑期末模拟试题8

本科试卷(八) 一、选择题(每小题2分,共30分) 1.逻辑函数F1=∑m (2,3,4,8,9,10,14,15), 它们之间的关系是________。 A . B . C . D .、互为对偶式 2. 最小项的逻辑相邻项是________。 A .ABCD B. C. D. 3. 逻辑函数F (ABC )=A ⊙C 的最小项标准式为________。 A.F=∑(0,3) B. C.F=m 0+m 2+m 5+m 7 D. F=∑(0,1,6,7) 4. 一个四输入端与非门,使其输出为0的输入变量取值组合有_______种。 A. 15 B. 8 C. 7 D. 1 5. 设计一个四位二进制码的奇偶位发生器(假定采用偶检验码),需要_______个异或门。 A .2 B. 3 C. 4 D. 5 6. 八路数据选择器如图1-1所示,该电路实现的逻辑函数是F=______。 A . B . C . D . 图1-1 7. 下列电路中,不属于时序逻辑电路的是_______。 A .计数器 B .触发器 C .寄存器 D .译码器 8. 对于JK 触发器,输入J=0,K=1,CP 脉冲作用后,触发器的次态应为_____。 A .0 B. 1 C. 保持 D. 翻转 9. Moore 型时序电路的输出_____。 A.与当前输入有关 B. 与当前状态有关 C. 与当前输入和状态都有关 D. 与当前输入和状态都无关 2F ABC ABCD ABC ABC ACD =++++12F F =12F F =12F F =1F 2F ABCD ABCD ABCD ABCD C A C A F +=AB AB +AB AB +A B ⊕A B +

如何设计最优化的状态机(有图版)

如何设计最优化的状态机 前言:数字电路通常分为组合逻辑电路和时序电路, 组合逻辑电路outputs = F(current inputs) 时序电路outputs = F(current inputs,past inputs) 有限状态机就是时序电路的数学抽象,一个有限状态机系统包括inputs ,outputs, states .状态机分为同步状态机(synchronous)和异步状态机(asynchronous),异步状态机由于输出信号不稳定,所以不详细讨论,对绝大多数设计来说,用的最广泛的是同步状态机。下面主要讨论了同步状态机的设计。 一.状态机的基础知识 1.1. moore状态机和mealy状态机的区别: 2.1.1moore状态机输出只依赖于及其的当前状态,与输入信号无关。这是moore状态机的优点。下面是moore状态机的模型: moore状态机比较容易用数学的方式来分析,因此被更广泛的用在代数状态机理论中(algebraic FSM theory)。 Mealy状态机输出依赖于机器现在的状态和输入的值,如果输入改变,输出可以在一个时钟周期中将发生了改变。其模型如下: 图的说明:state memory :保存现在的状态(current state s(t) ) state transistion function :根据现态和输入x(t),s(t+1)来决定下一个状态。 Output function :根据s(t)和x(t)来决定最后的输出。 Mealy 状态机通常可以有更少的状态变量,因此在工程领域有更为广阔的应用,状态变量越少,则所需的存储单元就越少。

verilog可综合有限状态机的4种写法(夏文宇书注)

verilog可综合有限状态机的4种写法(夏文宇书注) 第一种:自然编码 module fsm1( input i_clk, input rst_n, input A, output reg K1, output reg K2, output reg [1:0] state ); parameter Idle=2'b00, Start=2'b01, Stop=2'b10, Clear=2'b11; [email=always@(posedge]always@(posedge[/email] i_clk) if(!rst_n) begin state<=Idle; K2<=0; K1<=0; end else case(state) Idle:if(A) begin state<=Start; K1<=0; end else begin state<=Idle; K2<=0; K1<=0; end Start:if(!A) state<=Stop; else state<=Start; Stop:if(A) begin state<=Clear; K2<=1;

else begin state<=Stop; K2<=0; K1<=0; end Clear:if(!A) begin state<=Idle; K1<=1; K2<=0; end else begin state<=Clear; K2<=0; K1<=1; end default: state<=Idle; endcase endmodule 这种大家应该都熟悉的 第二种:采用独热编码,据说其可靠性和速度都不错module fsm2( input i_clk, input rst_n, input A, output reg K1, output reg K2, output reg [3:0] state ); parameter Idle=4'b1000; parameter Start=4'b0100; parameter Stop=4'b0010; parameter Clear=4'b0001; always@(posedge i_clk) begin if(!rst_n)

数字逻辑状态机例子

Digital System Design 1 2011/6/21 Computer Faculty of Guangdong University of Technology 例:用三进程状态机实现一个简单自动售货机控制电路,电路框图如下。该电路有两个投币口(1元和5角),商品2元一件,不设找零。In[0]表示投入5角,In[1]表示投入1元,Out 表示是否提供货品。

Digital System Design 2 2011/6/21 Computer Faculty of Guangdong University of Technology 根据题意,可分析出状态机的状态包括: S0(00001):初始状态,未投币或已取商品 S1(00010):投币5角 S2(00100):投币1元 S3(01000):投币1.5元 S4(10000):投币2元或以上 用独热码表示状态编码,如上所示。相应状态转换图如下(按Moore 状态机设计)。

Digital System Design 3 2011/6/21 Computer Faculty of Guangdong University of Technology 自动售货机状态转换图

Digital System Design 4 2011/6/21 Computer Faculty of Guangdong University of Technology 设计代码 第一个Always 块:状态转移。

Digital System Design 5 2011/6/21 Computer Faculty of Guangdong University of Technology 第二个Always 块:状态转移的组合逻辑条件判断

有限状态机设计

有限状态机设计 实验报告 一.实验题目 有机状态机设计 二.实验目的 掌握有机状态机设计的基本方法。 三.实验远离 状态机是指用输入信号和电路状态(状态变量)的逻辑函数去描述时序逻辑电路功能的方法,也叫时序机。有限状态机是指在设计电路中加入一定的限制条件,一般用来实现数字系统设计中的控制部分。 四.实验内容

实验内容一: 状态机是指用输入信号和电路状态(状态变量)的逻辑函数去描述时序逻辑电路功能的方法,也叫时序机。有限状态机是指在设计电路中加入一定的限制条件,一般用来实现数字系统设计中的控制部分。 根据时序电路输出信号的特点可将时序电路划为Mealy 型和Moore 型两种。Moore型电路中,输出信号仅仅取决于存储电路的状态。Mealy型电路中,输出信号不仅取决于存储电路的状态,而且还取决于输入变量。图1是某Mealy型电路的状态转换图,图中圆圈内的S0、S1等代表电路的状态,状态转换箭头旁斜杠“/”上边的数字代表输入信号,斜杠“/”下边的数字代表输出信号。假设电路的当前状态为S0,当输入信号为0时,电路的下一个状态仍为S0,输出信号为0;当输入信号为1时,电路的下一个状态为S1,输出为1。 图1 Mealy状态机 下面的程序中使用两个进程来描述该状态机。第一个进程负责状态转化,在CP上升沿到达时,当前状态(PresetState)向下一个状态(NextState)的转换;第二个进程负责检测输入信号(DIN)和当前状态(PresetState)的值,并由CASE-WHEN 语句决定输出信号(OP)和下一个状态值(NextState)的值。请补充下图中虚线“…”部分省略掉的程序,然后对完整程序进行编译,并用Tools->Netlist Views->State Machine Viewer和RTL Viewer工具查看该状态机的状态转移图和RTL原理图。

数字逻辑实验 8_序列检测器

实验八序列检测器的设计与仿真 一、实验要求 1.用VHDL语言设计一个Mealy机以检测“1101001”序列; 2.用VHDL语言设计一个Moore机以检测“1101001”序列; 3.在文本编辑区使用VHDL硬件描述语言设计逻辑电路,再利用波形编辑区进行逻辑功 能仿真,以此验证电路的逻辑功能是否正确。 二、实验内容 用VHDL语言设计各一个mealy和moore状态机测试“1101001”位串的序列检测器,并通过仿真波形验证设计的功能是否正确。 三、实验过程 由于在报告1中已经详尽描述了如何使用Quartus 2建立逻辑原理图和使用VHDL语言实现元件功能,所以本次的实验报告中便不再赘述上述内容,报告将主要就VHDL 语言描述实现元件的功能的过程进行阐述。 1.Mealy机 选择File→New,弹出新建文本对话框,在该对话框中选择VHDL File并单击OK按钮,进入文本编辑窗口,输入VHDL代码。 library ieee; use ieee.std_logic_1164.all; entity melay is port(clk,rst,d: in std_logic; z: out std_logic); end melay; architecture arc of melay is type state_type is(s0,s1,s2,s3,s4,s5,s6); signal state: state_type; begin process(clk,rst) begin if rst= '1' then state<=s0; elsif (clk'event and clk ='1') then case state is --1101001 when s0 => if d='1' then state<=s1; else

状态机及其VHDL设计

第7章状态机及其VHDL设计 内容提要:有限状态机(Finite State Machine,简称FSM)是一类很重要的时序电路,是许多数字系统的核心部件,也是实时系统设计中的一种数学模型,是一种重要的、易于建立的、应用比较广泛的、以描述控制特性为主的建模方法,它可以应用于从系统分析到设计的所有阶段。有限状态机的优点在于简单易用,状态间的关系清晰直观。建立有限状态机主要有两种方法:“状态转移图”和“状态转移表”。标准状态机通常可分为Moore和Mealy两种类型。本章主要介绍了基于VHDL的常见有限状态机的类型、结构、功能及表达方法,重点是如何有效地设计与实现。 学习要求:了解状态机的基本结构、功能和分类,掌握有限状态机的一般设计思路与方法、状态机编码方案的恰当选取、Moore和Mealy状态机的本质区别及设计实现。 关键词:状态机(State Machine),Moore,Mealy,VHDL设计(VHDL Design) 状态机的基本结构和功能 一般状态机的VHDL设计 状态机的一般组成 状态机的编码方案 摩尔状态机的VHDL设计 米立状态机的VHDL设计 状态机的基本结构和功能 状态机的基本结构如图所示。除了输人信号、输出信号外,状态机还包含一组寄存器记忆状态机的内部状态。状态机寄存器的下一个状态及输出,不仅同输入信号有关,而且还与寄存器的当前状态有关,状态机可以认为是组合逻辑和寄存器逻辑的特殊组合。它包括两个主要部分:即组合逻辑部分和寄存器。组合逻辑部分又可分为状态译码器和输出译码器,状态译码器确定状态机的下一个状态,即确定状态机的激励方程,输出译码器确定状态机的输出,即确定状态机的输出方程。寄存器用于存储状态机的内部状态。 状态机的基本操作有两种: 1.状态机的内部状态转换。 状态机经历一系列状态,下一状态由状态译码器根据当前状态和输入条件决定。2.产生输出信号序列。

转《明德扬分享》之【状态机的使用】

转《明德扬分享》之【状态机的使用】 (本文档由明德扬精心设计,版权归明德扬科教所有,转载请注明出处,否则明德扬有权追究其法律责任) 1.状态机概述 1.1 状态机的定义及作用 有限状态机FSM(Finite State Machine)简称状态机,通俗地说,状态机就是把全部的情况分成几个场景,这些场景的工作方式明显不同。广义而言,因触发器本身就是若干状态的集合,故只要涉及触发器应用的电路都属于状态机范畴,也即任何时序模型都可以归结为一个状态机。 状态机是数字系统设计的重要组成部分,对于数字系统设计工程师,面对的只要是时序电路设计,状态机的概念则是必须贯穿于整个设计始终的最基本的设计思想和设计方法论。只有从电路状态的角度去考虑,才能从根本上把握可靠、高效的时序逻辑的设计关键。在现代数字系统设计中,状态机的设计对系统的高速性能、高可靠性、高稳定性都具有决定性的作用。 状态机应用广泛(特别是对于操作和控制流程非常明确的系统设计),在数字通信领域、自动化控制领域、CPU设计领域等都拥有不可或缺的重要地位。 1.2 状态机的分类 按照不同的标准,状态机也有多种不同的分类形式,主要有以下几种: 1) 以状态机的信号输出方式分,有Mealy型和Moore型两种状态机。Mealy型状态机输出由当前状态和输入共同确定,Moore型状态机输出则仅取决于当前状态。 2) 以状态机的描述结构上分,有一段式、两段式、三段式三种类型状态机。 l 将整个状态机写到1个进程模块里,在该模块中既描述状态转移又描述状态的输入输出,称为一段式描述方法,即所谓的单进程状态机; l 一个模块用同步时序描述状态转移,另一个模块用组合逻辑判断状态转移条件、描述状态转移规律及逻辑输出,称为两段式描述方法;

Verilog奇偶分频、一段式、两段式、三段式状态机

汇报总结 1、偶数分频 偶数倍分频相对简单,可以通过计数器对预分频的脉冲沿计数实现,如果要进行N倍(N为整数)偶数分频,可由预分频的时钟触发计数器计数,当计数器从0计数到N/2—1时,输出时钟进行翻转,并给计数器一个复位信号,使得下一个时钟从零开始计数,以此循环下去。分频的主体程序如下: `define div_en 8 module freq_div_even(clk_in, reset, clk_out ); input clk_in; input reset; output clk_out; reg clk_out; reg[2:0] count; initial begin count=0; clk_out=0; end always@(posedge clk_in) begin if(!reset) begin count<=0; clk_out<=0; end else if(count==(`div_en/2-1)) begin clk_out<=~clk_out; count<=0; end else begin count<=count+1; end end endmodule 下面定义N为8,对一个脉冲8分频,测试程序如下: `timescale 1ns/1ns module testbench; reg reset; reg clk_in; reg[2:0] count;

wire clk_out; freq_div_even test(.clk_in(clk_in), .reset(reset), .clk_out(clk_out) ); initial begin reset=0; clk_in=0; #5 reset=1; end always #10 clk_in=~clk_in; endmodule 波形图如下: 2、奇数分频 对于对占空比没有特殊要求的奇数分频,需要对上升沿和下降沿脉冲进行计数,利用下降沿产生的波形移相半个输入脉冲的作用,最后用错位“异或”法实现。一个n(n=3)分频的程序如下: module clk_divN( clk_in, reset, clk_out ); input clk_in; input reset; output clk_out; integer cnt1,cnt2; reg clk_divp; reg clk_divn; parameter n=3; always@(posedge clk_in) begin if(!reset) begin clk_divp<=0; cnt1<=0; end else

数字逻辑第7篇习题

画出图7-5中所示的S-R锁存器的输出波形,其输入波形如图X7-4所示。假设输入和输出信号的上升和下降时间为0,或非门的传播延迟是10ns(图中每个时间分段是10ns) 解: 用图X7-5中的输入波形重作练习题7-2。结果可能难以置信,但是这个特性在转移时间比传输时间延迟短的真实器件中确实会发生。 解: 将图X7-41中的电路与图7-12中的锁存器进行比较。请证明这两个电路的功能是一致的。图X7-41中的电路常用于某些商用D锁存器中,在什么条件下该电路性能更好? 解:当C=0时,输入端2个与非门都关断,功能相同。 当C=1时,输入端2个与非门等同于反相器,功能也相同。 从传输延迟和电路代价比较:图X7-41的优点为节省一个反相器,电路代价较小,电路建立时间少一个反相器延迟,所需建立时间较短。缺点为下端输入的传输延迟较长(与非门比反相器长)。

图7-34表示出了怎样用D触发器和组合逻辑来构造带有使能端的T触发器。请表示出如何用带有使能端的T触发器和组合逻辑来构造D触发器。 解:先写出对应的特性表,再建立相应组合逻辑的卡诺图,最后写出激励组合逻辑的最小和表达: + T? ? = D ' D 'Q Q 请示出如何使用带有使能端的T触发器和组合逻辑来构造J-K触发器。 解:先写出对应的特性表,再建立相应组合逻辑的卡诺图,最后写出激励组合逻辑的最小和表达: ? =' T? + Q K Q J 分析图X7-9中的时钟同步状态机。写出激励方程,激励/转移表,以及状态/输出表(状态Q1Q2=00~11使用状态名A~D)。 解:激励方程D1=Q1’+Q2 D2=XQ2’ 输出方程Z=Q1+Q2’ 激励/转移表:现态和输入为变量,激励为函数,根据D触发器特性方程,激励/转移表可表达:

利用有限状态机进行时序逻辑的设计

利用有限状态机进行时序逻辑的设计 1. 实验目的: (1)掌握利用有限状态机实现一般时序逻辑分析的方法; (2)掌握用Verilog编写可综合的有限状态机的标准模板; (3)掌握用Verilog编写状态机模块的测试文件的一般方法。 (4)在数字电路中已经学习过通过建立有限状态机来进行数字逻辑的设计,而在VerilogHDL硬件描述语言中,这种设计方法得到进一步的发展。通过Verilog HDL提供的语句,可以直观的设计出更为复杂的时序逻辑的电路。关于有限状态机的设计方法在教材中已经作了较为详细的阐述。 2.实验环境 PC机一台,安装有quartusII13.0软件以及modulsim软件 3.实验内容 设计一个简单的状态机,功能是检测一个5位二进制序列“10010”。考虑到序列重叠的可能。有限状态机共提供8个状态(包括初始状态IDLE). 4.实验步骤 1) 源程序: module seqdet(x,z,clk,rst,state); input x,clk ,rst ;

output z; output [2:0] state ; reg[2:0] state ; wire z; parameter IDLE='d0, A='d1, B='d2, C='d3, D='d4, E='d5, F='d6, G='d7; assign z=(state == E && x==0)?1:0; always @(posedge clk) if(!rst) begin state <= IDLE; end else casex(state) IDLE:if(x==1)

有限状态机设计

实验七有限状态机设计 一、实验目的 1、掌握利用有限状态机实现一般时序逻辑分析的方法; 2、掌握用VHDL或Verilog编写可综合的有限状态机的标准模板; 3、掌握用VHDL或Verilog编写序列检测器以及其他复杂逻辑电路的设计; 二、实验内容 1、用MOORE型状态机设计一个具有双向步进电动机控制实验:该控制电路有三个输入信号:clk时钟信号,clr复位信号,dir方向控制信号。输出信号为phase[3..0]用来控制步进电机的动作。当dir=1时要求phase[3..0]按照“0001”,“0010”,“0100”,“1000”的顺序变化;当dir=0时要求phase[3..0]按照“0001”,“1000”,“0100”,“0010”的顺序变化。 2、设计一个简单的状态机,功能是检测一个5位的二进制序列“10010”。 3、设计一个串行数据检测器,要求是:连续4个或4个以上为1时输出为1,其他输入情况为0。(选做) 4、根据状态图,写出对应于结构图b,分别由主控组合进程和主控时序进程组成的VERILOG 有限状态机描述。(选做) 三、实验步骤 实验一: 1、建立工程

2、创建Verilog HDL文件 3、输入程序代码并保存 module moore1(clk,clr,dir,phase); input clk,clr,dir; output[3:0] phase; reg[3:0] phase; reg[1:0] state; parameter s0='b00,s1='b01,s2='b10,s3='b11; always@(posedge clk) begin if(clr)begin phase<='b0000;state<=s0;end else begin case(state) s0:if(dir) begin phase<='b0010;state<=s1;end else begin phase<='b1000;state<=s3;end s1:if(dir) begin phase<='b0100;state<=s2;end else begin phase<='b0001;state<=s0;end s2:if(dir) begin phase<='b1000;state<=s3;end

状态机写法

1 引言 Verilog HDL作为当今国际主流的HDL语言,在芯片的前端设计中有着广泛的应用。它的语法丰富,成功地应用于设计的各个阶段:建模、仿真、验证和综合等。可综合是指综合工具能将Verilog HDL代码转换成标准的门级结构网表,因此代码的描述必须符合一定的规则。大部分数字系统都可以分为控制单元和数据单元两个部分,控制单元的主体是一个状态机,它接收外部信号以及数据单元产生的状态信息,产生控制信号,因而状态机性能的好坏对系统性能有很大的影响。 有许多可综合状态机的Verilog代码描述风格,不同代码描述风格经综合后得到电路的物理实现在速度和面积上有很大差别。优秀的代码描述应当易于修改、易于编写和理解,有助于仿真和调试,并能生成高效的综合结果。 2 有限状态机 有限状态机(Finite State Machine,FSM)在数字系统设计中应用十分广泛。根据状态机的输出是否与输入有关,可将状态机分为两大类:摩尔(Moore)型状态机和米莉(Mealy)型状态机。Moore型状态机的输出仅与现态有关;Mealy型状态机的输出不仅与现态有关,而且和输入也有关。图1是有限状态机的一般结构图,它主要包括三个部分,其中组合逻辑部分包括状态译码器和输出译码器,状态译码器确定状态机的下一个状态,输出译码器确定状态机的输出,状态寄存器属于时序逻辑部分,用来存储状态机的内部状态。

图1 状态机的结构框图 2.1 好的状态机标准 好的状态机的标准很多,最重要的几个方面如下: 第一,状态机要安全,是指FSM不会进入死循环,特别是不会进入非预知的状态,而且由于某些扰动进入非设计状态,也能很快的恢复到正常的状态循环中来。这里面有两层含义。其一要求该FSM的综合实现结果无毛刺等异常扰动,其二要求FSM要完备,即使受到异常扰动进入非设计状态,也能很快恢复到正常状态。 第二,状态机的设计要满足设计的面积和速度的要求。 第三,状态机的设计要清晰易懂、易维护。 需要说明的是,以上各项标准,不是割裂的,它们有着直接紧密的内在联系。在芯片设计中,对综合结果评判的两个基本标准为:面积和速度。“面积”是指设计所占用的逻辑资源数量;“速度”指设计在芯片上稳定运行所能够达到的最高频率。两者是对立统一的矛盾体,要求一个设计同时具备设计面积最小,运行频率最高,这是不现实的。科学的设计目标应该是:在满足设计时序要求(包含对设计最高频率的要求)的前提下,占用最小的芯片面积,或者在所规定的面积下,使设计的时序余量更大,频率更高。另外,如果要求FSM安全,则很多时候需要使用“full case”的编码方式,即将状态转移变量的所有向量组合情况都在FSM 中有相应的处理,这经常势必意味着要多花更

硬件描述语言08-09B卷标准答案

2008/2009 学年第一学期末考试试题答案及评分标准 (B卷) 硬件描述语言及器件 使用班级:06060241/06060242 一、填空题(30分,每空格1分) 1、试举出两种可编程逻辑器件 CPLD 、 FPGA 。 2、VHDL程序的基本结构至少应包括实体、结构体两部分和对 库的引用声明。 3、1_Digital标识符合法吗?否, \12 @ +\ 呢?合法。 4、在VHDL的常用对象中,信号、变量可以被多次赋予不同的值, 常量只能在定义时赋值。 5、实体的端口模式用来说明数据、信号通过该端口的传输方向,端口模式有 in 、 Out 、 inout 、 buffer 。 6、VHDL语言中std_logic类型取值‘Z’表示高阻,取值‘X’表示不确定。 7、整型对象的范围约束通常用 range 关键词,位矢量用 downto/to 关键词。 8、位类型的初始化采用(字符/字符串)字符、位矢量用字符串。 9、进程必须位于结构体内部,变量必须定义于进程/包/子程序内部。 10、并置运算符 & 的功能是把多个位或位向量合并为一个位向量。 11、进程执行的机制是敏感信号发生跳变。 12、判断CLK信号上升沿到达的语句是 if clk’event and clk = ‘1’ then . 13、 IF 语句各条件间具有不同的优先级。

14、任何时序电路都以时钟为驱动信号,时序电路只是在时钟信号的边沿到来时, 其状态才发生改变。 15、 Moore 状态机输出只依赖于器件的当前状态,与输入信号无关。 二、判断对错并改正(12分,每小题3分) 1、CONSTANT T2:std_logic <= ’0’; (错)改正:把<= 换为:= 。 2、若某变量被定义为数值型变量,未赋初始值时默认值为‘0’。 (错)改正:把‘0’的单引号去掉。 3、在结构体中定义一个全局变量(V ARIABLES),可以在所有进程中使用。 (错)改正:“变量(V ARIABLES)”改为“信号”。 4、语句 type wr is (wr0,wr1,wr2,wr3,wr4,wr5); 定义了一个状态机变量wr, 可以直接对wr赋值。 (错)改正:语句 type wr is (wr0,wr1,wr2,wr3,wr4,wr5); 定义了一个状态机类型wr,需要定义一个该类型的对象,才可以对该对象赋值。 三、简答(8分,每小题4分) 1、简述如何利用计数器精确控制时序。 ?只要知道晶振频率f,即可知道周期T=1/f; ?使用一个计数器,可以通过计数值n,精确知道当计数值为n时消耗的时间t=nT; ?上例中以n为控制条件,可以控制其它信号在某时刻变高,某时刻变低,从而产生精 确时序; 例如:

状态机设计仿真

状态机设计仿真 一、实验例题 设计一个序列检测器电路,检测出串行输入数据data中的二进制序列110,当检测到该序列时,电路输出1 out=;没有检测到该序列时,电路输出0,电路的状态图如1所示: 图1 电路状态转换图 二、实验原理分析 由电路的状态图分析,可列出对应的状态转换表,如图2所示: 图2 状态转换表 +相同,将图1,图2简化可得: 从状态转化表分析可得S3与S0对应的S n1

改进的状态转换表 三、实验任务:依据图1状态图2表,S 存在时,用VerilogHDL设计的参考程序如 3 下: module pulse_check(data,clk,rst,out); input data,clk,rst; output out; reg out; reg[1:0] CST,NST; parameter[1:0] s0=0,s1=1,s2=2,s3=3; always@(posedge clk or negedge rst) if (!rst) CST<=s0;//复位有效,进入下一个状态 else CST<=NST; always@(CST or data) begin case(CST) s0: if(data==1'b1) NST<=s1; else NST<=s0; s1: if(data==1'b1) NST<=s2; else NST<=s0; s2: if(data==1'b0) NST<=s3; else NST<=s2; s3: if(data==1'b0) NST<=s0; else NST<=s1;

default: NST<=s0; endcase end always@(CST or data) case(CST) s0:out=1'b0; s1:out=1'b0; s2: if(data==1'b0) out=1'b1; else out=1'b0; s3:out=1'b0; endcase endmodule rst复位信号(低电平有效),clk状态时钟。四:仿真图形

相关文档
最新文档