这个Verilog代码有什么问题?

时间:2015-11-28 18:54:10

标签: verilog seven-segment-display

我写了一个作为计数器(秒)的模块,并在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):assignment2_sevenseg.v上的Verilog HDL语法错误(14)   接近文字:"(&#34 ;;期待&#34 ;;"。检查并修复任何语法错误   出现在指定关键字之前或之前。

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

这是数字时间模块,仅供参考。

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

2 个答案:

答案 0 :(得分:0)

我认为这不合法:

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

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

答案 1 :(得分:0)

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

另请注意,在digitaltimer模块中,首先使用always @(*)代替always @(num),使用明确的敏感列表,这是一种容易引发麻烦的方法。其次,在该块中使用阻塞分配(=,而不是<=),因为它表示组合逻辑。仅在顺序块中使用NBA(<=)(如always @(posedge clk)之类的东西)。最后,~7'bx === 7'bx所以你不需要它。