需要额外LEs的VHDL函数?

需要额外LEs的VHDL函数?,vhdl,synthesis,Vhdl,Synthesis,我正在创建一个包含多个类似于以下定义的包 -- Control Register Address Type Declaration SUBTYPE ctrl_reg_addr_type IS std_logic_vector( ADDR_BITS-1 DOWNTO 0 ); -- Control Register Data Type Declaration SUBTYPE ctrl_reg_data_type IS std_logic_vector( DATA_B

我正在创建一个包含多个类似于以下定义的包

    -- Control Register Address Type Declaration
    SUBTYPE ctrl_reg_addr_type IS std_logic_vector( ADDR_BITS-1 DOWNTO 0 );
    -- Control Register Data Type Declaration
    SUBTYPE ctrl_reg_data_type IS std_logic_vector( DATA_BITS-1 DOWNTO 0 );
    -- Control Register Type Declaration
    SUBTYPE ctrl_reg_word_type IS std_logic_vector( CTRL_BITS-1 DOWNTO 0 );

    -- Left/Right Line-In Control Type Declarations
    CONSTANT LINE_IN_VOL_BITS : integer := 5;

    SUBTYPE line_in_volume_type IS natural
    RANGE 0 TO ( 2**LINE_IN_VOL_BITS )-1;

    TYPE line_in_ctrl_type IS RECORD

        -- Left/Right Channel Line Input Volume (4:0)
        -- Registers: LINVOL/RINVOL
        -- 0x1F = +12.0dB
        -- ...  =   1.5dB steps
        -- 0x00 = -34.5dB
        -- 0x17 - 0dB (Default)
        volume : std_logic_vector( LINE_IN_VOL_BITS-1 DOWNTO 0 );
        -- Left/Right Channel Line Input Mute to ADC (7)
        -- Registers: LINMUTE/RINMUTE
        -- 0x1 = Enable Mute
        -- 0x0 = Disable Mute
        mute   : std_logic;
        -- Left/Right Channel Line Input Volume and Mute Load (8)
        -- Registers: LRINBOTH/RLINBOTH
        -- 0x1 = Enable Simultaneous Load of LINVOL/LINMUTE <-> RINVOL/RINMUTE
        -- 0x0 = Disable Simultaneous Load
        both   : std_logic;

    END RECORD line_in_ctrl_type;
——控制寄存器地址类型声明
子类型ctrl_reg_addr_type为标准逻辑向量(addr_BITS-1向下至0);
--控制寄存器数据类型声明
子类型ctrl_reg_data_type为标准逻辑向量(数据位-1向下至0);
--控制寄存器类型声明
子类型ctrl_reg_word_type为标准逻辑向量(ctrl_位-1向下至0);
--控件类型声明中的左/右行
常量行(单位:字节):整数:=5;
卷中的子类型行是自然类型
范围0至(2**行(单位为卷位)-1;
在\u ctrl\u类型中键入行\u为记录
--左/右通道线输入音量(4:0)
--寄存器:LINVOL/RINVOL
--0x1F=+12.0dB
-- ...  =   1.5dB步长
--0x00=-34.5dB
--0x17-0dB(默认值)
音量:标准逻辑矢量(音量位1至0中的行);
--左/右通道线输入静音至ADC(7)
--寄存器:LINMUTE/RINMUTE
--0x1=启用静音
--0x0=禁用静音
静音:标准逻辑;
--左/右通道线输入音量和静音负载(8)
--寄存器:LRINBOTH/RLINBOTH
--0x1=启用LINVOL/LINMUTE RINVOL/RINMUTE的同时加载
--0x0=禁用同时加载
两者:标准逻辑;
结束\u ctrl\u类型的记录行\u;
我想使用类似于以下的函数来修改记录类型中的字段

    -- Left/Right Line-In Increase Volume Function Body
    FUNCTION increase_volume( ctrl : line_in_ctrl_type )
    RETURN line_in_ctrl_type IS

        VARIABLE volume : line_in_volume_type := 0;
        VARIABLE tmp    : line_in_ctrl_type;

    BEGIN

        tmp    := ctrl;
        volume := natural( to_integer( unsigned( ctrl.volume ) ) );

        IF ( volume < line_in_volume_type'HIGH ) THEN

            volume     := volume + 1;

            tmp.volume := std_logic_vector(
                              to_unsigned( volume, LINE_IN_VOL_BITS ) );

        END IF;

        RETURN ( tmp );

    END FUNCTION increase_volume;

    -- Left/Right Line-In Increase Volume Function Body
    FUNCTION increase_volume( ctrl : line_in_ctrl_type;
                              step : natural )
    RETURN line_in_ctrl_type IS

        VARIABLE volume : line_in_volume_type := 0;
        VARIABLE tmp    : line_in_ctrl_type;

    BEGIN

        tmp    := ctrl;
        volume := natural( to_integer( unsigned( ctrl.volume ) ) );

        IF ( volume < ( line_in_volume_type'HIGH - step ) ) THEN

            volume     := volume + step;

            tmp.volume := std_logic_vector(
                              to_unsigned( volume, LINE_IN_VOL_BITS ) );

        ELSE

            tmp := increase_volume( tmp );

        END IF;

        RETURN ( tmp );

    END FUNCTION increase_volume;
——增加音量功能体中的左/右行
功能增加音量(ctrl:line\u在ctrl\u类型中)
返回行\u在\u ctrl\u类型中为
可变音量:音量类型中的线=0;
变量tmp:line\u在\u ctrl\u类型中;
开始
tmp:=ctrl;
音量:=自然(到整数(无符号(ctrl.volume));
如果(音量

我的问题是,使用与所示示例类似的函数是否会比显式修改记录值使用更多的LE。

在VHDL中使用函数是非常抽象的(VHDL应该是这样的)。它可以离RTL尽可能远。这意味着,要想知道在LE's at中需要输入什么,确实很难确定。这主要取决于合成工具以及它们如何挑选逻辑结构

函数的合成更像一个宏。每次调用它时,可能会实例化同一逻辑块的另一个实例。你多久打一次电话

为了有效地使用LE,您需要编写重用功能块的代码。e、 g.编写一个通用结构读/写引擎并使用一次,但将输入和输出路由到不同的地方


如果您担心LE的使用,并且仍然想使用函数,我建议您考虑是否有足够大的FPGA。

使用这样的函数只需以方便的形式封装逻辑负载


如果您通过这种方式获得的逻辑使用与复制/粘贴有显著不同,请向您的合成供应商记录一个错误。

属于?感谢您的评论,我将查看此资源。没有问题-针对特定编程问题-针对代码审查等。我想我可以将此转化为更具体的问题。我将编辑我的回答。我认为这确实属于这里,这实际上是一个关于用C编写函数的最有效的代码方式的问题。谢谢你的评论!我想我将使用这两种类型的实现来比较RTL输出,以供参考。这不是一个真正的答案-您应该不接受它。接受糟糕的答案不会鼓励人们回答问题。你的问题的基本答案是“不”,除非你的合成器很差,但这要视情况而定。马丁的答案要好得多。