我有两个模块,即 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
根据我在输出示波器中看到的情况,这种方法不起作用,我不确定为什么会这样。第一种情况似乎工作正常,所以当我转向第二种情况时,我不知道为什么它会失败(信号看起来完全不同)。 我将不胜感激任何帮助/建议!
答案 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;
。
尝试修复此错误,您的模块将正常工作。