一:任務:
要求使用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抓包截圖