`时间刻度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
我可以模拟,合成和实现它。但我不能在董事会上运行它。我可以知道问题是什么吗?谢谢。
答案 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模板。
这些都会导致非常糟糕的模拟结果。我认为您需要先解决这些问题并检查您的模拟是否仍然按预期运行。