我正在尝试为BCD计数秒表编写一个模块。当我检查语法时,我得到错误说:
ERROR:HDLCompilers:26 - "../counter.v" line 24 expecting 'end', found 'else'
ERROR:HDLCompilers:26 - "../counter.v" line 25 unexpected token: '='
ERROR:HDLCompilers:26 - "../counter.v" line 25 unexpected token: '+'
ERROR:HDLCompilers:26 - "../counter.v" line 25 expecting 'endmodule', found '1'
在我的代码中间。我不太确定错误的来源,并试图实现更多的开始/结束,但这并不是问题所在。这是我目前的代码:
module BCDCount(en, clk, rst, direction, cTenths, cSec, cTS, cMin);
input en, clk, rst, direction;
output [3:0] cTenths, cSec, cTS, cMin;
reg [3:0] cTenths, cSec, cTS, cMin;
always @(posedge clk)
if(en)
begin
if(direction == 0)
if(cMin== 4'b 1001)
cMin <= 4'b 0000;
if(cTS == 4'b 0101)
cTS <= 4'b 0000;
cMin = cMin +1;
if(cSec == 4'b 1001)
cSec <= 4'b 0000;
cTS = cTS +1;
if(cTenths == 4'b 1001)
cTenths <= 4'b 0000;
cSec = cSec+1;
else
cTenths = cTenths +1;
else
cSec = cSec+1;
else
cTS = cTS + 1;
if(direction == 1)
if(cMin== 4'b 0000)
cMin <= 4'b 1001;
if(cTS == 4'b 0000)
cTS <= 4'b 1001;
cMin = cMin -1;
if(cSec == 4'b 0000)
cSec <= 4'b 1001;
cTS = cTS -1;
if(cTenths == 4'b 0000)
cTenths <= 4'b 1001;
cSec = cSec-1;
else
cTenths = cTenths -1;
else
cSec = cSec-1;
else
cTS = cTS - 1;
end
always @(posedge rst)
begin
cMin <= 0;
cTS <= 0;
cSec <= 0;
cTenths <= 0;
end
endmodule
答案 0 :(得分:1)
根据您的缩进结构,看起来您希望这个代码
...
if(cTS == 4'b 0101)
cTS <= 4'b 0000;
cMin = cMin +1;
if(cTenths == 4'b 1001)
...
在Cmin = cMin + 1
的情况下, cTS == 4'b0101
将被执行。但是,在Verilog中,if
语句仅适用于紧接在它们之前的语句(就像在C中一样)。为了使它们适用于多个语句,我们需要将这些语句包装在begin
- end
块中(就像C中的{}
一样。)
因此,您发现代码中包含else
语句的错误,但无法找到匹配的if
!
您想要使用以下内容:
...
if(cTS == 4'b 0101)
begin
cTS <= 4'b 0000;
cMin = cMin +1;
if(cTenths == 4'b 1001)
...
end
else
...
修改强>
另外值得注意的是 - 您在=
块中混合了阻止(<=
)和非阻塞(always
)分配。对于时钟always
块,您应该(基本上)始终使用非阻塞分配。将任何顺序分配移动到他们自己的always@(*)
块。
你也会得到信号有多个驱动程序的错误,因为你在多个always块中分配了一些信号值。