将 N 个最高有效位分配给 Verilog 中的新寄存器

问题描述 投票:0回答:1

我在 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 个最低有效位递增。我假设这是因为我在这个模块中使用了不可综合的逻辑,但我无法弄清楚为什么上述任何代码都不可综合。

verilog fpga hdl vivado zynq
1个回答
-1
投票

只需创建一个寄存器 (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
© www.soinside.com 2019 - 2024. All rights reserved.