我在尝试编译时从Quartus收到此错误:
错误(10200):Verilog HDL条件语句错误发生于 time_of_day_FSM.v(166):在以下条件下无法匹配操作数 始终的封闭事件控件中的相应边 构造
这里是一些背景。我正在制作一个时钟,对于这个always
块,我想增加并设置某些值以类似于hh:mm:ss
格式的时钟行为。我有一个时钟源,它每毫秒都会变高,并且正在使用计数器来设置secondPassed
reg。
我希望块中的代码每过一秒钟就更新一次,例如时钟,或者在我的板上按KEY[2]
(down = 0
),因为这是用户用来递增的设置时钟时间时的小时,分钟或秒。这是有问题的always
块(抱歉,嵌套的if语句,我想不出一种更好的方法):
// every second. Used just to keep time going. Independent of states.
always @(posedge secondPassed, negedge KEY[2], negedge KEY[0]) begin
if(KEY[0] == 0) begin
hr1 <= 1;
hr0 <= 2;
min1 <= 0;
min0 <= 0;
sec1 <= 0;
sec0 <= 0;
end
else if(secondPassed == 1 || KEY[2] == 0) begin // I don't care about explicitly stating the conditions, as the sensitivity list covers that right?
if(sec0 == 9) begin
sec0 <= 0;
if(sec1 == 5) begin
sec1 <= 0;
if(min0 == 9) begin
min0 <= 0;
if(min1 == 5) begin
min1 <= 0;
if(hr1 == 1) begin
if(hr0 == 2) begin
hr0 <= 1; // go to 1 o'clock
hr1 <= 0;
end
else hr0 <= hr0 + 1;
end
else hr0 <= hr0 + 1;
end
else min1 <= min1 + 1;
end
else min0 <= min0 + 1;
end
else sec1 <= sec1 + 1;
end
else begin
sec0 <= sec0 + 1;
end
just_flashed <= ~just_flashed;
end // end big else
end // end always
我的问题是:如果我试图使非复位场景像“ JUST AND ELSE”一样,为什么Quartus编译器会抱怨:
// every second. Used just to keep time going. Independent of states.
always @(posedge secondPassed, negedge KEY[2], negedge KEY[0]) begin
if(KEY[0] == 0) begin
hr1 <= 1;
hr0 <= 2;
min1 <= 0;
min0 <= 0;
sec1 <= 0;
sec0 <= 0;
end
else begin // this is causing the issue. compiler complains .
// same logic to drive clock as above
just_flashed <= ~just_flashed;
end // end big else
end // end always
我觉得我已经看到了很多例子,这些例子中人们只是简单地使用代码,而其他代码则以代码结尾。我的代码似乎要我为else if明确地声明敏感度列表的条件。有什么解释吗?我是大型Verilog项目的新手。
答案 0 :(得分:3)
您正在always
块中混合组合逻辑和同步逻辑,这是编码的不良习惯。通常,大多数设计中有2个主要的always
块。
组合:
always@(*) // * adds anything under this always block to sensitivity list.
begin // Which makes this always block combinational.
count_reg_d <= somelogic;
end
然后将这些组合逻辑依次分配给适当的寄存器 总是阻止:
always@(posedge clk, negedge rst)
begin
if(~rst)
count_reg_q <= 0;
else
begin
count_reg_q <= count_reg_d;
end
end
通过这种编码方式,可以避免混合总是块,并且代码更具可读性,并且更接近于正在合成的硬件。因此,如果您正确更新always
块的敏感度列表,则必须解决问题。