您的位置:首页 > 其它

[试验]10010序列检测器的三段式状态机实现(verilog)

2010-03-06 11:14 806 查看
序列检测器是时序数字电路设计中经典的教学范例,夏宇闻的《verilog数字系统设计教程》一书中有这个例子,用verilog设计一个“10010”序列的检测器。看完后我觉得F和G两个状态多余了,并且刚学了三段式状态机的写法,所以改写了这个程序,代码如下:

module seqdet(nrst,clk,x,z);
input nrst,clk;
input x;
output z;
reg z;

reg [4:0]CS,NS;
parameter [4:0]
IDLE=5'b00000,
A=5'b00001,
B=5'b00010,
C=5'b00100,
D=5'b01000,
E=5'b10000;

always @(posedge clk or negedge nrst)
begin
if(!nrst)
CS <= IDLE;
else
CS <= NS;
end

always @(nrst or CS or x)
begin
NS = 5'bx;
case(CS)
IDLE:    begin
if(x==1) NS=A; else NS=IDLE; end
A:begin
if(x==0) NS=B; else NS=A;end
B:begin
if(x==0) NS=C; else NS=A;end
C:begin
if(x==1) NS=D; else NS=IDLE;end
D:begin
if(x==0) NS=E; else NS=A;end
E:begin
if(x==0) NS=C; else NS=A;end
default:
NS=IDLE;
endcase
end

always @(posedge clk or negedge nrst)
begin
if (!nrst) z<=1'b0;
else begin
z<=1'b0;
case(NS)
IDLE,A,B,C,D: z<=0;
E:z<=1;
default:z<=0;
endcase end
end
endmodule


做仿真时没有写testbench,直接用Quartus II 8.1里的仿真工具进行了功能仿真,波形如下:



试验结果表明改写三段式状态机成功。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: