VHDL,在生成的語句VHDL,使用功能爲生成聲明
我有一個應該被實例化約8000倍的成分,我用-產生一些常數值的幫助下減少語句中使用函數代碼量,但我不得不聲明一個用於組件連接參數化的函數。
我的功能看起來是這樣的:
function dim1_calc (
cmp_index : integer;
prt_index : integer
) return integer is
variable updw : integer := 0;
variable shft_v : integer := 0;
variable result : integer := 0;
begin
if (cmp_index < max_up) then
updw := 1;
else
updw := 2;
end if;
case prt_index is
when 1 =>
shft_v := cnst_rom(updw)(1) + (i-1);
when 2 =>
shft_v := cnst_rom(updw)(2) + (i);
--
--
--
when 32 =>
shft_v := cnst_rom(updw)(32) + (i);
when others =>
shft_v := 0;
end case;
if (updw = 1) then
if (shft_v = min_up & ((prt_index mod 2) = 0)) then
result <= max_up;
elsif (shft_v = max_up & ((prt_index mod 2) = 1)) then
result <= min_up;
elsif (shft_v < max_up) then
result <= shft_v;
else
result <= shft_v - max_up;
end if;
else
--something like first condition statements...
--
--
end if;
return result;
end function;
和我的代碼部分使用此函數加上一些相關的部分看起來像這樣:
--these type definitions are in my package
type nx_bits_at is array (natural range <>) of std_logic_vector (bits-1 downto 0);
type mxn_bits_at is array (natural range <>) of nx_bits_at;
--
--
--
component pn_cmpn is
port(
clk : in std_logic;
bn_to_pn : in nx_bits_at(1 to row_wght);
pn_to_bn : out nx_bits_at(1 to row_wght)
);
end component;
--
--
--
signal v2c : mxn_bits_at(1 to bn_num)(1 to col_wght);
signal c2v : mxn_bits_at(1 to pn_num)(1 to row_wght);
--
--
--
gen_pn : for i in (1 to pn_num) generate
ins_pn : pn_cmpn port map (
clk => clk,
bn_to_pn(1) => b2p (dim1_calc(i, 1)) (dim2_calc(i, 1)),
bn_to_pn(2) => b2p (dim1_calc(i, 2)) (dim2_calc(i, 2)),
.
.
.
bn_to_pn(32) => b2p (dim1_calc(i, 32)) (dim2_calc(i, 32)),
pn_to_bn => p2b (i)
);
end generate;
我知道,使用過多的順序語句一起通常是不恰當的,我儘可能避免它們,但在這種情況下,我認爲這個函數不會合成一些真實的硬件,合成器只是計算輸出值,並將它放入相應的實例中該組件。我對嗎?或者這種編碼方式導致額外的硬件相比,只有8000實例。我最初使用「0 ...」來定義我的數組的第二維和第三維的範圍,但是由於在基於for-generate語句參數的維度計算函數中進行了混淆,所以我將其替換爲他們與「1到...」。這是好的!編碼風格還是應該避免它?
PS2:有沒有在上面的代碼中的端口映射部分組合到像這樣的方式: (我知道這是強烈的錯,它只是澄清了我想要的東西)
gen_pn : for i in (1 to pn_num) generate
ins_pn : pn_cmpn port map (
clk => clk,
gen_bn_to_pn : for j in (1 to 32) generate
bn_to_pn(j) => b2p (dim1_calc(i, j)) (dim2_calc(i, j)),
end generate;
pn_to_bn => p2b (i)
);
end generate;
讓我再舉一個例子 假設我有一個組件實例是這樣的:
ins_test : test_comp port map (
clk => clk,
test_port(1) => test_sig(2)
test_port(2) => test_sig(3)
test_port(3) => test_sig(4)
);
有沒有我可以使用這裏生成的方式?是這樣的:
ins_test : test_comp port map (
clk => clk,
gen_pn : for i in (1 to 3) generate
test_port(i) => test_sig(i+1)
end generate;
);
PS3:是否可以調用VHDL另一個函數裏面的函數嗎?
感謝您的回答。 你對max_up,cnst_rom和我的感覺是對的,我會讓我的函數變得純粹。 我的合成器是XST,我的FPGA是virtex-5,所以它會很好。 關於數組索引樣式:謝謝,這是一種解脫:) 是的,我問的是嵌套的生成語句。但這是一個特例,顯然我沒有解釋清楚。我補充說明了另一個例子。 –