我有两个模块,即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
根据我在输出示波器中看到的内容,这种方法不起作用,我不确定为什么会这样。第一种情况似乎工作正常,所以我不知道为什么当我转到第二种情况时它会失败(信号看起来完全不同(。我将不胜感激任何帮助/建议!
首先,如果您使用模块声明添加完整代码,则可以更好地理解您的连接并模拟您的代码。
问题出在信号类型上。尝试将输出更改为 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;
。
尝试修复此错误,您的模块将正常工作。