我想了解和改進我得到的 VHDL 代碼。
在 VHDL 實作中,有以下部分:
m1(000) <= MetricA(000) BrMet(3);
m1(001) <= MetricA(001) BrMet(1);
m1(002) <= MetricA(002) BrMet(0);
m1(003) <= MetricA(003) BrMet(2);
m1(004) <= MetricA(004) BrMet(0);
m1(005) <= MetricA(005) BrMet(2);
m1(006) <= MetricA(006) BrMet(3);
m1(007) <= MetricA(007) BrMet(1);
m1(008) <= MetricA(008) BrMet(2);
m1(009) <= MetricA(009) BrMet(0);
m1(010) <= MetricA(010) BrMet(1);
m1(011) <= MetricA(011) BrMet(3);
m1(012) <= MetricA(012) BrMet(1);
m1(013) <= MetricA(013) BrMet(3);
m1(014) <= MetricA(014) BrMet(2);
m1(015) <= MetricA(015) BrMet(0);
在哪里
type BRANCH_METRIC is array (3 downto 0) of STD_LOGIC_VECTOR (7 downto 0);
signal BrMet: RANCH_METRIC := (OTHERS =>(OTHERS => '0'));
type PATH_METRIC is array (15downto 0) of STD_LOGIC_VECTOR (7 downto 0);
signal MetricA: PATH_METRIC := (OTHERS =>(OTHERS => '0'));
我的問題:
1. m1(001), .... m1(015) , MetricA(001), .... MetricA(015) 表示某個位置的值:
m1(001)表示第一個單元格上的值,在第 m1(015)15個單元格上。能BrMet(0)有別的意思嗎?
2.我的任務是使用for-loop 重寫上面的代碼。我可以寫:
for i in 1 to 15 loop
m1(i) <= MetricA(i) BrMet(?);
我怎樣才能 BrMet 在這個回圈中添加?
我正在考慮創建一個表:
Tab = {3,1,0,2,0,2...}
{3,1,0,2,0,2...} 表示 BrMet(3)、BrMet(1)、BrMet(0) 等
我會把回圈寫成
for i in 1 to 15 loop
m1(i) <= MetricA(i) Tab(i);
但不幸的是,我沒有找到任何關于如何在 VHDL 中創建表格的資訊。有LUT表,位它沒有通過。
uj5u.com熱心網友回復:
“m1(001)表示第一個單元格上的值,位于第m1(015)15 個單元格上”
如果“第一個單元格”是指索引最小的單元格,那么不,m1(1)不是“第一個”單元格,它是“第二個”(并且m1(15)是“第十六個”),因為您將陣列型別宣告為 0 作為“ first" 索引,而不是 1。請注意,根據這些陣列定義,您的回圈可能是錯誤的:它們應該從索引 0 開始,而不是 1。
“還有別的意思嗎?BrMet(0) ”
除了什么?BrMet(0)是陣列BrMet中索引最小的單元格。
“我怎樣才能BrMet在這個回圈中添加? ”
您顯然知道如何宣告陣列型別并使用它們。這沒有什么不同。只需宣告一個陣列型別和此型別的常量:
type BrMetIdx_t is array(0 to 15) of integer;
constant BrMetIdx: BrMetIdx_t := (3, 1, 0, 2, 0, 2, 3, 1, 2, 0, 1, 3, 1, 3, 2, 0);
...
for i in 0 to 15 loop
m1(i) <= MetricA(i) BrMet(BrMetIdx(i));
end loop;
...
BrMetIdx_t注意:將陣列元素的型別限制為 0 到 3 范圍內的整數可能會更安全:
type BrMetIdx_t is array(0 to 15) of integer range 0 to 3;
這樣,如果在你的常量宣告中有一個拼寫錯誤,例如值 4,你會從編譯器中得到一個明確的錯誤資訊。
注意:您不必使用“ downto ”索引范圍宣告您的陣列型別。這是位向量的常見做法,因為從右到左對它們進行索引也很常見,但對于您的m1,MetricA和BrMet陣列,您可能也可以以更“自然”的方式對它們進行索引:
type BRANCH_METRIC is array (0 to 3) of STD_LOGIC_VECTOR (7 downto 0);
type PATH_METRIC is array (0 to 15) of STD_LOGIC_VECTOR (7 downto 0);
這可能有助于全球理解。
注意:我懷疑您是否會為(維特比?)解碼器的路徑和分支指標使用多個驅動器。因此,使用未決議的型別(如std_ulogic_vector代替std_logic_vector. 這樣,如果您不小心創建了多驅動器情況,您將從編譯器收到明確的錯誤訊息,而不是花費數小時試圖了解為什么X在仿真程序中看到所有這些值。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/417783.html
標籤:
上一篇:在for回圈定義與內部for回圈中遞增時C 指標行為的差異
下一篇:Wpf在運行時為空白
