1. gzyueqian
      13352868059
      首頁 > 新聞中心 > > 正文

      TEXTIO及其在VHDL仿真中的應用

      更新時間: 2007-09-04 17:30:00來源: 粵嵌教育瀏覽量:916

        TEXTIO 在VHDL 仿真與磁盤文件之間架起了橋梁,使用文本文件擴展VHDL 的仿真功能。本文介紹TEXTIO 程序包,以一個加法器實例說明TEXTIO 的使用方法,使用ModelSim 對設計進行仿真,并分析仿真結果。

        在對VHDL 源程序進行仿真時, 由于有的輸入輸出關系僅僅靠輸入波形或編寫testbench 中的信號輸入是難以驗證結果正確性的, 例如, 設計8 位加法器, 如果將所有的輸入都驗證一遍, 是非常麻煩的, 因為要全面判斷輸出是否正確需要一個個的驗證。此外,若用VHDL 設計一個處理器, 需要讀入指令,這時候采用文本文件非常必要。
         
        TEXTIO 提供了VHDL 仿真時與磁盤文件的交互。在驗證加法器時候, 可以將所有輸入保存在一個文本文件中, 將其它軟件計算出的結果保存在另外的文件中。在VHDL 仿真時,可以直接讀取輸入文件作為設計的輸入參數, 并自動將結果與事先保存的文件相比較,給出一定的信息來確定結果的正確與否。在對VHDL 編寫的處理器調試時, 可以將包括指令類型、源地址、目標地址在內的指令保存成文本文件, 利用TEXTIO 來讀取這些指令。同時, 將結果及中間變量保存成文本文件,以事后判斷是否正確及便于查找原因。
         
        由于TEXTIO 的文本輸入輸出功能非常有限, 一些公司提供了擴展其功能的程序包,例如std_developerskit庫中的std_iopak 程序包。在本文中,僅僅對TEXTIO 程序包做簡單的介紹及其簡單的使用。

        1 TEXTIO介紹
         
        TEXTIO 是VHDL 標準庫STD 中的一個程序包(Package)。在該包中定義了三個類型:LINE 類型、TEXT類型以及SIDE 類型。另外,還有一個子類型(subtype)WIDTH。此外, 在該程序包中還定義了一些訪問文件所必須的過程(Procedure)。

        1.1 類型定義

        (1)type LINE is access string
         
        定義了LINE 為存取類型的變量,它表示該變量是指向字符串的指針,它是TEXTIO 中所有操作的基本單元。讀文件時,先按行(LINE)讀出一行數據,再對LINE 操作來讀取各種數據類型的數據;寫文件時, 先將各種的數據類型組合成LINE,再將LINE 寫入文件。在用戶使用時, 必須注意只有變量才可以是存取類型, 而信號則不能是存取類型。例如, 我們可以定義
        variable DLine : LINE;

        但不能定義成
        signal DLine : LINE;

        (2)type TEXT is file of string

        定義了TEXT 為ASCII 文件類型。 定義成為TEXT 類型的文件是長度可變的ASCII 文件。例如在TEXTIO 中定義了兩個標準的文本文件。

        file input : TEXT open read_mode is"STD_INPUT";
        file output : TEXT open write_mode is"STD_OUTPUT";

        定義好以后,就可以通過文件類型變量input 和output 來訪問其對應的文件STD _ INPUT 和STD_OUTPUT。
      需要注意的是VHDL'87 和VHDL'93 在使用文件方面有較大的差異,在編譯時注意選中對應的標準。

        (3)type SIDE is (right,left)
        定義了SIDE 類型。表示定義了一個名為SIDE 的數據類型,其中只能有兩種狀態,即right 和left,分別表示將數據從左邊還是右邊寫入行變量。該類型主要是在TEXTIO 程序包包含的過程中使用。

        (4)subtype WIDTH is natural
        定義WIDTH 為自然數的子類型。所謂子類型表示其取值范圍是父類型范圍的子集。

        1.2 過程定義

        TEXTIO 提供了基本的用于訪問文本文件的過程。類似于C++,VHDL 提供了重載功能, 即完成相近功能的不同過程可以有相同的過程名, 但其參數列表不同, 或參數類型不同或參數個數不同。

        TEXTIO 提供的基本過程有:

        procedure READLINE(文件變量;行變量);用于從指定文件讀取一行數據到行變量中。
        procedure WRITELINE(文件變量;行變量);用于向指定文件寫入行變量所包含的數據。
        procedure READ(行變量;數據類型);用于從行變量中讀取相應數據類型的數據。
        根據參數數據類型及參數個數的不同,有多種重載方式,TEXTIO 提供了bit、bit_vector 、BOOLEAN 、character、 integer、real、string、time數據類型的重載。同時, 提供了返回過程是否正確執行的BOOLEAN 數據類型的重載。例如, 讀取整數的過程為

        procedure READ(L:inout LINE; VALUE: out integer; GOOD: out BOOLEAN);
        其中,GOOD 用于返回過程是否正確執行, 若正確執行, 則返回TRUE 。
        procedure WRITE(行變量; 數據變量; 寫入方式; 位寬);

        該過程將數據寫入行變量。其中寫入方式表示寫在行變量的左邊還是右邊,且其值只能為left 或right,位寬表示寫入數據時占的位寬。例如:

        write(OutLine,OutData,left,2);
        表示將變量OutData 寫入LINE 變量OutLine 的左邊占2 個字節。

        2 TEXTIO應用實例
         
        下面以一個簡單的8 位加法器來說明TEXTIO 的使用。輸入數據為兩個8 位的有符號數, 輸出為9 位的有符號數,以防止溢出。在編寫加法器的描述文件時,首先要對兩個數進行位的擴展,再進行加法運算。在編寫測試文件時, 要注意讀入數據與得到結果之間相差一個時鐘周期。因此, 需要在讀出的結果與計算的結果之間插入一個時鐘周期的等待。

        ① 生成輸入及預定結果文件的C++程序。

        我們可以使用VC++、Matlab 等軟件工具編寫生成輸入和預定結果文件的程序。由于設定輸入為8 位有符號數, 因此,其范圍為[-127,127]。C++程序如下:

        #include " iostream.h"
        #include " stream.h"
        void main(void){
        int i,j;
        ofstreamfsIn("d:\\yuproj\\modelsim\\NineBitAdder2\\TestData.dat");
        ofstreamfsOut("d:\\yuproj\\modelsim\\NineBitAdder2\\Result.dat");
        for(i=-127;i<128;i++) {
        for(j=-127;j<128;j++) {
        fsIn<<i<<""<j<<endl;
        fsOut<<i+j<<endl;
        }
        }
        fsIn.close();
        fsOut.close();
        }
        在程序中,使用了C++類庫iostream.h和fstream.h,主要使用了"<< " 的輸出功能, 讀者可以參考相應的C++書 籍。運行該程序可以在規定的目錄下生成TestData.dat 和Result.dat 兩個文本格式的文件。注意,一行輸入多個數據時, 之間以空格隔開即可。

        ② 編寫的加法器描述如下。
        
        libraryieee;
        useieee.std_logic_1164.all;
        useieee.std_logic_signed.all;
        entity Add2In is
        port( D1 : in std_logic_vector(7 downto 0);
        D2 : in std_logic_vector(7 downto 0);
        Q : out std_logic_vector(8 downto 0);
        Clk: instd_logic);
        end Add2In;  
        architecture A_Add2In of Add2In is
        begin
        process(Clk)
        begin
        if Clk = ‘1’and Clk’event then
        Q <= (D1(D1’left) & D1) + (D2(D2’eft) & D2);
        endif;
        endprocess;
        end A_Add2In;

        在進行加法前, 首先進行位的擴展, 再進行加法運算, 在時鐘的上升沿完成加法運算。

        ③ 編寫測試文件。

        在測試程序中, 首先讀出輸入文件的一行內容,再從該行中提取出兩個值輸入加法器。從預定結果文件中提取出一個值, 將加法器計算結果與該值比較, 若兩者不同則輸出警告信息。也可以將輸出寫入一個文本文件, 再比較兩個文本文件的異同以獲知出錯的地方。這里要注意的是要使用TEXTIO 程序包, 另外, 測試文件實體內的端口為空, 相當于一塊獨立的電路板。使用Component 在其中包含了上面定義的加法器, 該獨立的電路板所完成的功能是對設計的加法器進行測試。在程序中使用了assert 斷言語句,要注意該語句后的表達式或變量為真時不執行后續的輸出,為假時執行后續的輸出。在程序中,還使用了類型轉換函數CONV _ STD _LOGIC_VECTOR (),將整數轉換為8 位的標準類型。另外,在程序中定義了變量Dlatch ,該變量的作用是將計算結果與預定結果的比較延遲一個時鐘周期, 周期地與預定結果比較。

        3 仿真結果
         
        在ModelSim 中可以將它們編譯仿真,注意在編譯時選擇語法標準為VHDL'93 標準。編譯后, 可以輸入如下的仿真Macro 來執行仿真。

        vsim work.tb
        該命令將執行仿真work 庫中的tb,其中tb 為測試文件的實體名。

        add wave -dec *
        該命令將所有的信號以十進制添加到波形文件中。

        run-all
        該命令將使仿真一直執行下去。

        輸入以上各個命令,仿真結束后會在ModelSim 的提示符下出現如下信息:

        # ** Fatal: (vsim-3551) TEXTIO : Read past end of file" TestData.dat".
        # Time: 2601020ns Iteration: 0 Process:/tb/line__34File: D:/YuProj/ModelSim/NineBitAdder2/NineBitAdder2.vhd
        # FatalerroratD:/YuProj/ModelSim/NineBitAdder2/NineBitAdder2.vhd line 41

        表示在讀完TestData.dat 后,因讀空出現錯誤。其中沒有出現程序中所設定的warning ,表示加法器的仿真結果與軟件得到的預定結果相符合。我們可以改進程序,在其中加入ENDFILE()函數來判斷是否讀取到文件的結尾。仿真得到的波形如圖1 所示。

        若人為地更改Result.dat文件中第9行的-246為100,重新仿真, 則出現如下信息:
        # ** Warning: Two values are different
        # Time: 420 ns Iteration: 0 Instance: /tb
        # ** Fatal: (vsim-3551) TEXTIO : Read past end of file" TestData.dat".
        # Time: 2601020ns Iteration: 0 Process:/tb/line__34File: D:/YuProj/ModelSim/NineBitAdder2/NineBitAdder2.vhd
        # FatalerroratD:/YuProj/ModelSim/NineBitAdder2/NineBitAdder2.vhd line 41
        #

        雙擊對應的警告信息,可以看到仿真結果與Result.dat 中預定結果不一致的地方。仿真圖形如圖2所示。

        結語
         
        TEXTIO 使得VHDL 的仿真功能有了大的飛躍, 在使用VHDL 描述處理器等模型及判斷系統對不規則輸入的響應時, 起到了非常大的作用。本文通過簡單的實例,說明了TEXTIO 庫及其簡單的應用流程。在當前嵌入式系統廣泛應用的背景下, 將更為需要TEXTIO 的應用。

      免費預約試聽課

      亚洲另类欧美综合久久图片区_亚洲中文字幕日产无码2020_欧美日本一区二区三区桃色视频_亚洲AⅤ天堂一区二区三区

      
      

      1. 中文热免费在线视频 | 精品熟女少妇a∨免费久久1 | 热久久美女精品天天吊色 | 亚洲欧美国产日韩综合久久 | 亚洲Aⅴ午夜福利精品一区 一本精品99久久精品77 | 日韩区欧美国产区在线观看 |