例項七— 8位移位暫存器的設計
例項七 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.如何實現扭環形移位暫存器?
相關文章
- 程式設計中暫存器的使用程式設計
- 058線性反饋移位暫存器產生m序列
- SPI通訊協議 的移位暫存器資料交換過程協議
- CS 暫存器 和 IP 暫存器
- 暫存器
- 暫存器定址和暫存器間接定址的區別
- PC暫存器
- 為什麼Modbus的只讀暫存器被稱為“輸入暫存器(Input Registers)”而不是“輸出暫存器”
- CPU 中通用暫存器的作用
- KafKa Java程式設計例項KafkaJava程式設計
- 設計模式例項程式碼設計模式
- 例項九— 除法器設計
- Jmeter beanshell程式設計例項JMeterBean程式設計
- 關於STM32的BSRR(埠位設定/清除暫存器) 和 BRR(埠位清除暫存器) 的理解(初學32)
- 【STM32】【暫存器】暫存器位讀寫方式配置系統時鐘
- 微控制器C程式設計例項指導pdfC程式程式設計
- STM32 GPIO 暫存器的配置
- CS、IP和PC暫存器
- 解析JavaScript設計模型Iterator例項JavaScript模型
- 暫存
- Java讀取暫存器資料的方法Java
- 基於暫存器呼叫的軟體加速
- 原生javascript開發計算器例項JavaScript
- 新手分享_再談FS暫存器
- Verilog設計技巧例項及實現
- 【STC8H】STC8系列專有的特殊的暫存器位——PW_2暫存器的最高位 EAXFR
- 《C#併發程式設計經典例項》學習筆記—2.1 暫停一段時間C#程式設計筆記
- CPU中跟蹤後繼指令地址的暫存器
- C++學習隨筆——簡單的單例設計模式例項C++單例設計模式
- iOS彙編基礎(二)暫存器iOS
- 6.常見暫存器和指令
- 10.1 除錯事件讀取暫存器除錯事件
- 第五章:通用暫存器是()。
- 暫存器指定為寫0或者1
- Intel 8086微處理器暫存器結構Intel
- 暫存器,觸發器,三極體小結觸發器
- C++設計模式+例項視訊教程C++設計模式
- 設計模式 - 原則及例項講解設計模式