FPGA入門實例一:LFSR

一:任務:

要求使用Verilog語言在Xilinx Virtex-6開發板上實現線性反饋移位寄存器(LFSR)的硬件邏輯設計。

二:前期準備:

基本上完成一個簡單的設計需要用到以下幾個軟件

邏輯:Uedit32(硬件狗吐血推薦)

綜合:ISE14.1

仿真:Modelsim SE 10.1b

分析:Chipscope Pro

三:設計流程

邏輯:

首先當然是RTL級設計,俗稱硬件邏輯設計。使用的是Uedit32,這個軟件相當於一個記事本,但編輯功能十分強大,簡直是寫Verilog代碼的神器,具體下載安裝,使用技巧詳見(http://blog.163.com/bubble_fish/blog/static/23724712920146180178713/)。 見識了Uedit32的方便快捷後,在寫代碼之前,小編給大家說幾個注意事項。工作過的朋友肯定知道,公司裏是很強調代碼書寫規範的,特別是對於大的設計。如果不按規範做,一個月後調試發現錯誤,回頭再看自己寫的代碼,估計很多信號都忘了,更不要說檢錯了;如果一個項目做了一半離職了,接班的人估計得從頭開始設計;如果在原版本基礎上增加新功能,很可能也要從頭來過,很難做到設計的可重用性。這裏有一份組長在我第一天實習時就給我的Verilog書寫規範,分享給大家,真心希望跟我一樣的小白在寫代碼之前仔細閱讀(http://blog.163.com/bubble_fish/blog/static/237247129201461692652979/)。瞭解書寫規範後,我們對任務進行分析。線性反饋移位寄存器(LFSR)的工作原理及應用詳見博文(http://blog.sina.com.cn/s/blog_62d9edac01015lsd.html)。以下是Verilog源碼:

 1 module    LFSR    
 2 (    
 3 input                         usr_clk, //時鐘
 4 input                         rst,  //復位
 5 output reg [2:0]              dout  //data_out
 6 );
 7 
 8 parameter    INIT = 3'h1; //初始值
 9 parameter    COFF = 3'h4; //生成多項式
10 
11 reg [2:0]  dout_next;   
12 always @ (posedge usr_clk or posedge rst) 
13     if(rst)       dout <=  INIT;  
14     else          dout <=  dout_next;
15 
16 integer i;
17 always@(*)
18 begin
19 dout_next[0] <= dout[2];
20 for(i=1; i<3; i=i+1)
21     if(COFF[3-i])        dout_next[i] <= dout[i-1]^dout[2];
22     else                 dout_next[i] <= dout[i-1];
23 end
24     
25 endmodule     

綜合:

對於xilinx的開發板,使用ISE做爲綜合工具。軟件的使用方法不作介紹,網上一搜一大把。這裏只給大家留一個附件,包含全部工程文件和.ucf用戶約束(http://download.csdn.net/download/yuzeren48/7644573)。

 圖1:綜合界面

根據LFSR工作原理加上自己定義的參數COFF(3’b100),可知整個LFSR是由一個異或門和三個觸發器構成,我們點開Synthesize-XST下的View RTL Schematic,即可看到由代碼生成的門級電路,與預期一致。

圖2:RTL Schematic

仿真:

ISE是自帶仿真軟件Isim的,但實際使用效果不是很好。所以我們採用更專業的modelsim來做仿真。Modelsim的具體安裝、配置說明詳見(請自行百度,如有問題請留言小編)。配置好modelsim後,我們需要寫一個testbench來對我們剛纔的設計做驗證,testbench的作用其實就是給原設計添加各種輸入激勵信號,然後觀察輸出信號的波形。具體怎麼寫testbench請自行百度《編寫高效率的testbench》。這裏給出本設計的testbench源碼

 1 `timescale 1 ns / 1 ns
 2 
 3 module lfsr_tb;
 4 
 5 reg                     rst;
 6 reg                     usr_clk;
 7 wire [2 : 0]            dout    ;
 8 
 9 LFSR  UUT (
10         .rst        (rst),
11         .usr_clk    (usr_clk),
12         .dout       (dout)
13         );
14 
15 always #20     usr_clk = ~usr_clk;
16 
17 initial begin
18         $display("lfsr_tb start...");
19         rst = 1;
20         usr_clk = 0;
21         #100;
22         rst = 0;
23         #10000;
24         $stop;
25         end
26 
27 endmodule

 下面小編給大家簡單寫一下modelsim的仿真步驟。

1、  新建一個Sim文件夾,將需要用到的源文件文件,testbench文件(.h .v)放進去

2、  打開modelsim,File-New-Project

3、  把目錄指定爲剛纔建好的文件夾,添加.v文件到Project中

4、  對Project中的.v文件右鍵,選擇Compile-Compile All

5、  選擇Library標籤,找到work,點擊+展開

6、  對已經編譯好的.v文件右鍵,選擇simulate without optimization

7、  此時會彈出Sim標籤欄,對要仿真的文件右鍵,選擇Add wave

8、  設定仿真時間,例如1000ns

9、  點擊工具欄按鈕Run

圖3展示LFSR仿真結果

圖3: LFSR仿真波形

分析:

分析用到的軟件主要是Chipscope pro,Chipscope的使用方法詳見(百度文庫搜索“ChipScope Pro實例教程”)。它跟modelsim的主要區別在於這是真正的板級調試。我們需要根據不同的開發板編寫用戶約束文件(.ucf),經過ISE綜合,佈局佈線後生成bit文件寫入FPGA。ChipScope Pro 的主要功能是通過JTAG 口、在線實時地讀出FPGA 的內部信號。這裏就有一個問題產生:爲什麼要用ChipScope來觀察信號?我們把輸入信號直接連上LED,觀察LED的亮滅不就知道信號是怎麼跳變的嗎?小編就用我們剛編寫的實例來簡單解釋一下這個問題:我們開發板使用的時鐘信號是33MHz,dout在每個時鐘上升沿都會發生一次跳變,一秒鐘會發生33000000次跳變,這種高速跳變肉眼無法分辨,所以根本無法通過LED的亮滅來觀測dout變化。圖4左上角即爲LED顯示的dout變化。

圖4 板級調試

針對本次設計任務,儘可能多的說明chipscope的用途。決定同時使用ICON核、ILA核、VIO核來分析輸入輸出信號。具體的操作步驟詳見博文(http://blog.163.com/bubble_fish/blog/static/237247129201461682452592/)。圖5爲檢測到的數據波形。

圖5 chipscope抓包截圖

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章