Verilog代码在模拟中工作得很好,但在FPGA上却不行
我一直在尝试在Nexys 3(Spartan 6)板上实现一个简单的序列检测器。该代码在Xilinx仿真上运行良好,但在硬件上不起作用。因为我是FPGA实现新手,所以无法解决这个问题。 我不知道我应该做什么改变,使代码在硬件中工作。 如果有人能帮助我就太好了 这就是代码Verilog代码在模拟中工作得很好,但在FPGA上却不行,verilog,simulation,fpga,xilinx-ise,Verilog,Simulation,Fpga,Xilinx Ise,我一直在尝试在Nexys 3(Spartan 6)板上实现一个简单的序列检测器。该代码在Xilinx仿真上运行良好,但在硬件上不起作用。因为我是FPGA实现新手,所以无法解决这个问题。 我不知道我应该做什么改变,使代码在硬件中工作。 如果有人能帮助我就太好了 这就是代码 module sequence( in, clock,reset,test); input in; input reset; output reg test=0; reg [3:0] st
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 @*
begin
next = state;
test = 0;
case (state)
'd0 :
begin
if ( in==1)
next=state+1;
end
...
将默认赋值设置为状态机中的所有值可以消除创建隐式锁存的可能性。您的“next=next”语句不应该有任何效果,但可能正在创建闩锁(可能应该是“next=state”)
此外,测试并不是在每个分支中分配的,也没有默认值,因此它还将创建一个闩锁。下面给出了我在您的Verilog代码中发现的问题
- 必须在每个case语句分支中分配输出变量
,否则将形成不需要的锁存test
- 指定顺序电路时,请使用非阻塞指定
//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
//序列检测器101101
模块fsm(rst、in1、clk、out1);
参数s0=3'b000,s1=3'b001,s2=3'b010,s3=3'b011,s4=3'b100,s5=3'b101;
输入rst、in1、clk;
输出reg out1;
reg[2:0]状态;
始终@(posedge clk)
如果(rst)
开始
状态我尝试使用coregen提供输入,并使用chipscope直接从笔记本电脑中的硬件查看输出,它工作正常。但我仍然无法在硬件中获得输出。我怀疑这一定是因为硬件的时钟频率,我无法看到输出。有没有办法更改频率斯巴达6中的时钟是否有用?