例項七— 8位移位暫存器的設計

FPGA攻城獅發表於2019-02-19

例項七 8位移位暫存器的設計(基於Robei工具的8位移位暫存器的設計)

4.1.1. 本章導讀

設計目的
要求掌握8位移位暫存器原理,並根據原理設計8位移位暫存器模組以及設計相關testbench,最後在Robei視覺化模擬軟體進行功能實現和模擬驗證。
設計準備
有一個8位元的資料(初值設為10011100)和一個移位設定資料s,根據s的值不同,產生不同的移位。這裡規定移位的方向是向右,由於是8位元,因此s的變化範圍為0到7。

4.1.2. 設計流程

1. shift模型設計

(1)新建一個模型命名為shift,型別為module,同時具備5個輸入和1個輸出,每個引腳的屬性和名稱參照圖4-1-1進行對應的修改。
在這裡插入圖片描述
在這裡插入圖片描述
(2)新增程式碼。點選模型下方的 Code新增程式碼。
程式碼:
always@(posedge clk or negedge clr)
begin: shift_reg
if(clr)
data_out <= 8’b0;
else if(en)
begin
case(set[2:0])
3’b0: data_out <= data_in[7:0];
3’b1: data_out <= {data_in[0],data_in[7:1]};
3’d2: data_out <= {data_in[1:0],data_in[7:2]};
3’d3: data_out <= {data_in[2:0],data_in[7:3]};
3’d4: data_out <= {data_in[3:0],data_in[7:4]};
3’d5: data_out <= {data_in[4:0],data_in[7:5]};
3’d6: data_out <= {data_in[5:0],data_in[7:6]};
3’d7: data_out <= {data_in[6:0],data_in[7]};
default: data_out <= data_in[7:0];
endcase
end
end

(3)儲存模型到一個資料夾(資料夾路徑不能有空格和中文)中,執行並檢查有無錯誤輸出。

2. shift_test測試檔案設計

(1)新建一個具有5個輸入和1個 輸出的shift_test測試檔案,記得將Module Type設定為“testbench”,各個引腳配置如圖4-1-3所示。
在這裡插入圖片描述
(2)另存為測試檔案。將測試檔案儲存到上面建立的模型所在的資料夾下。
(3)加入模型。在 Toolbox工具箱的 Current欄裡會出現模型,單擊該模型並在shift _test上新增,並連線引腳,如下圖4-1-4所示:
在這裡插入圖片描述
(4)輸入激勵。點選測試模組下方的“Code”,輸入激勵演算法。激勵程式碼在結束的時候要用$finish 結束。
測試程式碼:
initial begin
clock=0;
clr=0;
en=1;
data=8’b10011100;
set=0;
#1 clr=1;
#2 clr=0;
#40 $finish;
end

always #1 clock=~clock;
always #2 set=set+1;

(5)執行模擬並檢視波形。檢視輸出資訊。
檢查沒有錯誤之後檢視波形。點選右側 Workspace 中的訊號,進行新增並檢視分析模擬結果。如圖4-1-5所示:
在這裡插入圖片描述

3. shift_constrain測試檔案的設計

(1)新建一個模組,命名為shift_constrain,模組型別選擇為constrain,具有14個輸入和8個輸出,如圖4-1-6所示。
在這裡插入圖片描述
(2)修改埠名稱並進行連線。其中,shift模組的輸入data_in和輸出data_out分別對應8個埠,輸入set對應3個埠。本設計中,各個埠對應的開發板引腳如下所示:
clk對應開發板按鍵開關R18;
clr對應開發板按鍵開關P16;
en對應開發板撥碼開關T16;
set[0],set[1],set[2]對應G15,P15,W13;
data_in[0]——data_in[7]分別對應V12,W16,J15,H15,V13,U17,T17,Y17;
data_out[0]——data_out[7]分別對應T14,T15,P14,R14,U14,U15,V17,V18;
輸入data_in對應的連線名稱需要改成0——7,set的連線名稱則要改成0,1,2。修改後的約束模組如圖4-1-7所示。
在這裡插入圖片描述
(3)儲存並執行,如果軟體顯示“Generate constrain file complete”,說明約束檔案已經成功生成。

4.1.3. 板級驗證

為了測試所設計shift的工作特性,選擇開發板搭載XILINX公司的Z-7010晶片,選用VIVADO設計平臺進行Synthesis、Implementation和Generate Bitstream,最終將生成的資料流檔案下載到開發板內,並進行驗證。

1. VIVADO設計平臺進行後端設計

1.1啟動Vivado軟體並選擇裝置XC7Z010CLG400-1(ZYBO)作為硬體物件,設計語言選用Verilog,建立新的工程,新增通過Robei設計的檔案shift.v。
(1)開啟Vivado,選擇開始>所有程式>Xilinx Design Tools> Vivado2013.4> Vivado2013.4;
(2)單擊建立新專案Create New Project啟動向導。你將看到建立一個新的Vivado專案對話方塊,單擊Next;
(3)在彈出的對話方塊中輸入工程名shift及工程儲存的位置,並確保Create project subdirectory核取方塊被選中,單擊Next;
在這裡插入圖片描述
(4)選擇專案型別表單的RTL Project選項,不勾選Do not specify sources at this time核取方塊,然後單擊Next;
(5)使用下拉按鈕,選中Verilog作為目標檔案和模擬語言;
(6)點選新增Add Files按鈕,瀏覽到剛剛我們Robei專案的目錄下開啟Verilog資料夾,選擇shift.v,單擊Open,然後單擊Next去新增現有的IP模型;
(7)由於我們沒有任何的IP新增,跳過這一步,直接單擊Next去新增約束形成;
(8)點選新增Add Files按鈕,瀏覽到剛剛建立約束模組目錄下的constrain資料夾,選擇shift_constrain.xdc,單擊Open進行新增,然後單擊Next;
(9)在預設視窗中,按照圖4-1-12所示,設定Filer中的選項,然後在Parts中選擇對應的XC7Z010CLG400-1,單擊Next;
(10)單擊Finish,本Vivado專案建立成功。
在這裡插入圖片描述
在這裡插入圖片描述
1.2開啟shift_constrain.xdc檔案,檢視引腳約束原始碼。
(1)在資源視窗sources中,展開約束資料夾,如下圖4-1-13所示,然後雙擊即可開啟uart_led_pins.xdc進入文字編輯模式;
在這裡插入圖片描述
(2)Xilinx設計約束檔案分配FPGA位於主機板上的開關和指示燈的物理IO地址,這些資訊可以通過主機板的原理圖或電路板的使用者手冊來獲得。
本次設計的約束檔案程式碼是通過Robei軟體自動生成,但是,Robei軟體目前生成的約束程式碼只有對輸入輸出埠的分配,在這個設計中,我們使用了一個通過開關控制的模擬時鐘clk,而非系統時鐘,這種電路在綜合的時候一般都會報錯,所以,在約束檔案最後,我們需要手動新增一句命令:
set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets clk_IBUF]
來保證流程中不會出錯。
完整的約束程式碼如下:
#This file is generated by Robei!
#Pin Assignment for Xilinx FPGA with Software Vivado.
set_property PACKAGE_PIN R18 [get_ports clk]
set_property IOSTANDARD LVCMOS33 [get_ports clk]
set_property PACKAGE_PIN P16 [get_ports clr]
set_property IOSTANDARD LVCMOS33 [get_ports clr]
set_property PACKAGE_PIN T16 [get_ports en]
set_property IOSTANDARD LVCMOS33 [get_ports en]
set_property PACKAGE_PIN V12 [get_ports data_in[0]]
set_property IOSTANDARD LVCMOS33 [get_ports data_in[0]]
set_property PACKAGE_PIN W16 [get_ports data_in[1]]
set_property IOSTANDARD LVCMOS33 [get_ports data_in[1]]
set_property PACKAGE_PIN J15 [get_ports data_in[2]]
set_property IOSTANDARD LVCMOS33 [get_ports data_in[2]]
set_property PACKAGE_PIN H15 [get_ports data_in[3]]
set_property IOSTANDARD LVCMOS33 [get_ports data_in[3]]
set_property PACKAGE_PIN V13 [get_ports data_in[4]]
set_property IOSTANDARD LVCMOS33 [get_ports data_in[4]]
set_property PACKAGE_PIN U17 [get_ports data_in[5]]
set_property IOSTANDARD LVCMOS33 [get_ports data_in[5]]
set_property PACKAGE_PIN T17 [get_ports data_in[6]]
set_property IOSTANDARD LVCMOS33 [get_ports data_in[6]]
set_property PACKAGE_PIN Y17 [get_ports data_in[7]]
set_property IOSTANDARD LVCMOS33 [get_ports data_in[7]]
set_property PACKAGE_PIN G15 [get_ports set[0]]
set_property IOSTANDARD LVCMOS33 [get_ports set[0]]
set_property PACKAGE_PIN P15 [get_ports set[1]]
set_property IOSTANDARD LVCMOS33 [get_ports set[1]]
set_property PACKAGE_PIN W13 [get_ports set[2]]
set_property IOSTANDARD LVCMOS33 [get_ports set[2]]
set_property PACKAGE_PIN T14 [get_ports data_out[0]]
set_property IOSTANDARD LVCMOS33 [get_ports data_out[0]]
set_property PACKAGE_PIN T15 [get_ports data_out[1]]
set_property IOSTANDARD LVCMOS33 [get_ports data_out[1]]
set_property PACKAGE_PIN P14 [get_ports data_out[2]]
set_property IOSTANDARD LVCMOS33 [get_ports data_out[2]]
set_property PACKAGE_PIN R14 [get_ports data_out[3]]
set_property IOSTANDARD LVCMOS33 [get_ports data_out[3]]
set_property PACKAGE_PIN U14 [get_ports data_out[4]]
set_property IOSTANDARD LVCMOS33 [get_ports data_out[4]]
set_property PACKAGE_PIN U15 [get_ports data_out[5]]
set_property IOSTANDARD LVCMOS33 [get_ports data_out[5]]
set_property PACKAGE_PIN V17 [get_ports data_out[6]]
set_property IOSTANDARD LVCMOS33 [get_ports data_out[6]]
set_property PACKAGE_PIN V18 [get_ports data_out[7]]
set_property IOSTANDARD LVCMOS33 [get_ports data_out[7]]
set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets clk_IBUF]

(3)點選File—>Save File儲存檔案。

** 1.3使用Vivado綜合工具來綜合設計,並進行Implementation任務實現。**

(1)單擊綜合任務下拉選單中的Run Synthesis,綜合過程將分析shift.v檔案並生成網表檔案。當綜合過程完成了,且沒有錯誤資訊,將會彈出帶有三個選項的完成對話方塊;
(2)如果有錯誤,根據錯誤資訊提示進行修改,直至綜合沒有錯誤成功完成。然後選擇Run Implementation選項,執行任務實現,然後單擊OK;
(3)任務實現過程將在綜合後的設計上執行。當這個過程完成,且沒有錯誤資訊,將會彈出帶有三個選項的任務實現完成對話方塊;
(4)如果有錯誤,根據錯誤資訊提示修改,直至綜合沒有錯誤。

** 1.4將開發板上的電源開關撥到ON,生成位元流並開啟硬體會話,對FPGA進行程式設計。**

(1)確保微型USB電纜連線到PROG UART介面;
(2)確保JP7設定為USB提供電源;
(3)接通電源板上的開關;
(4)點選任務實現完成彈出的對話方塊中Generate Bitstream或者點選導航視窗中程式設計和除錯任務中的Generate Bitstream。當完成位元流生成後會彈出有三個選項的完成對話方塊;
(5)這一過程將已經生成的shift.bit檔案放在shift.runs目錄下的impl_1目錄下;
(6)選擇開啟硬體管理器Open Hardware Manager選項,然後單擊確定。硬體管理器視窗將開啟並顯示“未連線”狀態;
(7)點選Open a new hardware target。如果之前已經配置過開發板你也可以點選最近開啟目標連結Open recent target;
在這裡插入圖片描述
在這裡插入圖片描述
(8)單擊Next看Vivado自定義搜尋引擎伺服器名稱的形式;
(9)單擊Next以選擇本地主機埠;
(10)單擊兩次Next,然後單擊Finish。未連線硬體會話狀態更改為伺服器名稱並且器件被高亮顯示。還要注意,該狀態表明它還沒有被程式設計;
在這裡插入圖片描述
(11)選擇器件,並驗證shift.bit被選為常規選項卡中的程式檔案;
在這裡插入圖片描述
(12)在器件上單擊滑鼠右鍵,選擇Program device或單擊視窗上方彈出的Program device-> XC7z010_1連結到目標FPGA器件進行程式設計,如圖4-1-20所示;
在這裡插入圖片描述
(13)單擊確定對FPGA進行程式設計。開發板上Done指示燈亮時,器件程式設計結束;
(14)通過控制撥動和按鍵開關的開閉來觀察LED(請參考前面的邏輯圖)驗證輸出結果。

2. 開發板驗證

首先,按住clr(BTN1)不放,按1到2次clk(BTN0),進行復位操作。
然後,將en(SW3)設定為高電平,設定輸入資料data_in[0~7] (Sw[07])和位移控制訊號set[03] (SW0~1),這裡選擇輸入資料為00110111,位移控制訊號分別為000,010,100,111進行驗證;
最後,每更改一次位移控制訊號,按一下clk時間鍵,然後觀察輸出資料data_out[0~7] (Led[0~7]),驗證移位暫存器功能是否正確。
set = 000時,data_out 應為 00110111;set = 010時,data_out應為11001101;
set = 100時,data_out應為01110011;set = 111時,data_out應為01101110;
在這裡插入圖片描述
通過驗證結果證明該8位移位暫存器符合設計的要求。

4.1.4. 問題與思考

1.如何在一個模組上面設計一個移位暫存器,該移位暫存器既有右移功能,還有左移、雙向移動的功能,這些功能通過一個值的變化來切換?

2.如何實現扭環形移位暫存器?

相關文章