我在 vivado 中使用计数器,我想通过 UART 线发送这些计数器的输出。我有 UART 工作,但它每次发送只接受 8 位。在一次传输期间,我的计数器(由环形振荡器驱动)递增约 2048 次,因此为避免数据溢出,我将计数器设置为 12 位宽。我现在想获取 8 个最高有效位并通过 UART 线发送它们,但是我遇到了一个问题,即为计数器的 8 个最高有效位分配一个新的 8 位寄存器。我想知道如何修复我当前的代码。
我尝试使用我在 verilog 中制作的新模块来这样做。这是代码:
`timescale 1ns / 1ps
module Freezer(input[11:0] i, input clk, input freezer, output reg[7:0] O);
always @ (posedge clk) begin
if(freezer) begin
O <= i[11:4];
end
end
endmodule
此代码在 vivado 仿真中运行正常,但在我的 FPGA 上实际运行时会出现一些奇怪的错误。即,12 位计数器的 8 个最高有效位永久设置为 1。它们不会改变,只有 4 个最低有效位递增。我假设这是因为我在这个模块中使用了不可综合的逻辑,但我无法弄清楚为什么上述任何代码都不可综合。
只需创建一个寄存器 (x),然后将该寄存器分配给您的输出 (O)。如果您想为其分配任何注册值,您还需要将输出更改为电线。
timescale 1ns / 1ps
module Freezer(input[11:0] i, input clk, input freezer, output wire[7:0] O);
reg [7:0] x;
always @ (posedge clk) begin
x <= 0;
if(freezer) begin
x <= i[11:4];
end
end
assign O = x;
endmodule