SRA不能拥有这样的操作数?

时间:2011-01-09 18:30:11

标签: type-conversion vhdl

我用VHDL编写了一个算法,但是我有这个消息,我不明白“sra / sla在这种情况下不能有这样的操作数。”有什么帮助吗?

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

entity hsl2rgb is
    generic(
        constant hue : integer := 85;
        constant sat : integer := 127
    );
    port(
        lum    : in  std_logic_vector(7 downto 0);
        ored   : out std_logic_vector(5 downto 0);
        ogreen : out std_logic_vector(5 downto 0);
        oblue  : out std_logic_vector(5 downto 0)
    );
end entity;

architecture behavioral of hsl2rgb is
begin

    process(lum)
        variable v : integer;
        variable m : integer;
        variable sextant : integer;
        variable fract : integer;
        variable vsf : integer;
        variable mid1 : integer;
        variable mid2 : integer;
        variable lumx : integer;
    begin
        lumx := to_integer(unsigned(lum));
        if (lumx < 127) then
            v := (lumx * (256 + sat)) sra 8;
        else
            v := (((lumx + sat) sla 8) - lumx * sat) sla 8;
        end if;

        if (v <= 0) then
            ored <= (others => '0');
            ogreen <= (others => '0');
            oblue <= (others => '0');
        else
            m := (2 * lumx) - v;
            sextant := (hue * 6) sra 8;
            fract := (hue * 6) - (sextant sla 8);
            vsf := (fract * (v - m)) sra 8;
            mid1 := m + vsf;
            mid2 := v - vsf;

            case sextant is
                when 0 =>
                    ored <= conv_std_logic_vector(v, 6);
                    ogreen <= conv_std_logic_vector(mid1, 6);
                    oblue <= conv_std_logic_vector(m, 6);
                when 1 =>
                    ored <= conv_std_logic_vector(mid2, 6);
                    ogreen <= conv_std_logic_vector(v, 6);
                    oblue <= conv_std_logic_vector(m, 6);
                when 2 =>
                    ored <= conv_std_logic_vector(m, 6);
                    ogreen <= conv_std_logic_vector(v, 6);
                    oblue <= conv_std_logic_vector(mid1, 6);
                when 3 =>
                    ored <= conv_std_logic_vector(m, 6);
                    ogreen <= conv_std_logic_vector(mid2, 6);
                    oblue <= conv_std_logic_vector(v, 6);
                when 4 =>
                    ored <= conv_std_logic_vector(mid1, 6);
                    ogreen <= conv_std_logic_vector(m, 6);
                    oblue <= conv_std_logic_vector(v, 6);
                when 5 =>
                    ored <= conv_std_logic_vector(v, 6);
                    ogreen <= conv_std_logic_vector(m, 6);
                    oblue <= conv_std_logic_vector(mid2, 6);
                when others =>
                    ored <= (others => '0');
                    ogreen <= (others => '0');
                    oblue <= (others => '0');
            end case;
        end if;
    end process;
end architecture;

2 个答案:

答案 0 :(得分:2)

使用整数,您必须使用*/运算符。如果它们在正确的位置具有恒定的2次幂(即在除法的右侧,乘法的任一侧),则合成器将“做正确的事情”。

或(正如Charles所说)使用signed中的unsignedieee.numeric_std library类型。

顺便说一下,当你使用conv_std_logic_vector时,为什么要使用ieee.numeric_std

ored <= std_logic_vector(to_unsigned(mid1, 6));

应该是你需要的,然后你可以摆脱讨厌的ieee.std_logic_arith

(旁白:如果你(或未来的读者)瞄准FPGA(我接受你可能不是,但现在很多人:)你可能会发现需要在某种程度上管理这个架构目标频率具有挑战性。在简短的眼球合成中,有超过六个加法器,几个实数乘法器和几个多路复用器 - 所有这些都在一个时钟周期内完成。特别是这将排除使用我所知道的所有FPGA中的硬乘法器

答案 1 :(得分:1)

问题是您已将std_logic_vector I / O转换为整数以执行数学运算,但sra / srl操作数仅适用于位或布尔类型的1D数组。尝试使用有符号或无符号类型(数字的位向量表示)而不是混合std_logic_vectors(没有固有数值)和整数(没有位向量表示),你可能会有更好的运气。< / p>