尝试将信号移动到外部模块时遇到错误

时间:2017-04-10 04:18:28

标签: verilog fpga system-verilog

我有两个模块,即 main.v signal.v

main.v 中,我有几行代码更新16位reg tx,其值对应于方波。

   reg [1:0] counter;
   reg [15:0] tx;
   always @(posedge clk) begin
      counter = counter + 1;
      if (counter[1] == 1) begin
        tx[15:0] <= 16'b1010101010101010;
      else
        tx[15:0] <= 16'b0000000000000000;
   end

这很好用。但最终,我想将此信号转移到另一个文件 signal.v ,因为我传递给tx的信号将逐渐变得更加复杂。我尝试这样做时遇到了错误。最初,我尝试将上述所有代码移到 signal.v 文件中。然后在两个文件之间使用了一条线,如图所示。

module signal(clk, get_tx);
   input clk;
   output reg get_tx;
   reg [1:0] counter;

   always @(posedge clk) begin
      counter = counter + 1;
      if (counter[1] == 1) begin
        get_tx[15:0] <= 16'b1010101010101010;
      else
        get_tx[15:0] <= 16'b0000000000000000;
   end

然后在 main.v 中,我尝试添加

wire get_tx;
reg [15:0] tx;
signal my_signal(.clk(clk), .get_tx(get_tx));
always @( get_tx ) begin
     tx <= get_tx;
end

根据我在输出示波器中看到的情况,这种方法不起作用,我不确定为什么会这样。第一种情况似乎工作正常,所以当我转向第二种情况时,我不知道为什么它会失败(信号看起来完全不同)。 我将不胜感激任何帮助/建议!

1 个答案:

答案 0 :(得分:2)

首先,如果使用模块声明添加完整代码,将更好地理解您的连接并模拟代码。
问题出在信号类型中。尝试将输出更改为wire。您还需要声明总线,而不仅仅是1位信号。并为您的计数器提供初始值(在其他情况下,它会执行操作'X' +1,这会在结果中显示'X',并且您的条件if (counter[1] == 1)将永远无法实现。

module signal(clk, get_tx);
   input clk;
   output [15:0] get_tx;
   reg [15:0] tx_out;
   reg [1:0] counter = 2'd0;

   always @(posedge clk) begin
      counter = counter + 1;
      if (counter[1] == 1)
        tx_out[15:0] <= 16'b1010101010101010;
      else
        tx_out[15:0] <= 16'b0000000000000000;
   end
   assign get_tx = tx_out;
endmodule

上层模块中的下一个错误,您还需要声明总线而不是仅一位wire [15:0] get_tx;
尝试修复此错误,您的模块将正常工作。