VHDL:将乘法和切片组合成一行

VHDL: Combining multiplication and slicing into one line

我有一个硬件加速函数需要两个定点乘法实例。我当前的解决方案(下面的示例)每次乘法需要两个时钟周期;一步乘法,然后是第二步,该值被切回到原始输入字的大小。我希望延迟所需的周期尽可能少。

这是我目前的解决方案:

signal a        : std_logic_vector(7 downto 0);
signal b        : std_logic_vector(7 downto 0);
signal y        : std_logic_vector(7 downto 0);
signal product  : std_logic_vector(15 downto 0);
    
MULTIPLY_PROCESS : process(clk) 
    begin
        if(rising_edge(clk)) then
            product <= std_logic_vector(unsigned(a) * unsigned(b));
            y <= product(11 downto 4);      --takes one additional clock cycle
        end if;                             --for y to appear
end process;

我觉得这可以缩短到一个时钟周期,因为正常的无符号乘法会通过丢弃超大向量的顶端来自动执行此操作。

示例:

signal a    : std_logic_vector(7 downto 0);
signal b    : std_logic_vector(7 downto 0);
signal y    : std_logic_vector(7 downto 0);

MULTIPLY_PROCESS : process(clk)
    begin
        if(rising_edge(clk)) then
            y <= std_logic_vector(unsigned(a) * unsigned(b)); --truncates automatically
        end if;
end process;

这是我认为可行的代码,但会引发编译器错误:

y <= std_logic_vector(unsigned(x) * unsigned(a))(11 downto 4)

Error: Prefix of slice name cannot be type conversion (STD_LOGIC_VECTOR) expression.

有没有什么方法可以在单个 line/step/clock 周期中进行定点乘法和截断?

感谢用户 1155120。通过函数调用乘法,然后在转换之前对函数进行切片就可以了。

y <= std_logic_vector("*"(unsigned(x), unsigned(a))(11 downto 4));