一:任務:html
要求使用Verilog語言在Xilinx Virtex-6開發板上實現線性反饋移位寄存器(LFSR)的硬件邏輯設計。工具
二:前期準備:佈局
基本上完成一個簡單的設計須要用到如下幾個軟件spa
邏輯:Uedit32(硬件狗吐血推薦).net
綜合:ISE14.1設計
仿真:Modelsim SE 10.1b調試
分析:Chipscope Procode
三:設計流程htm
邏輯:blog
首先固然是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的仿真步驟。
一、 新建一個Sim文件夾,將須要用到的源文件文件,testbench文件(.h .v)放進去
二、 打開modelsim,File-New-Project
三、 把目錄指定爲剛纔建好的文件夾,添加.v文件到Project中
四、 對Project中的.v文件右鍵,選擇Compile-Compile All
五、 選擇Library標籤,找到work,點擊+展開
六、 對已經編譯好的.v文件右鍵,選擇simulate without optimization
七、 此時會彈出Sim標籤欄,對要仿真的文件右鍵,選擇Add wave
八、 設定仿真時間,例如1000ns
九、 點擊工具欄按鈕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抓包截圖