在關於可配置嵌入式系統(在ZYNQ-7010上)的大學課程中,我們最近實現了一個(初始)低通圖像濾波器,該濾波器將應用一維高斯核(0.25 * [1 2 1])到來自Block RAM的數據。VHDL - 隊列中的變量與信號行爲
我們決定緩存(即隊列)三個像素,然後在數據輸出過程中在線操作它們。我們的第一種方法是具有三個過程變量,並使它們在時間方面翻轉過來;其中,以下是全部過程:
process (clk25)
-- queue
variable pixelMinus2 : std_logic_vector(11 downto 0) := (others => '0');
variable pixelMinus1 : std_logic_vector(11 downto 0) := (others => '0');
variable pixelCurrent : std_logic_vector(11 downto 0) := (others => '0');
-- temporaries
variable r : unsigned(3 downto 0);
variable g : unsigned(3 downto 0);
variable b : unsigned(3 downto 0);
begin
if clk25'event and clk25 = '1' then
pixelMinus2 := pixelMinus1;
pixelMinus1 := pixelCurrent;
pixelCurrent := RAM(to_integer(UNSIGNED(addrb)));
IF slv_reg0(3) = '0' THEN
-- bypass filter for debugging
dob <= pixelCurrent;
ELSE
-- colors are 4 bit each in a 12 bit vector
-- division by 4 is done by right shifting by 2
r := (
("00" & unsigned(pixelMinus2(11 downto 10)))
+ ("00" & unsigned(pixelMinus1(11 downto 10)))
+ ("00" & unsigned(pixelMinus1(11 downto 10)))
+ ("00" & unsigned(pixelCurrent(11 downto 10)))
);
g := (
("00" & unsigned(pixelMinus2(7 downto 6)))
+ ("00" & unsigned(pixelMinus1(7 downto 6)))
+ ("00" & unsigned(pixelMinus1(7 downto 6)))
+ ("00" & unsigned(pixelCurrent(7 downto 6)))
);
b := (
("00" & unsigned(pixelMinus2(3 downto 2)))
+ ("00" & unsigned(pixelMinus1(3 downto 2)))
+ ("00" & unsigned(pixelMinus1(3 downto 2)))
+ ("00" & unsigned(pixelCurrent(3 downto 2)))
);
dob <= std_logic_vector(r) & std_logic_vector(g) & std_logic_vector(b);
END IF;
end if;
end process;
然而,事實證明這是一個可怕的錯誤;合成會花費很長時間,估計LUT的使用量約爲設備能力的130%。
我們後來改的實施,使用信號,而不是變量這解決了所有的問題;硬件按預期運行,LUT使用率下降到百分之幾。
我的問題是什麼導致這裏的問題,當使用變量,從我們的理解,它應該像那樣工作。