Verilog HDL设计练习进阶(八)
2013-03-28
标签:

练习八. 利用有限状态机进行复杂时序逻辑的设计

目的:掌握利用有限状态机实现复杂时序逻辑的方法;

在数字电路中我们已经学习过通过建立有限状态机来进行数字逻辑的设计,而在Verilog HDL硬件描述语言中,这种设计方法得到进一步的发展。通过Verilog HDL提供的语句,我们可以直观地设计出适合更为复杂的时序逻辑的电路。关于有限状态机的设计方法在教材中已经作了较为详细的阐述,在此就不赘述了。

下例是一个简单的状态机设计,功能是检测一个5位二进制序列“10010”。考虑到序列重叠的可能,有限状态机共提供8个状态(包括初始状态IDLE)。

模块源代码:

seqdet.v

module seqdet(x,z,clk,rst,state);

inputx,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;

assignz = ( state==E && x==0 )? 1 : 0;//当x=0时,状态已变为E,

//状态为D时,x仍为1。因此

//输出为1的条件为( state==E && x==0 )。

always @(posedge clk)

if(!rst)

begin

state <= IDLE;

end

else

casex(state)

IDLE : if(x==1)

begin

state <= A;

end

A:if(x==0)

begin

state <= B;

end

B:if(x==0)

begin

state <= C;

end

else

begin

state <= F;

end

C:if(x==1)

begin

state <= D;

end

else

begin

state <= G;

end

D:if(x==0)

begin

state <= E;

end

else

begin

state <= A;

end

E:if(x==0)

begin

state <= C;

end

else

begin

state <= A;

end

F:if(x==1)

begin

state <= A;

end

else

begin

state <= B;

end

G:if(x==1)

begin

state <= F;

end

default:state=IDLE;//缺省状态为初始状态。

endcase

endmodule

测试模块源代码:

//------------------ seqdet.v -------------------

`timescale 1ns/1ns

`include "./seqdet.v"

module seqdet_Top;

reg clk,rst;

reg[23:0] data;

wire[2:0] state;

wire z,x;

assign x=data[23];

always#10 clk = ~clk;

always @(posedge clk)

data={data[22:0],data[23]};

initial

begin

clk=0;

rst=1;

#2 rst=0;

#30 rst=1;

data ='b1100_1001_0000_1001_0100;

#500 $stop;

end

seqdetm(x,z,clk,rst,state);

endmodule

仿真波形:

练习:设计一个串行数据检测器。要求是:连续4个或4个以上的1时输出为1,其他输入情况下为0。编写测试模块并给出仿真波形。

可能会用到的工具/仪表
相关文章
推荐文章
热门文章
章节目录
本站简介 | 意见建议 | 免责声明 | 版权声明 | 联系我们
CopyRight@2024-2039 嵌入式资源网
蜀ICP备2021025729号