Verilog代码模拟但FPGA作为预测不运行
题
我做了我的代码行为仿真,它完美的作品。其结果如预测。当我综合我的代码,并将其上传到斯巴达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;”是不一样的使用“初始”的声明。读赛灵思合成指南关于如何初始化寄存器更详细的描述。