我在FPGA数学运算中缺少什么?

问题描述

我正在尝试在VHDL中设计一个模块,以将一个范围转换为另一范围。例如,我想将10-100的范围转换为0-15的范围。当我将所有数学运算放到一行代码中时,它在模拟和Basys3开发板上都按预期工作。但是,在Vivado 2020.1中,我遇到了计时错误。为了解决时序误差,我将等式分解为单独的寄存器。我相信这称为流水线。将方程分解为单独的寄存器后,它可以在行为模拟中工作,但是当我将其上载到开发板时将无法工作。有什么想法为什么它不能在我的主板上工作?

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity Range_Converter is
    generic (
        g_Old_Max : integer := 100;
        g_Old_Min : integer := 10;
        g_New_Max : integer := 15;
        g_New_Min : integer := 0
    );
    port (
        i_Clk       : in std_logic;
        i_Old_Value : in integer range g_Old_Min to g_Old_Max;
        o_New_Value : out integer range g_New_Min to g_New_Max
    );
end Range_Converter;

architecture RTL of Range_Converter is

    constant c_Old_Range : integer := (g_Old_Max - g_Old_Min);
    constant c_New_Range : integer := (g_New_Max - g_New_Min);

    signal reg1 : integer range g_New_Min to g_New_Max := 0;
    signal reg2 : integer range g_New_Min to g_New_Max := 0;
    signal reg3 : integer range g_New_Min to g_New_Max := 0;
    signal reg4 : integer range g_New_Min to g_New_Max := 0;

begin

    process (i_Clk)
    begin
        if rising_edge(i_Clk) then

            --This works but there are timing errors.
            -- o_New_Value <= ((((i_Old_Value - g_Old_Min) * c_New_Range) / c_Old_Range) + g_New_Min);

            --No timing errors,but will not work.
            reg1        <= (i_Old_Value - g_Old_Min);
            reg2        <= (reg1 * c_New_Range);
            reg3        <= (reg2 / c_Old_Range);
            reg4        <= (reg3 + g_New_Min);
            o_New_Value <= reg4;

        end if;
    end process;

end RTL;

解决方法

谢谢您的回答,特里基。我发现了问题。 reg2寄存器的大小需要更大。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...