Verilog行为代码被正确模拟但在FPGA上没有按预期工作

时间:2016-09-15 16:42:29

标签: verilog

`时间刻度1ns / 1ps

{{1}}

这是一个字母转换器。 OP是2位输入。 11和00意味着什么都不做。 01从ROM加载下一个字母(使用计数器更新地址)并转换为小写。 10加载下一个字母并转换为小写。如果不是大写或小写,则不会转换字母,或者小写但是OP想要将其转换为小写等。如果没有输入(00或11)或有效输入始终断言(01或10) ,然后输出仍然存在。

我使用p_state_copy来保存先前的状态,当下一个clk上升沿到来时,它与状态有一些重叠。因此它可以检查先前的状态是否为IDDLE(输入00或11)。 RESULT_COM是比较器的结果,用于检查字母状态。在图中,RESULT中的隐藏部分为0,因为复位被置位。enter image description here

我可以模拟,合成和实现它。但我不能在董事会上运行它。我可以知道问题是什么吗?谢谢。

2 个答案:

答案 0 :(得分:0)

always @ (n_state)
 begin
   p_state_copy = p_state;    
 end

此逻辑无法合成。 FPGA没有实际的方法来锁定逻辑信号变化的值(如p_state_copy)(如n_state)。

一般来说,用于FPGA上合成的代码中的always块应对同步块的posedge clk(或其他时钟信号)敏感,或对随机逻辑*敏感。指定单个信号只会让您陷入困境。

答案 1 :(得分:0)

这段代码有几个问题会阻止它正确合成。

 always @ (posedge clk)
 begin   
   if(rst == 1)
     RESET_C = 1;

应该更像

 always @ (posedge clk or posedge rst)
 if(rst == 1)
   RESET_C = 1;
else
begin

有几个@(...)敏感列表总是不完整的。 e.g。

always @ (p_state)
begin
  case(p_state)
   toLOWER:

缺少我到目前为止发现的p_state_copy和RESULT_COM。 如果你的工具允许使用always_comb

,我建议使用always @(*)或者甚至更好的可维护性

但是如果灵敏度列表不正确,几乎肯定会模拟错误。 (模拟工具将仅在指定输入发生变化时评估代码块,而不是实际组合逻辑,而不会产生该限制)。因此,许多合成引擎忽略了敏感度列表。

您还在梳状逻辑块中使用非阻塞分配,并阻止梳状逻辑块中的分配。

您正在使用变量定义的初始语句。这些将被合成引擎忽略。

此外,(rst == 1&&(OP!= 2'b00&& OP!= 2'b11))将无法正确合成。如果您希望它能正常运行,您需要坚持标准的触发器verilog模板。

这些都会导致非常糟糕的模拟结果。我认为您需要先解决这些问题并检查您的模拟是否仍然按预期运行。