我做了我的代码行为仿真,它完美的作品。其结果如预测。当我综合我的代码,并将其上传到斯巴达3E FPGA和尝试使用的ChipScope分析,结果甚至没有接近我本来期望。我有什么错误呢? http://pastebin.com/XWMekL7r

有帮助吗?

解决方案

您的问题是与13-16行,在这里对状态寄存器中设置初始值:

 reg    [OUTPUT_WIDTH-1:0] previousstate = 0;              
 reg    [OUTPUT_WIDTH-1:0] presentstate = 1;
 reg    [6:0] fib_number_cnt = 1;  
 reg    [OUTPUT_WIDTH-1:0] nextstate = 1; 

这是一个相当于写入“初始”语句分配这些值,这是不可综合 - 有作为硬件的默认值没有这样的事情。当你把你的设计的FPGA内部,所有这些寄存器将采取随机值。

相反,你需要初始化这些计数器/你总是块的内部状态,当复位高。

always @(posedge clk or posedge reset)
  if (reset) begin
     previousstate <= 0;
     presentstate <= 1;
     ... etc ...
  end

答案到后续问题:

当你喜欢的初始化代码,什么都没有发生在硬件 - 它被完全忽略,就好像你已经投入了$显示语句。综合工具跳过所有模拟只构造,而通常给你某种关于它的警告(即实际上取决于工具)。

现在,阻塞和非阻塞的问题需要一个非常长的答案:)。我将引导您从SNUG-2000提出这可能是有史以来关于这一主题的最佳论文。它回答你的问题,以及关于该主题等等。之后,你就会明白为什么用时序逻辑闭锁声明被认为是不好的做法,为什么你的代码工作正常反正堵语句。

http://cs.haifa.ac.il /courses/verilog/cummings-nonblocking-snug99.pdf


更多的答案:

在通常的“模式”,以像你创建逻辑是具有两个总是块,一个限定所述逻辑,和一个限定所述触发器。在前者中,使用阻断语句来实现的逻辑,而在后者你锁存(或复位)将所生成的值。所以,这样的事情:

wire some_input;

// Main logic (use blocking statements)
reg state, next_state;
always @*
  if (reset) next_state = 1'b0;
  else begin
    // your state logic
    if (state) next_state = some_input;
    else next_state = 1'b0;
  end

// Flops (use non-blocking)
always @(posedge clock)
  if (reset) state <= 1'b0;
  else state <= next_state;

请注意,我使用同步复位,但你可以使用异步如果需要的话。

其他提示

线13-16是正确的。 “REG [6:0] fib_number_cnt = 1;”是不一样的使用“初始”的声明。读赛灵思合成指南关于如何初始化寄存器更详细的描述。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top