-2

我编写了一个用作计数器(秒)的模块,并在 Altera 板上的两个七段显示器上显示数字,每个数字一个。

这是模块:

module assignment2_sevenseg(clkin, seg1_output, seg2_output);

input clkin;
output reg [6:0] seg1_output;
output reg [6:0] seg2_output;
reg currentTime;

assignment2_sec seconds(.clkin(clkin), .output_sec(currentTime));

always @(currentTime)   

begin


digitaltimer timer(currentTime/10, seg1_output);  //left segment (line 14)
digitaltimer timer1(currentTime%10, seg2_output); //right segment (line 15)

end

endmodule

assignment2_sec 模块是另一个用于计数/增加秒数的模块。它应该工作正常。我得到的错误出现在 always 语句中 begin/end 语句之间的两行中。

错误 (10170):assign2_sevenseg.v(14) 附近文本处的 Verilog HDL 语法错误:“(”;期待“;”。检查并修复紧接在指定关键字之前或处出现的任何语法错误。

我也得到了第 15 行的确切错误。

这里也是digitaltimer模块,仅供参考。

module digitaltimer(num , segments); 

input [3:0] num ; 
output [6:0] segments ; 
reg [6:0 ] segments ; 
always@(num)

begin 

case (num)

0: segments <= ~7'b0111111;
1: segments <= ~7'b0000110;
2: segments <= ~7'b1011011;
3: segments <= ~7'b1001111;
4: segments <= ~7'b1100110;
5: segments <= ~7'b1101101;
6: segments <= ~7'b1111101;
7: segments <= ~7'b0000111;
8: segments <= ~7'b1111111;
9: segments <= ~7'b1101111;
default: segments <= ~7'bx ;

endcase
end
endmodule
4

2 回答 2

1

您在 always 块中实例化模块。正如您对assignment2_sec模块所做的那样,您应该“独立”实例化模块,即,不在任何程序块中(例如alwaysinitial等)。删除always @(currentTime) beginandend它应该没问题(我很确定除法和模数本来就很好;但我习惯于至少使用 SV-2005,而不是像你一样使用 V2K)。

digitaltimer在你的模块中还要注意,首先,使用always @(*)而不是always @(num),像你所做的那样使用明确的敏感度列表是一种容易陷入麻烦的方法。其次,在该块中使用阻塞赋值(=, not <=),因为它代表组合逻辑。<=仅在顺序块中使用 NBA ( )(例如always @(posedge clk))。最后,~7'bx === 7'bx所以你不需要它。

于 2015-11-28T22:00:06.353 回答
0

我认为这是不合法的:

digitaltimer timer(currentTime/10, seg1_output);  //left segment (line 14)

您正在尝试在实例化模块时执行数学运算。您应该使用自己的 reg 变量分别执行除法和取模操作,然后将这些操作的输出连接到digitaltimer模块。

于 2015-11-28T19:25:22.953 回答