我用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;
答案 0 :(得分:2)
使用整数,您必须使用*
和/
运算符。如果它们在正确的位置具有恒定的2次幂(即在除法的右侧,乘法的任一侧),则合成器将“做正确的事情”。
或(正如Charles所说)使用signed
中的unsigned
或ieee.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>