2017-03-12 61 views
0

在VHDL中的僞代碼我想達到的目的是:如何將記錄寫入內存並將其恢復爲VHDL?

type tTest is record 
    A : std_logic_vector(3 downto 0); 
    B : std_logic_vector(7 downto 0); 
    C : std_logic_vector(0 downto 0); 
end record tTest; 
. . . 
signal sTestIn  : tTest; 
signal sMemWrData : std_logic_vector(fRecordLen(tTest)-1 downto 0); 
signal sMemRdData : std_logic_vector(fRecordLen(tTest)-1 downto 0); 
signal sTestOut  : tTest; 
. . . 
sMemWrData <= fRecordToVector(sTestIn); 
-- At some point sMemRdData gets the data in sMemWrData... 
sTestOut <= fVectorToRecord(sMemRdData); 

fRecordLen是直接從型和fRecordToVector和fVectorToRecord是希望自我解釋返回記錄的聚集長度的假想功能。目標是可合成的代碼,不會產生任何額外的邏輯。我發佈當前的解決方案作爲進一步澄清操作的答案。然而,這是非常尷尬的方法,由於鍋爐板代碼的數量,我不認爲它是一個可行的解決方案。

我知道record introspection proposal但並不屏住呼吸,甚至提出的方法似乎非常繁瑣。

我已經放棄了一個完全一般的解決方案的希望,所以一些讓步是可以接受的。例如,只允許記錄中的std_logic_vectors並使用幾個函數/過程調用。但是,避免使用任何必須手動或根據每個記錄進行外部腳本調整的任何鍋爐代碼將是非常好的。另外,如果有任何可以直接輸入/輸出記錄並且達到相同的Verilog/SystemVerilog包裝,則非常歡迎指針。

+0

哇。沒有評論的投票 - 對不要問作業抱歉,但如果這太明顯或示例答案不顯示研究,請做出評論或回答! – FritzDC

+0

*哇。沒有意見的投票 - 對不要求作業抱歉,但如果這太明顯或示例答案沒有顯示研究,請做出評論或回答!*你有沒有「放棄希望」?每個人都抱怨天氣,但沒有人願意爲此做任何事情。寫一個包。你的例子是兩個案例之一,作爲記錄內省的理由。轉換機制到/從任意記錄類型是不可能的。該子集不符合該語言的條件。而不是使用記錄如何使用定義字段的子類型? – user1155120

+0

_「如何使用子類型定義字段」_你會有指針或照顧舉個例子嗎?該記錄不是主要觀點,但不知何故,必須從std_logic_vectors中獲取不同信號的更多可讀數據,因此使用其他記錄是我願意採取的讓步之一。 – FritzDC

回答

0

這是一種實現要求的方法。評論中有缺點/改進的想法。

library ieee; 
use ieee.std_logic_1164.all; 
package TestPck is 
    type tTest is record 
     A : std_logic_vector(3 downto 0); 
     B : std_logic_vector(7 downto 0); 
     C : std_logic_vector(0 downto 0); 
    end record tTest; 
    procedure pSliceToFrom (
     signal vec_to : out std_logic_vector; 
     signal vec_from : in std_logic_vector; 
     position  : inout integer 
    ); 
end package TestPck; 

package body TestPck is 
    procedure pSliceToFrom (
    signal vec_to : out std_logic_vector; 
    signal vec_from : in std_logic_vector; 
    position  : inout integer 
    ) is 
    begin 
    vec_to <= vec_from(position-1 downto position-vec_to'length); 
    position := position-vec_to'length; 
    end pSliceToFrom; 
end package body TestPck; 

library ieee; 
use ieee.std_logic_1164.all; 
use work.TestPck.all; 

entity tb is 
end entity tb; 

architecture sim of tb is 
    signal sTestIn  : tTest; 
    -- How to create this constant in the package, 
    -- i.e. without needing the signal? 
    constant cTestLength : integer := sTestIn.A'length + sTestIn.B'length + sTestIn.C'length; 
    signal sMemWrData : std_logic_vector(cTestLength-1 downto 0); 
    signal sMemRdData : std_logic_vector(cTestLength-1 downto 0); 
    signal sTestOut  : tTest; 
begin 
    -- How to make this without needing to know what 
    -- is inside tTest? 
    sMemWrData <= sTestIn.A & sTestIn.B & sTestIn.C; 
    -- Memory, Fifo, communication link, doesn't matter... 
    sMemRdData <= sMemWrData after 5 ns; 
    -- How to get the data back without needing this 
    -- process (and the procedure)? 
    slice_data_to_item : process (all) is 
    variable vPosition : integer := 0; 
    begin 
    vPosition := cTestLength; 
    pSliceToFrom(sTestOut.A, sMemRdData, vPosition); 
    pSliceToFrom(sTestOut.B, sMemRdData, vPosition); 
    pSliceToFrom(sTestOut.C, sMemRdData, vPosition); 
    end process slice_data_to_item; 

process is 
    begin 
     wait for 10 ns; 
     sTestIn <= (x"E", x"A7", "1"); 
     wait for 10 ns; 
     sTestIn <= (x"7", x"AC", "0"); 
     wait; 
    end process; 
end architecture sim; 
+0

您似乎有[錯過](https://i.stack.imgur.com/0VZNM.png)fVectorToRecord部分。 – user1155120

+0

它的slice_data_to_item,[wave here](http://imgur.com/a/AOwgP)自然不是函數 - 這是我試圖找出如何去做的問題。 – FritzDC

1

將數據從矢量(線性數組)轉換爲記錄的一種方法是通過使用聚合。

library ieee; 
use ieee.std_logic_1164.all; 

package TestPck is 
    subtype A is std_logic_vector (12 downto 9); 
    subtype B is std_logic_vector (8 downto 1); 
    subtype C is std_logic_vector (0 downto 0); 
    constant ABC_len: natural := A'length + B'length + C'length; 
    type tTest is record 
     A: std_logic_vector (A'RANGE); 
     B: std_logic_vector (B'RANGE); 
     C: std_logic_vector (C'RANGE); 
    end record tTest; 
    type tTests is array (natural range <>) of tTest; 
end package TestPck; 

library ieee; 
use ieee.std_logic_1164.all; 
use work.TestPck.all; 

entity tb is 
end entity tb; 

architecture sim of tb is 
    signal sTestIn:  tTest; 
    signal sMemWrData:  std_logic_vector(ABC_len - 1 downto 0); 
    signal sMemRdData:  std_logic_vector(ABC_len - 1 downto 0); 
    signal sTestOut:  tTest; 
    constant tests:  tTests (0 to 1) := 
      (0 => (x"E", x"A7", "1"), 1 => (x"7", x"AC", "0")); 
begin 
    sMemWrData <= sTestIn.A & sTestIn.B & sTestIn.C; 
    sMemRdData <= sMemWrData after 5 ns; 
    sTestOut <= 
     tTest'(sMemRdData(A'range), sMemRdData(B'range), SMemRdData(C'range)); 
process is 
    begin 
     wait for 10 ns; 
     sTestIn <= tests(0); 
     wait for 10 ns; 
     sTestIn <= tests(1); 
     wait for 10 ns; 
     wait; 
    end process; 
end architecture sim; 

合格表達集合體定義爲t檢驗記錄的與位置相關聯,其被分配給該記錄類型sTestOut的值。

這給出:

tb.png

因此可以使用級聯用於組裝的矢量值(或在-2008的聚集體),並使用聚合爲合格的表達式來sMemRdData轉移到sTestOut。

如果您還沒有計劃宣佈的A,B或C亞型的對象,你可以聲明爲整數亞型:

library ieee; 
use ieee.std_logic_1164.all; 

package TestPck is 
    subtype A is natural range 12 downto 9; 
    subtype B is natural range 8 downto 1; 
    subtype C is natural range 0 downto 0; 
    constant ABC_len: natural := A'left + 1; 
    type tTest is record 
     A: std_logic_vector (A); 
     B: std_logic_vector (B); 
     C: std_logic_vector (C); 
    end record tTest; 
    type tTests is array (natural range <>) of tTest; 
end package TestPck; 

library ieee; 
use ieee.std_logic_1164.all; 
use work.TestPck.all; 

entity tb is 
end entity tb; 

architecture sim of tb is 
    signal sTestIn:  tTest; 
    signal sMemWrData:  std_logic_vector(ABC_len - 1 downto 0); 
    signal sMemRdData:  std_logic_vector(ABC_len - 1 downto 0); 
    signal sTestOut:  tTest; 
    constant tests:  tTests (0 to 1) := 
      (0 => (x"E", x"A7", "1"), 1 => (x"7", x"AC", "0")); 
begin 
    sMemWrData <= sTestIn.A & sTestIn.B & sTestIn.C; 
    sMemRdData <= sMemWrData after 5 ns; 
    sTestOut <= 
     tTest'(sMemRdData(A), sMemRdData(B), SMemRdData(C)); 
process is 
    begin 
     wait for 10 ns; 
     sTestIn <= tests(0); 
     wait for 10 ns; 
     sTestIn <= tests(1); 
     wait for 10 ns; 
     wait; 
    end process; 
end architecture sim; 

這可能是更容易一些閱讀。它會產生上面相同的波形。

+0

這整齊地擺脫了切片機程序,並允許包內的常量聲明 - 所以解決了3個問題中的2個!然而,代碼可能有點整潔,聲明子類型爲stA,然後在記錄中只有A:stA。這似乎工作 - 在記錄中使用std_logic_vector(A'range)而不是子類型會有一些好處嗎? – FritzDC

+0

現在我可以看到,最大的垮臺是事實上,範圍不是0°。我能夠做到這一點,沒有手動計算功能,但現在使用這些元素,「downto 0」在第二個自然,我不斷在切片記錄元素上犯錯誤。 – FritzDC

+0

啊!我想我知道了 - 使用常量而不是子類型,'長度爲1'的downto 0代替記錄中的範圍。此外,函數調用(from)和(to),而不是一個函數調用它。我可以發佈完整答案,但不要踩在user1155120的腳趾上 - 解決方案肯定是他/她的。 – FritzDC

相關問題