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



我有两个模块,即main.vsignal.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

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

首先,如果您使用模块声明添加完整代码,则可以更好地理解您的连接并模拟您的代码。
问题出在信号类型上。尝试将输出更改为 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;
尝试修复此错误,您的模块将正常工作。

相关内容

最新更新