Verilog代码在Simulation中运行良好,但在FPGA上运行不佳

时间:2015-03-26 17:05:16

标签: 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] 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

2 个答案:

答案 0 :(得分:1)

我会将您的always块的开头更改为:

always @*
begin
  next = state;
  test = 0;

  case (state)
    'd0 :
      begin
        if ( in==1)
          next=state+1;
      end
  ...

为状态机中的所有值设置默认分配可以消除创建隐式锁存器的可能性。你的" next = next"声明不应该有任何影响,但可能会创建闩锁(应该是" next = state')。

此外,测试未在每个分支中分配,并且没有默认值,因此它也会创建一个锁存器。

答案 1 :(得分:0)

我在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