1 ISE 軟件的運行及ModelSim 的配置 2 創(chuàng)建一個新工程 3 創(chuàng)建一個VHDL源文件框架 4 利用計數器模板向導生成設計 *5 仿真 6 創(chuàng)建Testbench波形源文件 7 設置輸入仿真波形 *8 調用ModelSim 進行仿真簡介 9 調用ModelSim 進行行為仿真(Simulate Behavioral Model) 10 轉換后仿真(Simulate Pose-Translate VHDL Model) 11 調用ModelSim 進行映射后仿真(Simulate Post-Map VHDL Model) 12 布局布線后的仿真( Simulate Post-Place&Route VHDL Model) 1. ISE 軟件的運行及ModelSim 的配置 單擊“開始->程序->Xilinx ISE6->Project Navigator”,進入ISE 軟件。 為了能夠使用ModelSim 進行仿真,選擇菜單Edit->Preferences…,選擇選項卡Partner Tools,出現(xiàn)界面如圖1 所示。單擊按鈕 找出ModelSim.exe 文件,單擊“確定”。需要注意的是這方面的設置與以前ISE 版本不同,在ISE4.2 中設置是這樣的。但在ISE5.1 以及ISE5.2 中是指定ModelSim.exe 文件所在的目錄,而ISE6.1 的設置與ISE4.2 的設置相同。單擊“確定”關閉該窗口,關閉ISE(這一步非常重要,否則可能不能在ISE 中調用ModelSim 進行仿真),再重新進入ISE 既可用調用ModelSim 對設計進行仿真了。 圖1 第三方工具設置窗口 2 創(chuàng)建一個新工程 Step1. 單擊“開始->程序->Xilinx ISE6->Project Navigator”,進入ISE 軟件。 Step2. 選擇File->New Project…,出現(xiàn)如圖2 所示的窗口。這個窗口與以前版本的差別較大,以前的版本出現(xiàn)的窗口中可以直接選取器件類型、封裝、門數、速度等級等信息。而在ISE6.1 中需要單擊“下一步”才能看到這些設置信息。在本例中,我們先選擇工程存放的路徑,然后輸入工程名稱。系統(tǒng)自動為每一個工程設定一個目錄,目錄名為工程名。再選擇頂層模塊類型為HDL。 圖2 新工程項對話框 (其他幾種類型說明如下:Schematic為原理圖輸入類型,類似于我們制作PCB 原理圖時的情況,可以從庫中選取器件,也可以用HDL 語言來生成器件,在后續(xù)章節(jié)會介紹原理圖為設計輸入的情況;EDIF為網表輸入類型,EDIF 是Electronic Data Interchange Format 的縮寫,是一種描述設計網表的標準的工業(yè)文件格式,可以由第三方工具生成,在ISE 中可以將其作為一種標準的輸入格式。NGC 文件是一種包含了邏輯設計數據和約束的網表,所謂約束是指FPGA 設計中的一些特定的要求,例如,我們分配設計中的信號到具體的管腳時,需要一個文件來指定如何分配,這就是一種約束文件,由于NGC 網表包含了設計和約束,因此一個文件足夠描述一個設計了。NGC/NGO 和EDIF 都可以在ISE 外由其他綜合工具生成也可由ISE 生成。如果我們需要用ISE 作為設計輸入,需要選擇Schematic 或HDL 作為頂層模塊類型;如果已經完成的設計文件為ABEL、Verilog或VHDL,應選擇HDL 為頂層模塊類型;如果已經完成的設計文件為原理圖,這里應該選擇Schematic 作為頂層模塊類型。) Step3. 單擊“下一步”,出現(xiàn)如圖3 所示的窗口,在該窗口中來選擇設計實現(xiàn)時所用的器件。在包含F(xiàn)PGA 的PCB 板子做出來以前,我們選擇不同類型的FPGA 進行測試,看看FPGA 的資源是否夠用,在PCB 板子做出來以后,我們在這里的選擇與PCB板上的FPGA 必須一致。否則生成的下載文件無法配置到FPGA 中。此處若選擇錯了,也沒有關系,因為后面可以隨時修改這些設置。其中DeviceFamily 表示目標器件的類型;Device 表示目標器件的具體型號;Package 表示器件的封裝;SpeedGrade 表示器件的速度等級。這里我們選擇器件為Spartan2E,xc2s100,tq144,-6。其中xc2s100中的100 表示器件為10 萬門,tq144 表示器件有144 個管腳。 圖3 設置工程所用的器件參數 Step4. 因為這里我們重新編寫VHDL 源代碼,而不是使用以前設計好的源代碼,故再單擊“下一步”,“下一步”,單擊“完成”,工程創(chuàng)建完畢。 Step5. 這時的界面如圖4 所示,這里需要關注的是界面左上角出現(xiàn)的小框為我們所有的源文件的管理窗口,在其下面的窗口為我們選擇不同的源文件時其所有可能操作的顯示窗口;右半部分窗口為我們設計輸入代碼的窗口;下面的窗口為編譯等信息的顯示窗口。這里與以前版本不同的地方在于編譯輸入窗口這里將Warnings 和Errors 可以分開顯示。我們可以在輸入不同文件后選中不同的文件,看看進程窗口中的變化。這樣,我們新建了一個工程,下一步就要在工程中輸入一些設計文件來實現(xiàn)我們的設計。 圖4 創(chuàng)建新工程后的ISE 界面 3 創(chuàng)建一個VHDL源文件框架 在本小節(jié)我們向剛剛創(chuàng)建的工程中添加設計文件來實現(xiàn)要求的功能。按照以下步驟建立一個計數器的VHDL 文件描述。注意這里僅僅新建一個有框架的文件,下一小節(jié)將向該文件中添加具體代碼。 在這里我們以一個具有復位(reset)、使能(ce)、置數(load)、計數方向控制(dir)功能的計數器為基礎進行設計。其方塊圖如圖5 所示。其中CLK 為輸入計數時鐘信號,系統(tǒng)在該信號的驅動下開始工作;RESET 為復位信號,在上升沿處,輸入復位為全零;CE 為使能信號,為1 時計數正常進行,為0 時停止計數;LOAD 為置數信號,當在時鐘上升沿該信號為1 時,將DIN0~DIN3 分別置給COUT0~COUT3。DIR 為計數方向控制,為1 時遞增計數,為0 時遞減計數。這些功能描述只是我們的設計目標,或稱為設計需求,我們在設計一個系統(tǒng)時,第一步就是要明確我們的設計要求。 圖5 計數器方塊圖 Step1. 選擇Project->New Source;(或在Sources in Project 窗口中單擊鼠標右鍵選擇“New Source…”)出現(xiàn)如圖6 所示的窗口; 圖6 源程序的類型選擇 Step2. 選擇VHDL Module(VHDL 模塊)作為新建源文件的類型; Step3. 在文件名中鍵入“FourBitsCounter”; Step4. 單擊“下一步”; Step5. 單擊“下一步”; Step6. 單擊“完成”,完成這個新源程序的創(chuàng)建。新源程序文件FourBitsCounter.vhd 將會顯示在HDL 編輯窗口中,它包括Library,Use,Entity,Architecture 等語句。 4 利用計數器模板向導生成設計 設計文件建立之后,我們就可以向其中填寫代碼了。我們可以直接書寫HDL 代碼,也可以利用ISE 的語言模板(ISE Language Template)工具來輔助我們書寫HDL 代碼。在這里我們使用語言模板,選擇其中的計數器描述來完成本源程序的設計。 Step1. 選擇Edit->Language Templates 打開語言模板,或者通過單擊按鈕 來打開語言模板,如圖7 所示; 圖7 計數器語言模板 Step2. 在Language Templates 中通過單擊“+”來展開VHDL 下的綜合模板(Synthesis Templates); Step3. 從VHDL 綜合模板中選擇計數器模板(Counter Template),并把它粘貼到源程序counter.vhd 的begin 和end 之間。(或在Counter Template 上單擊右鍵選擇“Use incounter.vhd”,建議直接復制過去); Step4. 關閉Language Templates 窗口; Step5. 將帶有注釋符號“--”的計數器端口定義語句剪切并粘貼到計數器的實體(entity)描述中。這些語句如下所列: -- CLK: in STD_LOGIC; -- RESET: in STD_LOGIC; -- CE, LOAD, DIR: in STD_LOGIC; -- DIN: in STD_LOGIC_VECTOR(3 downto 0); -- COUNT: inout STD_LOGIC_VECTOR(3 downto 0); Step6. 去掉上述語句中的注釋符號; Step7. 去掉上述最后一個端口定義語句后的分號;此時的程序如圖8 所示。 Step8. 選擇File->Save,保存counter.vhd 源程序。 圖8 修改后的計數器描述文件 5 仿真 我們可以通過設置計數器模塊的輸 入來觀察仿真輸出,以測試我們編寫的VHDL 源文件是否滿足邏輯功能要求。我們建立的testbench 波形將被用于與仿真軟件ModelSim 的連接,用來驗證所設計的計數器的功能和延時是否達到要求。 6 創(chuàng)建Testbench波形源文件 在仿真前,首先創(chuàng)建一個Testbench 波形源文件,與以前版本不同的是,該文件不是在HDL Bencher(ISE 集成的一個工具,用于設置輸入波形)中打開,而是在ISE 中打開,這也是ISE6.1 不同于以前版本的地方。具體步驟如下: Step1. 打開上一節(jié)所建立的工程; Step2. 選擇Project->New Source…,(或通過在Sources in Project 中單擊右鍵選擇“NewSource…”),出現(xiàn)如圖9 所示的窗口; 圖9 創(chuàng)建波形源文件 Step3. 選擇文件類型為Test Bench Waveform; Step4. 鍵入文件名“TestWave”,如圖9 中所示; Step5. 單擊“下一步”,在本步驟中可以將波形文件與VHDL 文件進行關聯(lián)。 Step6. 單擊“下一步”; Step7. 單擊“完成”; Step8. 此時,HDL Bencher 程序自動啟動,如圖10 所示,我們可以選擇哪一個信號是時鐘信號并可以輸入所需的時序需求;在這里我們采用系統(tǒng)的默認值,單擊“OK”按鈕; 圖10 仿真時間參數的設置 Step9. 這時出現(xiàn)了如圖11 所示的波形; 圖11 新建的波形文件 7 設置輸入仿真波形 我們可以打開剛剛建立的波形文件,來初始化輸入波形,步驟如下: Step1. 單擊波形圖中的藍色方塊來設置波形電平的高低,并將仿真時間線(圖中的垂直的藍色線)拉到第10 個時鐘周期處,設置后的波形如圖12 所示; 圖12 HDL Bencher 中輸入波形的設置 Step2. 單擊圖12 中工具欄上的圖標 ,將波形文件保存。 Step3. 查看代碼覆蓋率統(tǒng)計,單擊圖12 中工具欄上的圖標 ,顯示出代碼覆蓋率統(tǒng)計,統(tǒng)計結果如圖13 所示。因為還沒有輸出,所有輸出的統(tǒng)計均為零。代碼覆蓋率是一種測試術語,它可以表示運行完當前仿真時,所運行的代碼占所有代碼的比例。其中的 Assign 為賦值情況代碼占所有代碼的比例,Toggle 為上升下降沿代碼占所有代碼的比例。因此,代碼覆蓋率越高越好。 圖13 代碼覆蓋率統(tǒng)計結果 8 調用ModelSim 進行仿真簡介 其實在上一節(jié)中產生預定輸出時,已經使用了ModelSim,只是我們在界面上看不出來而已。這一小節(jié)我們在ISE 中調用ModelSim 進行仿真,這里討論的仿真仍然是基于波形文件的,因此不涉及ModelSim 中過多的知識。在ModelSim 中可以進行的仿真有Simulate Behavioral Model(仿真行為模型)、Simulate Pose-Translate VHDL Model(轉換后仿真)、Simulate Post-Map VHDL Model(映射后仿真)以及Simulate Post-Place&RouteVHDL Model(布局布線后仿真)。其實, 轉換( Translate )、映射(Map)以及布局布線(Place&Route)是FPGA 及CPLD 設計實現(xiàn)時的不同階段。 要實現(xiàn)一個設計,首先要進行編譯或轉換(Translate),轉換是將HDL 描述轉換為RTL 描述,轉換后仿真可以認為是RTL 級仿真,而且僅僅是邏輯仿真,在仿真中不包含任何的器件、時延等信息,僅僅用于驗證設計轉換為RTL 級描述后是否滿足功能要求;下面就是綜合,在該階段,設計文件按照約束文件與Xilinx 的原型庫聯(lián)系起來,映射(Map)則是將當前設計映射到具體器件的特定邏輯單元以及特定的工藝,所謂特定的邏輯單元是FPGA 中的基本的邏輯塊,所謂工藝是FPGA 的制作工藝,因此,映射后仿真是將設計實現(xiàn)到具體器件具體邏輯單元具體工藝后進行的邏輯仿真,類似于我們制作PCB 時畫完原理圖后進行的仿真,此時的仿真已經考慮到了器件延時,由于沒有布線,因此,連線的長度等信息就不能知道了,故此時的仿真是僅僅考慮到邏輯單元延時的仿真,而沒有考慮到連線的電容、電阻、長度等信息。在亞微米(0.35 微米)以上的工藝中,連線的延時可以不太重視,而在深亞微米工藝中,連線的影響就不可小看了,為了保證深亞微米設計的成功,需要在布局布線前對設計進行時序仿真,這時候修改錯誤對設計進度的影響要小很多。最后是布局布線后仿真 ,為進行這個仿真,首先要進行布局布線,類似于我們對PCB 的布線,之后要進行參數提取,提取出互連線的長度、電阻、電容等信息,然后就可以根據這些信息進行仿真了,這時候的仿真中包括了器件本身的延時和互連線的延時等等部分,這種仿真也最近似實際情況。 也許讀者會疑惑,有了映射后仿真為什么還需要轉換后仿真呢?這是因為許多EDA 工具只能認識RTL 描述,而人們習慣使用高級的HDL描述,這就需要轉換,如果轉換后的RTL 描述是錯誤的,那么后續(xù)的過程還有什么意義呢,故還是需要進行轉換后仿真的,盡管一般轉換階段不會發(fā)生什么錯誤。 9 調用ModelSim 進行行為仿真(Simulate Behavioral Model) 如上所述,行為仿真驗證所設計的模塊的功能。未涉及到設計實現(xiàn)中的時延等問題。具體步驟如下: Step1. 在如圖14 所示的Sources in Project 窗口中,選中TestWave 文件; 圖14 Sources in Project 窗口 Step2. 在如圖7-15 所示的Processes for Source :”TestWave”窗口中,通過單擊“+”展開它; 圖15 Processes for Current Source 窗口 Step3. 雙擊Simulate Behavioral VHDL Model,ModelSim 會自動運行,仿真結果出現(xiàn)在ModelSim 的波形窗口(Wave Windows)中,如圖16 所示,從雙擊命令到所有窗口的出現(xiàn)都是在ISE 自動創(chuàng)建的仿真宏文件(.fdo)的控制下來完成了,用戶可以在工程存放的路徑下看到該文件counter_tbw.fdo;用記事本打開該文件可以看到其內容。 圖16 ModelSim 行為仿真結果 Step4. 打開波形窗口,單擊按鈕 ,可以將所有波形在屏幕中顯示,仿真結果如圖16所示。可以看到,時鐘上升沿和計數值改變的時刻之間相差為零(圖中兩根豎線之間的間距為零)。 Step5. 關閉ModelSim 主窗口,確認退出ModelSim。 10 轉換后仿真(Simulate Pose-Translate VHDL Model) 如上所述,轉換后仿真是將設計轉換為RTL 級描述后進行的仿真。在其中不包含實現(xiàn)器件的信息。具體仿真步驟與行為仿真相同。只是在第三步,雙擊Simulate Pose-Translate VHDLModel 就可以了。仿真波形圖如圖17所示。可以看到,時鐘上升沿和計數值改變的時刻之間相差為零(圖中兩根豎線之間的間距為零)。 圖17 ModelSim 轉換后仿真結果 11 調用ModelSim 進行映射后仿真(Simulate Post-Map VHDL Model) 映射后仿真是設計映射到具體工藝和器件后進行的仿真,在其中包含了器件本身的延時信息。具體仿真步驟與行為仿真相同。只是在第三步,雙擊Simulate Post-Map VHDL Model就可以了。仿真波形圖如圖18 所示。可以看到,時鐘上升沿和計數值改變的時刻之間相差6794ps(圖中兩根豎線之間的間距),說明了器件的延時為6794ps。 圖18 ModelSim 映射后仿真結果 12 布局布線后的仿真( Simulate Post-Place&Route VHDL Model) 布局布線后仿真利用了從布局布線中提取出的一些信息,其中包括了目標器件及互連線的時延、電阻、電容等信息。具體仿真步驟與行為仿真相同。只是在第三步,雙擊Simulate Post-Place&Route VHDL Model 就可以了。仿真波形圖如圖19 所示。可以看到,時鐘上升沿和計數值改變的時刻之間相差8296ps(圖中兩根豎線之間的間距),說明了器件的延時加上互連線延時為6794ps。 圖19 ModelSim 布局布線后仿真結果 |