![](/img/trans.png)
[英]Verilog code runs in simulation as i predicted but does not in FPGA
[英]Verilog code works very well in Simulation but not on FPGA
我一直在尝试在Nexys 3(Spartan 6)板上实现一个简单的序列检测器。 该代码可以在Xilinx仿真上完美地运行,但是在硬件上却无法正常工作。 由于我不熟悉FPGA实现,因此无法解决此问题。 我不知道我应该对代码在硬件中进行什么更改。 如果有人可以帮助我,那就太好了。
这是代码
module sequence( in, clock,reset,test);
input in;
input reset;
output reg test=0;
reg [3:0] state=0, next=0 ;
input clock;
always@( posedge clock)
begin
if(reset==1)
begin
state= 0;
end
else
begin
state=next;
end
end
always @*
begin
if(reset == 1)
begin
next=0;
test=0;
end
else
begin
case ( state )
'd0 : begin
if ( in==1)
begin
next=state+1;
end
else
next=next;
end
'd1 : begin
if ( in==1)
begin
next=state+1;
end
else
next=0;
end
'd2 : begin
if ( in==1)
begin
next=state+1;
end
else
next=0;
end
'd3 : begin
if ( in==1)
begin
next=state+1;
end
else
next=0;
end
'd4 : begin
if ( in==1)
begin
next=state+1;
test=1;
end
else
next=0;
end
default : begin
next=0;
test=0;
end
endcase
end
end
endmodule
我会将您的Always Block的开头更改为:
always @*
begin
next = state;
test = 0;
case (state)
'd0 :
begin
if ( in==1)
next=state+1;
end
...
在状态机中为所有值设置默认分配消除了创建隐式锁存器的可能性。 您的“ next = next”语句应该没有任何作用,但是可能正在创建闩锁(应该是“ next = state”)。
同样,test没有在每个分支中分配,也没有默认值,因此它还会创建一个闩锁。
我在您的Verilog代码中发现的问题如下。
必须在每个case语句分支中分配输出变量test
,否则将形成不需要的闩锁。
指定顺序电路时,请使用nonblocking assignments
。
尝试如下编码您的序列检测器。
//sequence detector 101101
module fsm (rst,in1,clk,out1);
parameter s0 = 3'b000, s1 = 3'b001, s2 = 3'b010, s3 = 3'b011, s4 = 3'b100, s5 = 3'b101;
input rst,in1,clk;
output reg out1;
reg [2:0] state;
always @(posedge clk)
if (rst)
begin
state <= s0;
out1 <= 0 ;
end
else
case(state)
s0 : if (in1) begin state <= s1; out1 <= 0 ; end
else begin state <= s0; out1 <= 0 ; end
s1 : if (in1) begin state <= s0; out1 <= 0 ; end
else begin state <= s2; out1 <= 0 ; end
s2 : if (in1) begin state <= s3; out1 <= 0 ; end
else begin state <= s0; out1 <= 0 ; end
s3 : if (in1) begin state <= s4; out1 <= 0 ; end
else begin state <= s2; out1 <= 0 ; end
s4 : if (in1) begin state <= s1; out1 <= 0 ; end
else begin state <= s5; out1 <= 0 ; end
s5 : if (in1) begin state <= s1; out1 <= 1 ; end
else begin state <= s0; out1 <= 0 ; end
default: if (in1) begin state <= s0; out1 <= 0 ; end
else begin state <= s0; out1 <= 0 ; end
endcase
endmodule
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.