爲什麼gamma_cor_array_s類不是常量? GAMMA_COR
與DEPH
類似,不需要觸發器,編寫一個函數來初始化gamma_cor_s的使用位置,而不使用實體/體系結構對。
正如gamma_cor_s的值是(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15)
rising_edge(CLK)後:
library ieee;
use ieee.std_logic_1164.all;
use work.mytypes.all; -- type gamma_cor_array
entity gam_cor_tb is
end entity;
architecture foo of gam_cor_tb is
signal clk: std_logic := '0';
constant DEPH: natural := 4;
constant GAMMA_COR: real := 1.0;
signal gamma_cor_array_s:
gamma_cor_array (2 ** DEPH - 1 downto 0) ;
begin
CLOCK:
process
begin
wait for 10 ns;
clk <= not clk;
wait for 10 ns;
wait; -- one ping only
end process;
DUT:
entity work.gamma_correction
generic map (
DEPH => DEPH,
GAMMA_COR => GAMMA_COR
)
port map (
clk => clk,
gamma_cor_array_s => gamma_cor_array_s
);
MONITOR:
process (gamma_cor_array_s)
begin
for i in 0 to (2 ** DEPH - 1) loop
report "gamma_cor_array_s(" & integer'image(i) & ") = " &
integer'image(gamma_cor_array_s(i));
end loop;
end process;
end architecture;
結果:
gamma_corrections.vhdl:75:13:@ 0毫秒:(報告注): gamma_cor_array_s(0) = 0 gamma_corrections.vhdl:75:13:0ms:(報告註釋):gamma_cor_array_s(1)= 0 gamma_corrections.vhdl:75:13:0ms:(報告 註釋):gamma_cor_array_s(2) = 0 gamma_corrections.vhdl:75:13:@ 0ms :(報告註釋):gamma_cor_array_s(3 (報告附註):gamma_cor_array_s(4)= 0 gamma_corrections.vhdl:75:13:0ms:(報告 注):gamma_cor_array_s(5)= 0 gamma_corrections.vhdl:75:13:0ms:(報告附註):gamma_cor_array_s(6) = 0 gamma_corrections.vhdl:75:13:0ms:(報告附註):gamma_cor_array_s(7)= 0 gamma_corrections.vhdl:75 (報告說明):gamma_cor_array_s(9) = 0 gamma_corrections.vhdl:75:13:0ms:(報告 note):gamma_cor_array_s(8)= 0 gamma_corrections.vhdl:75:13: @ 0ms :(報告註釋):gamma_cor_array_s(10)= 0 gamma_corrections.vhdl:75:13:@ 0ms :(報告 註釋):gamma_cor_array_s(11)= 0 gamma_corrections。vhdl:75:13:0ms:(報告附註):gamma_cor_array_s(12) = 0 gamma_corrections.vhdl:75:13:0ms:(報告附註):gamma_cor_array_s(13)= 0 gamma_corrections.vhdl:75:13 :@ 0ms :(報告 注):gamma_cor_array_s(14)= 0 gamma_corrections.vhdl:75:13:0ms:(報告註釋):gamma_cor_array_s(15) = 0 gamma_corrections.vhdl:75:13:@ 10ns :報告註釋:gamma_cor_array_s(0)= 0 gamma_corrections.vhdl:75:13:@ 10ns :(報告 註釋):gamma_cor_array_s(1)= 1 gamma_corrections.vhdl:75:13:@ 10ns: ):gamma_cor_array_s(2) = 2 gamma_corrections.vhdl:75:13:10ns :(報告註釋):gamma_cor_array_s(3)= 3 gamma_corrections.vhdl:75:13:@ 10ns :(報告 註釋):gamma_cor_array_s( 4)= 4 gamma_corrections.vhdl:75:13:@ 10ns :(報告說明):gamma gamma_cor_array_s(5) = 5 gamma_corrections.vhdl:75:13:@ 10ns :(報告註釋):gamma_cor_array_s(6)= 6 gamma_corrections.vhdl:75:13:@ 10ns :(報告 註釋):gamma_cor_array_s(7) (報告註釋):gamma_cor_array_s(8) = 8 gamma_corrections.vhdl:75:13:10ns :(報告註釋):gamma_cor_array_s(9)= 9 gamma_corrections。 (報告註釋): gamma_cor_array_s(11)= 11 gamma_corrections.vhdl:75(vhdl:75:13:@ 10ns)(報告 注意):gamma_cor_array_s(10)= 10 gamma_corrections.vhdl:75:13: :13:@ 10ns :(報告 註釋):gamma_cor_array_s(12)= 12 gamma_corrections.vhdl:75:13:@ 10ns :(報告註釋): gamma_cor_array_s(13)= 13 gamma_corrections.vhdl:75:13: @ 10ns :(報告 注):gamma_cor_array_s(14)= 14 gamma_corrections.vhdl:75:13:@ 10ns的:(報告註釋): gamma_cor_array_s(15)= 15
您申報64個人字拖,他們初始化所有'0',只有30個變爲'1' - 你沒有顯示所有的警告(這裏可以忽略)。使用real類型是不可移植的(實際值是近似的)。
對實體gamma_correction上下文條款應該是:不需要
library ieee;
ieee.std_logic_1164.all; -- for type std_logic, function rising_edge
use ieee.math_real.all; -- for function "**" [integer, real return real]
use work.mytypes.all; -- for type gamma_cor_array
到新躍大學的引用。
用於初始化常數,而不是使用在一個獨立的實體和架構產生的信號:
architecture fum of gam_cor_tb is
signal clk: std_logic := '0';
constant DEPH: natural := 4;
constant GAMMA_COR: real := 1.0;
-- signal gamma_cor_array_s:
-- gamma_cor_array (2 ** DEPH - 1 downto 0) ;
function gamma_correct return gamma_cor_array is -- added pure function
use ieee.math_real.all;
variable gamma_cor_array_s: gamma_cor_array(2 ** DEPH - 1 downto 0);
begin
for i in 0 to (2 ** DEPH - 1) loop
gamma_cor_array_s(i) := integer (
((real(i)/real (2 ** DEPH - 1)) ** GAMMA_COR) *
real(2 ** DEPH - 1)
);
end loop;
return gamma_cor_array_s;
end function;
constant gamma_cor_array_s: -- previously a signal
gamma_cor_array (2 ** DEPH - 1 downto 0) := gamma_correct;
begin
-- CLOCK:
-- process
-- begin
-- wait for 10 ns;
-- clk <= not clk;
-- wait for 10 ns;
-- wait; -- one ping only
-- end process;
-- DUT:
-- entity work.gamma_correction
-- generic map (
-- DEPH => DEPH,
-- GAMMA_COR => GAMMA_COR
-- )
-- port map (
-- clk => clk,
-- gamma_cor_array_s => gamma_cor_array_s
-- );
MONITOR:
process -- (gamma_cor_array_s)
begin
for i in 0 to (2 ** DEPH - 1) loop
report "gamma_cor_array_s(" & integer'image(i) & ") = " &
integer'image(gamma_cor_array_s(i));
end loop;
wait;
end process;
end architecture;
功能規範需要是先前作爲通用常量實體gamma_correction傳遞常數的範圍內。
該函數用於初始化一個常數,該常數是查找表以確定伽馬校正。
注意,沒有信號在基於事件的進程之間傳遞值。你爲gamma_cor_array_s分配的值從未改變(實體gamma_correction體系結構中的進程中的驅動程序)。
的輸出值是:
gamma_corrections.vhdl:126:13:@ 0毫秒:(報告注):gamma_cor_array_s(0) = 0 gamma_corrections.vhdl:126:13:@ 0毫秒:(報告註釋):gamma_cor_array_s(1)= 1 gamma_corrections.vhdl:126:13:0ms:(報告 註釋):gamma_cor_array_s(2)= 2 gamma_corrections.vhdl:126:13:0ms(報告註釋): gamma_cor_array_s(3) = 3 gamma_corrections。vhdl:126:13:@ 0ms :(報告註釋):gamma_cor_array_s(4)= 4 gamma_corrections.vhdl:126:13:0ms:(報告 註釋):gamma_cor_array_s(5)= 5 gamma_corrections.vhdl:126: 13:@ 0ms :(報告註釋):gamma_cor_array_s(6) = 6 gamma_corrections.vhdl:126:13:0ms:(報告註釋):gamma_cor_array_s(7)= 7 gamma_corrections.vhdl:126:13:0ms: (report report note):gamma_cor_array_s(8)= 8 gamma_corrections.vhdl:126:13:0ms:(report report):gamma_cor_array_s(9) = 9 gamma_corrections.vhdl:126:13:0ms:(report report ):gamma_cor_array_s(10)= 10 gamma_corrections.vhdl:126:13:0ms:(報告 note):gamma_cor_array_s(11)= 11 gamma_corrections.vhdl:126:13:0ms:(報告說明): gamma_cor_array_s (12)= 12 gamma_corrections.vhdl:126:13:0ms:(報告 註釋):gamma_cor_array_s(13)= 13 gamma_corrections.vhdl:126:13:@ 0毫秒:(報告注): gamma_cor_array_s(14)= 14 gamma_corrections.vhdl:126:13:@ 0毫秒:(報告 註釋) :gamma_cor_array_s(15)= 15
它與在時鐘的上升沿之後的先前信號的值匹配。
這有可能使gamma_cor_array_s的信號,進行動態分配,這需要所有的作業都是在一個過程中完成的(並行語句將制定一個過程的分配)
謝謝你的建議。你幫了我很多。我會推薦你的網站給我所有的朋友... –
[良好的問題](https://stackoverflow.com/help/how-to-ask)可以吸引很好的答案。結果不僅僅是一個問題和答案。他們可以爲那些有相同或類似問題的人提供資源。 – user1155120