我正在尝试编写可重用的模块并遇到问题。代码如下:
35 always @(BTN) begin
36 case (BTN)
37 4'b0001:
38 begin
39 digit1 <= digit1 + 1;
40 sevensegcase digi1 ( // the module i'm trying to reuse
41 .SEG_SEL_IN(n2B0[1:0], // n2B0 is a defined constant
42 .BIN_IN(digit1[3:0]),
43 .DOT_IN(n1B1), // another constant
44 .SEG_SEL_OUT(AN[3:0]), // Send digit selection to the anodes
45 .HEX_OUT(A_TO_G[7:0])); // Select appropriate segments
46 end
......
......
......
当我保存模块时,它会编译错误 当我合成模块时,我得到:
ERROR:HDLCompliers:26 - "Seven_Seg.v" line 40 unexpected token 'sevensegcase'
如果我将实例化放在always块之外,我会得到同样的错误。
答案 0 :(得分:1)
您正在实例化always @
块内的模块。在always @
块之外实例化它,给它输入线,并在你always @
块中将这些输入线分配给所需的信号。
sevensegcase digi1 (
.SEG_SEL_IN(n2B0[1:0], // n2B0 is a defined constant
.BIN_IN(digit1[3:0]),
.DOT_IN(n1B1), // another constant
.SEG_SEL_OUT(AN[3:0]), // Send digit selection to the anodes
.HEX_OUT(A_TO_G[7:0])); // Select appropriate segments
)
reg digit_reg[3:0];
always @(BTN) begin
case (BTN)
4'b0001:
begin
digit_reg <= digit_reg + 1;
end
assign digit1 = digit_reg;
旁注:不要忘记你的default:
案件!
答案 1 :(得分:0)
我认为问题在于您可能正在交换模块名称和实例名称。在Verilog中实例化模块时,它需要采用以下格式:
module_name instance_name (port_a, port_b, ...);
我猜测digi1可能是你的模块名称而sevensegcase是实例名称?如果是这样,你已经转换了订单,如果你解决了这个问题,它应该编译。另外,请确保在顶层模块之前编译子模块。