在一些微控制器的外设上,我们有写敏感和读敏感寄存器。例如串口有一个
TX
寄存器,对它们的写操作会触发一些动作。我想在 FPGA 上实现相同的行为。
我用输入reg
serial
制作了一个模块TX
(输入真的可以是reg
吗?),每次更改后都会强制其处于未定义状态,但我犯了一些错误。这是我的代码:
module serial #(
parameter DATA_WIDTH = 8
)
(
input clk,
input reg [DATA_WIDTH-1:0] TX
);
reg fifo_write_req = 0;
always @(TX) begin
if (TX != {DATA_WIDTH{'x}})
begin
fifo_write_req <= 1;
end
end
always @(negedge clk) begin
fifo_write_req <= 0;
TX <= {DATA_WIDTH{'x}}; // Illegal reference to net "TX".
end
我怎样才能达到期望的行为?
输入可以是reg吗?
不,输入不保留状态。
请参阅戴夫·里奇 (Dave Rich) 的Verilog 中的这些电线和寄存器有什么用
您正在尝试分配作为输入的变量 TX。
这会在编译时产生错误;该帖子无法在 EDA Playground 上的任何商业模拟器上编译。
改变
input reg [DATA_WIDTH-1:0] TX
到
output reg [DATA_WIDTH-1:0] TX
修复错误。
如果您不需要输出,也可以使用局部变量。
还有
建议不要以这种方式分配和检测 x 以用于综合工作流程。
在综合工作流程和模拟工作流程中分配和检测 x 的行为方式不同。 在 FPGA 综合工作流程中,分配和检测 x 很少有意义。 当尝试强制进行额外优化或类似的操作时,可能会在嵌套的
if
或 case
语句中。