天天看點

Quartus和Modelsim仿真ROM子產品

建立一個工程

Quartus和Modelsim仿真ROM子產品

選擇工程儲存路徑,為工程取一個名字

Quartus和Modelsim仿真ROM子產品

Page 2 of 5 直接點選next

Quartus和Modelsim仿真ROM子產品

Page 4 of 5 直接點選next

下面為工程添加檔案

Quartus和Modelsim仿真ROM子產品

需要注意子產品名和子產品所在檔案的檔案名要一緻,下面的代碼儲存在Wave.v這個檔案中

module Wave(

    input i_clk,

    input i_rst_n,

    output reg[7:0] led

);

    parameter Delay500MS = 10;

    reg clk_led;

    reg[24:0] cnt;

    always@(posedge i_clk)

    if(!i_rst_n)begin

        cnt<=0;

        clk_led<=0;

    end

    else if(cnt==Delay500MS)begin

        cnt<=0;

        clk_led<=~clk_led;

    end

    else begin

        cnt<=cnt+1;

    end

    always@(posedge clk_led or negedge i_rst_n)

    if(!i_rst_n)begin

        led<=8'b1111_1110;

    end

    else begin

        led<={led[6:0],led[7]};

    end

endmodule

管腳設定

Quartus和Modelsim仿真ROM子產品
Quartus和Modelsim仿真ROM子產品
Quartus和Modelsim仿真ROM子產品

編譯

Quartus和Modelsim仿真ROM子產品

然後配置設定管腳

Quartus和Modelsim仿真ROM子產品

打開之後如下圖

Quartus和Modelsim仿真ROM子產品

在Location列中輸入各個引腳的位置即可。

如果上面一步打開的視窗是下面的樣子

Quartus和Modelsim仿真ROM子產品

也就是沒有All pins 子視窗,(看上面正常情況的截圖左下角豎着寫有這個視窗的名稱)。

解決辦法是在Pin Planner視窗中View>All Pins List

Quartus和Modelsim仿真ROM子產品

點選後All pins子視窗出來了,但是還不是我們想要的,這個視窗中隻有name列,沒有location這一列,解決辦法是在該子視窗的空白處右鍵選擇Customize Columms

Quartus和Modelsim仿真ROM子產品

點選下面的箭頭添加所有列,然後再點選ok

Quartus和Modelsim仿真ROM子產品

現在就有location這一列了。

管腳配置設定之後還需要編譯一次。編譯完成就可以下載下傳了。

下載下傳步驟如下圖:下面示範的是jtag模式

Quartus和Modelsim仿真ROM子產品

下面對上面這個工程做一個簡單的仿真。

工程中需要輸入的信号就是時鐘clk和複位信号rst_n,是以仿真之前我們需要輸入這兩個信号。

Quartus和Modelsim仿真ROM子產品

建立的波形檔案是空白的,我們需要将相關信号添加進去,左鍵輕按兩下name下面的空白處然後按照下面的步驟添加信号

Quartus和Modelsim仿真ROM子產品

然後來設定clk信号,先選中這個信号,再點選左側的overwrite clock圖示,出來的視窗中設定如下,ok

Quartus和Modelsim仿真ROM子產品
Quartus和Modelsim仿真ROM子產品

編輯好的波形如下圖

Quartus和Modelsim仿真ROM子產品

Ctrl+S儲存,檔案名為Wave.vwf

Assignments>Settings打開設定視窗,左側下方選擇Simulator Settings,設定紅框圈出來的部分,如果Simulation input裡是空白,點選右側的選擇按鈕選中剛才儲存的波形檔案

Quartus和Modelsim仿真ROM子產品

然後生成仿真網表

Quartus和Modelsim仿真ROM子產品

然後點選上圖最下面的Start Simulation,仿真過程可能比較耗時,右下角會提示目前進度。完成後如下圖

Quartus和Modelsim仿真ROM子產品

如果led波形顯示的不是二進制可以輕按兩下最左邊的圖示打開屬性對話框,選擇二進制如上圖,或者信号上右鍵選擇最下面的Properites進入上面的對話框進行設定

下面在這個工程中添加一個ROM子產品,我們要實作的效果是讓FPGA輸出正弦波的采樣資料,首先需要通過C語言算出正弦波1個周期中128等分點的值,當然這個值也可以用Verilog通過CORDIC算法算出來。下面是用來算正弦值的代碼,代碼的思路很簡單,就是計算sin(x),x的變化範圍是0~2π,因為sin(x)是在-1~1之間變化,是以加1将波形移到X軸上面,此時delta (sin(x))的最大值是2,最小值是0,要将0~2映射到0~255就需要除以2再乘255。這個過程用代碼标示就是下面的樣子

#include<stdio.h>

#include<math.h>

#define pi 3.141592653

int main()

{

    float y;

    unsigned char i,dat;

    printf("這是正弦波采樣值,128點\n");

    for(i=0;i<128;i++)

    {

        y=(sin(2*pi*i/127)+1)/2;

        dat=y*255;

        if(i%8==0)printf("\n");

        if(dat<16)printf("0%x ",dat);

        else printf("%x ",dat);

    }

    printf("\n");

    while(1);

    return 0;

}

在VC6.0中運作後結果如下:

Quartus和Modelsim仿真ROM子產品

左上角的圖示上右擊>編輯>标記可以選中生成的資料,回車複制到粘貼闆中了,資料如下

7f 85 8c 92 98 9e a4 aa

b0 b6 bc c1 c6 cb d0 d5

da de e2 e6 ea ed f0 f3

f5 f7 f9 fb fc fd fe fe

fe fe fe fd fc fa f8 f6

f4 f1 ee eb e8 e4 e0 dc

d7 d3 ce c9 c4 be b9 b3

ad a7 a1 9b 95 8f 88 82

7c 76 6f 69 63 5d 57 51

4b 45 40 3a 35 30 2b 27

22 1e 1a 16 13 10 0d 0a

08 06 04 02 01 00 00 00

00 00 01 02 03 05 07 09

0b 0e 11 14 18 1c 20 24

29 2e 33 38 3d 42 48 4e

54 5a 60 66 6c 72 79 7f

注意我們上面這些數字一共有128個,每個都是8bit的,資料的形式是十六進制

接着上面的quartus工程,建立一個ROM子產品,步驟如下:

首先建立一個用于初始化ROM的mif(memory initial file)

Quartus和Modelsim仿真ROM子產品
Quartus和Modelsim仿真ROM子產品

建立的mif檔案為下面的樣子

Quartus和Modelsim仿真ROM子產品

可以看到這個檔案中每個單元都是0,也就是預設的狀态,滑鼠放在位址所在的列右鍵,彈出的選項中可以設定位址和内容的顯示形式,比如上圖中位址是十進制顯示的,内容是十六進制顯示的,這裡内容的格式和我們之前準備的采樣資料的格式必須一緻,我們這裡都是十六進制。

複制上面的采樣資料,在位址0處粘貼,結果如下:

Quartus和Modelsim仿真ROM子產品

然後ctrl+s,我這裡是在工程目錄下建立了一個src目錄儲存源代碼相關檔案,儲存檔案名為sin,預設格式是mif,結果如上圖紅框所示。

為了使這個資料在modelsim中也能使用,我們需要儲存為hex格式(其實以後可以隻儲存為hex格式,而不必儲存為mif格式),步驟是File>Save As,儲存類型選擇hex即可

Quartus和Modelsim仿真ROM子產品

然後我們需要建立一個ROM子產品,步驟如下:

Quartus和Modelsim仿真ROM子產品
Quartus和Modelsim仿真ROM子產品
Quartus和Modelsim仿真ROM子產品

因為有128個數,是以ROM的深度為128,每個數的寬度為8bits

Quartus和Modelsim仿真ROM子產品
Quartus和Modelsim仿真ROM子產品

在page 5 of 7中點選browse選擇剛才儲存的sin.hex檔案

Quartus和Modelsim仿真ROM子產品

然後page 6和pege7分别點選next和finish,詢問是否加入工程,點選yes

此時工程目錄結構如下

Quartus和Modelsim仿真ROM子產品

我們不妨打開sin.v這個檔案看看quartus都寫了什麼,代碼36~50行如下,定義了這個子產品的輸入輸出端口,我們看到子產品名為sin,有一個7bit的輸入address端口,有一個clock輸入端口,還有一個8bits的輸出端口q

Quartus和Modelsim仿真ROM子產品

再往下看,在79行開始有一點需要我們注意的

Quartus和Modelsim仿真ROM子產品

79和80行指定了這個ROM子產品初始化所需的兩個檔案,一個是sin.rif,一個是sin.hex檔案,我們剛才建立的hex檔案确實就是保持在工程目錄的src目錄下,是以代碼中就是這個樣子,當我們之後需要将檔案拿到modelsim中仿真的時候就需要目錄和代碼中的這種對應關系。

下面在Wave.v檔案中對sin.v這個子產品執行個體化,完成之後的代碼如下

module Wave(

    input i_clk,

    input i_rst_n,

    output reg[7:0] led,

    output[7:0] q

);

parameter Delay500MS = 10;

    reg [6:0] addr;

    reg clk_led;

    reg[24:0] cnt;

    always@(posedge i_clk)

    if(!i_rst_n)begin

        cnt<=0;

        clk_led<=0;

    end

    else if(cnt==Delay500MS)begin

        cnt<=0;

        clk_led<=~clk_led;

    end

    else begin

        cnt<=cnt+1;

    end

    always@(posedge clk_led or negedge i_rst_n)

    if(!i_rst_n)begin

        led<=8'b1111_1110;

    end

    else begin

        led<={led[6:0],led[7]};

    end

    always@(posedge i_clk)

    if(!i_rst_n)begin

        addr<=0;

    end

    else begin

        addr<=addr+1;

    end

    sin U_ROM(

        addr,

        i_clk,

        q

    );

endmodule

儲存代碼,然後編譯一下。此時就可以進行仿真了,但是為了看到ROM輸出的波形我們還需要做一點工作,輕按兩下Wave.vwf檔案,此時Name這一列隻有我們之前添加的i_clk,i_rst_n以及led這3個信号,我們還需要将新增加的信号addr和q添加進來。添加的辦法和之前介紹的一樣。

信号添加好之後需要執行Processing>Generate Functional Simulation Netlist,然後Processing>Start Simulation

結果如下,下面的圖中已經标注出了位址1~8對應的數值為紅色框框出來的部分,可以對照之前初始化所用的資料進行對比,如果之前的步驟沒有錯誤,這裡應該是按之前初始化的順序輸出的。

Quartus和Modelsim仿真ROM子產品

至于時序為什麼是這個樣子的,可以在工程目錄下找sin_waveforms.html這樣一個檔案,該檔案解釋了這個ROM的時序是如下圖所示的樣子。

Quartus和Modelsim仿真ROM子產品

仔細對照可以看到位址變化後,間隔一個時鐘輸出該位址對應的内容。

現在quartus中的工作就完成了,但這并不過瘾,我們這裡的ROM輸入的是正弦波的采樣值,那麼我們希望輸出的波形當然是正弦波的樣子了,但上面的波形顯然不是。很遺憾quartus中無法以模拟量的形式顯示資料(可能也可以隻是我沒找到設定方法,或者後續的版本可以,至少目前我用的版本中沒找到),但是Modelsim中可以以模式量的形式顯示資料。是以下面我們在modelsim中再完成一個簡單的仿真。

首先複制本文附件中的convert_hex2ver.dll檔案到modelsim安裝目錄下,比如就可以放在modelsim_ae這個目錄中。然後在modelsim安裝目錄下找modelsim.ini檔案,屬性中去掉隻讀屬性,打開,搜尋List of dynamically loaded objects for Verilog PLI applications,搜尋結果應該是下面的樣子,在這一行後面添加一行Veriuser = xxx,xxx是剛才convert_hex2ver.dll檔案的完整路徑

Quartus和Modelsim仿真ROM子產品

修改之後我的檔案變成下面的樣子,需要注意這個路徑中不能包括空格,是以類似Program Files這樣的路徑是不可以的,如果路徑包含空格,在modelsim中仿真時會報錯,提示找不到convert_hex2ver.dll這個檔案

Quartus和Modelsim仿真ROM子產品

然後儲存,關閉。

打開modelsim,建立一個工程RomSim,添加一個RomSim.v檔案,該檔案中執行個體化一個sin.v子產品,并生成clk和addr信号。代碼如下:

`timescale 1ns/1ns

module RomSim;

reg [6:0] address;

reg clock;

wire [7:0] q;

sin U_ROM(

address,

clock,

q);

always #10 clock=~clock;

always #10 address=address+1;

initial begin

clock<=0;

address<=0;

end

endmodule

然後到quartus/eda/sim_lib/目錄下複制220model.v和altera_mf.v這兩個檔案到剛才建立的modelsim工程目錄下粘貼,然後再到上一個quartus工程中複制sin.v和sin.hex檔案到modelsim工程目錄下,此時需要注意,之前quartus工程中sin.v和sin.hex是放在src目錄下的,是以複制到modelsim工程下也要建立src目錄,然後将這兩個檔案複制到src目錄中。然後在modelsim中添加剛才複制的這3個.v檔案,此時modelsim的project視窗應該是下面的樣子

Quartus和Modelsim仿真ROM子產品

執行編譯。

Simulate>Start Simulate啟動仿真,在work庫下往下拉(會有很多檔案)找到RomSim這個檔案點選ok

從object視窗中選擇ddress,clock,q信号添加到wave視窗,仿真時長設定為10us,點選run圖示,結果是下面的樣子

Quartus和Modelsim仿真ROM子產品

設定q的格式為無符号類型

Quartus和Modelsim仿真ROM子產品

通過下面的步驟設定q以模拟量的形式顯示

Quartus和Modelsim仿真ROM子產品
Quartus和Modelsim仿真ROM子產品

其中Height是波形的高度,Max和Min分别對應ROM中的最大值和最小值

設定之後波形變成下面的樣子

Quartus和Modelsim仿真ROM子產品

終于大功告成!

保持上面的狀态不要動,在workspace視窗下面點選左右箭頭,能看到一個Memories頁籤

Quartus和Modelsim仿真ROM子產品

點選這個頁籤,可以看到有兩個執行個體,選中Range為[0:127]Depth為128width為8那一個執行個體,右鍵選擇View Content,出來一個memory視窗,這個視窗顯示了我們之前設計的ROM中的内容,但是數值是二進制的,我們需要切換為十六進制,在視窗區域内右鍵,選擇屬性

Quartus和Modelsim仿真ROM子產品
Quartus和Modelsim仿真ROM子產品

然後就變成了我們熟悉的十六進制形式

Quartus和Modelsim仿真ROM子產品

當然這裡還可以選中一個數值并修改它。

---------------------------------------------Quartus 11.0中的仿真問題-------------------------------------------------------

Quartus 11.0已經不支援波形仿真功能,此時隻能配合Modelsim進行仿真。在Quartus中啟動Modelsim仿真需要在Quartus中設定兩個地方。

1.Tools>options中設定Modelsim的安裝路徑,如下圖

Quartus和Modelsim仿真ROM子產品

2.設定仿真相關工具和檔案,這裡特别注意下拉框選擇的Tool name和上一步設定的EDA Tool要對應,Modelsim和Modelsim-Altera是不同的,都需要選擇電腦上實際安裝的版本,這個在Modelsim啟動畫面中一般會顯示,或者Modelsim的安裝檔案名上會标注是否是Altera版本

其中設定仿真激勵檔案的步驟是選中下圖的Compile test bench,點選右邊的Test Beanch,打開的對話框中點選new打開另一個對話框,這個對話框可以選擇檔案。

Quartus和Modelsim仿真ROM子產品

做了上面的設定之後就可以在Quartus中通過下面的指令啟動仿真。

Quartus和Modelsim仿真ROM子產品

本文所用代碼和檔案下載下傳位址:http://download.csdn.net/detail/whereyougo/9359311

轉載于:https://www.cnblogs.com/nf466568905/p/5049775.html