Verilog項目設計報拔河游戲機.doc
《Verilog項目設計報拔河游戲機.doc》由會員分享,可在線閱讀,更多相關《Verilog項目設計報拔河游戲機.doc(19頁珍藏版)》請在裝配圖網(wǎng)上搜索。
河海大學物聯(lián)網(wǎng)工程學院 Verilog HDL項目設計報告 題目 拔 河 游 戲 機 專業(yè) 電子科學與技術 學號1562910123、1562910125 授課班號 6292758 學生姓名 徐子豪、楊詩欣 指導教師 華迪、齊本勝 摘 要 和 關 鍵 字 為了掌握數(shù)字系統(tǒng)的設計方法,掌握硬件描述語言——Verilog HDL,掌握模塊化設計方法,掌握開發(fā)軟件的使用方法。 選擇 基于FPGA開發(fā)板設計的拔河游戲機,使用兩個按鍵進行比賽,利用按鍵按下的快慢作為模擬的雙方選手拔河過程,led燈的變化決定繩子的位置,led燈到了一邊以后比賽終止,整個過程的難點在于,需要過濾信號,使按鍵產(chǎn)生的信號穩(wěn)定,所以程序中需要有按鍵消抖模塊,同時需標識符來控制比賽的開始與結束。 關鍵詞 :verilog 拔河比賽 消抖模塊 標識符 In order to master the design method of digital system, we must master the hardware description language -- Verilog HDL, grasp the modular design method and master the way of developing software. Choice Tug of war game FPGA development board based on the design, the use of two button game, using key press speed as both players tug of war of simulation, change led lamp decide the position of the rope, LED lights to the side after the end game, the difficulty lies in the whole process, need to filter the signal, the stable signal generated by the keys so, the procedure requires a key debounce module, also need to control the games identifier and end start. Key words: Verilog tug shake-off module identifier. 一、系統(tǒng)設計 1 . 實驗要求 設計拔河游戲電路,用按鍵與LED表示輸入與輸出。 (1)初始時,16個LED中間的兩個點亮,然后游戲雙方不停按動按鍵,點亮的兩個LED向按動按鍵慢的一方移動; (2)每按動一下按鍵,LED向對方移動一格; (3)只要LED移動到頭,游戲結束; (4)工作時鐘100Hz即可; (5)完成全部流程:設計規(guī)范文檔、模塊設計、代碼輸入、功能仿真、約束與綜合、布局布線、時序仿真、下載驗證等。 2 . 方案對比 脈沖信號方案: 在選定一定的時間周期內,檢測按鍵A與按鍵B的產(chǎn)生的脈沖個數(shù),進行比較,若A的脈沖數(shù)量大于B,則Led向A方向移動,反之則向B方向移動,若相等則不動。 消抖模塊方案 給所定按鍵兩個狀態(tài),一個前狀態(tài),一個后狀態(tài),當時鐘時鐘的脈沖沿來臨時,將按鍵狀態(tài)賦值給前狀態(tài),設置定時器,當計數(shù)計滿后,前狀態(tài)值賦給后狀態(tài),按鍵輸出值為前狀態(tài)和后狀態(tài)的取反的并。 此方案當一直按住按鍵時,按鍵電平信號一直為高,取反后的變?yōu)榈停梢员苊庖恢卑醋《苯颖荣惤Y束的特殊情況。 3. 系統(tǒng)框圖 譯碼模塊 Led移動 比較模塊 按鍵模塊 消抖模塊 時鐘分頻 由分頻后的時鐘信號模塊控制按鍵信號模塊,之后進入比較模塊,若A的脈沖數(shù)大于B,則Led向A代表方向移動,反之則向B代表方向移動,若相等則不動。由Led的位置決定使能端的開啟與關閉,若移動至A或B的頂端,則使能端控制Led無法再移動。 4. 代碼設計和說明 (1)對于輸入端口輸出端口的定義,和寄存器,線網(wǎng)型變量的,以及計數(shù)常量的定義 module project_ba(Clk,Rst_n,KEY1,KEY2,LED); input Clk; input Rst_n; input KEY1; input KEY2; //定義輸入 output [15:0] LED;//定義輸出 reg [27:0] Cnt; reg Clk_100hz; reg en; reg Key1_n; reg Key1_n_reg; reg Key2_n; reg Key2_n_reg; reg [3:0] t; reg [15:0] led; wire key1,key2; parameter CNT = 28d49_999; (2)分頻模塊,將Basys3的100M系統(tǒng)時鐘分頻成為周期為10ms,100Hz頻率 always@(posedge Clk or posedge Rst_n) begin if(Rst_n) begin Cnt <= 28d0;Clk_100hz <= 0;end else if(Cnt == CNT) begin Cnt <= 28d0;Clk_100hz <= ~Clk_100hz;end else Cnt <= Cnt + 1b1; end (3)按鍵消抖模塊,給每一個按鍵兩個狀態(tài),保證按鍵產(chǎn)生的信號可以消除抖動穩(wěn)定。 always@(posedge Clk or posedge Rst_n) begin if(Rst_n) begin Key1_n <= 0;Key2_n <= 0;end else begin Key1_n <= Key1_n_reg; Key2_n <= Key2_n_reg;end end always@(*) begin if(Cnt == CNT) begin Key1_n_reg = KEY1; Key2_n_reg = KEY2;end else begin Key1_n_reg = Key1_n; Key2_n_reg = Key2_n;end end assign key1 = Key1_n & (~Key1_n_reg); assign key2 = Key2_n & (~Key2_n_reg); (4)比較模塊,每當時鐘的上升沿,便比較A,B的脈沖個數(shù),即誰按得快,輸出就為1,否則就為0 always@(posedge Clk) begin if(t == 4d0 || t == 4d14) en <= 1b0; else en <= 1b1; end (5) 移動模塊 always@(posedge Clk_100hz or posedge Rst_n ) begin if(Rst_n) t <= 7; else if(en) case({key1,key2}) 2b10 : t <= t + 1b1; 2b01 : t <= t - 1b1; default:t <= t; endcase end (6)譯碼模塊,將得到的信號t轉化為,Led的顯示,最后賦值給Led輸出端口,并且由數(shù)碼管顯示勝利的一方 always@(*) begin case(t) 4d0 : led = 16b0000_0000_0000_0011; 4d1 : led = 16b0000_0000_0000_0110; 4d2 : led = 16b0000_0000_0000_1100; 4d3 : led = 16b0000_0000_0001_1000; 4d4 : led = 16b0000_0000_0011_0000; 4d5 : led = 16b0000_0000_0110_0000; 4d6 : led = 16b0000_0000_1100_0000; 4d7 : led = 16b0000_0001_1000_0000; 4d8 : led = 16b0000_0011_0000_0000; 4d9 : led = 16b0000_0110_0000_0000; 4d10: led = 16b0000_1100_0000_0000; 4d11: led = 16b0001_1000_0000_0000; 4d12: led = 16b0011_0000_0000_0000; 4d13: led = 16b0110_0000_0000_0000; 4d14: led = 16b1100_0000_0000_0000; default : led = 16b0000_0000_0000_0000; endcase end assign LED = led; endmodule 2、 結果與討論 1、仿真代碼 `define clk_period 10 //定義時鐘周期 module BaTB(); reg Clk; reg Rst_n; reg KEY1,KEY2; wire[15:0] LED; project_ba u0( .Clk(Clk), .Rst_n(Rst_n), .KEY1(KEY1), .KEY2(KEY2), .LED(LED)); initial begin Clk = 0; end always #(`clk_period /2) Clk = ~ Clk; initial begin KEY1 = 0;KEY2 = 0; #(`clk_period * 10) ; Rst_n = 1; #(`clk_period * 10); Rst_n = 0; KEY1 = 1;KEY2 = 0; #(`clk_period * 100); KEY1 = 1;KEY2 = 0; #(`clk_period * 100); KEY1 = 1;KEY2 = 0; end endmodule 2、仿真波形 可以看到一直給Key1施加高電平時鐘信號,Led燈的高電平一直向1方向的led燈方向移動,由此可得仿真成功。 3、 問題與分析 在仿真成功以后生成比特流文件時一直顯示錯誤無法成功,之后在請教其他同學以后,共同分析后發(fā)現(xiàn),一開始設計中的數(shù)碼管模塊無法在結束后對應顯示,于是便刪除了數(shù)碼管模塊,在led移動到一端后便是游戲結束標志。 4、 結果 在分析出問題兵解決之后,將程序燒寫到fpga開發(fā)板上,設計的功能都能實現(xiàn),于是上板驗證也成功。 三、心得體會 一開始接觸這個課題的時候,不知道怎么下手,通過其他同學的講解以及查找資料基本了解了拔河游戲機的設計原理。通過這次課程設計,我更加感到理論和實際之間的差異很大。我也越來越強烈地感到要掌握一項技術,唯一的辦法也是最好的辦法就是實踐。只有通過實踐才能將書本上的知識應用,也只有實踐才能發(fā)現(xiàn)很多問題,真正掌握知識,學以致用。雖然遇到的問題很多,但是同時得到很多有用的經(jīng)驗。這些對于以后的學習和工作都有很大的幫助。 四、參考文獻 [1] 夏宇聞,Verilog數(shù)字系統(tǒng)設計教程,北京航天航空大學出版社,2013 [2] 王金明,數(shù)字系統(tǒng)設計與Verilog HDL,北京電子工業(yè)出版社,2009 [3] 潘松,EDA技術實用教程,北京科學出版社,2009 附錄 實物板級驗證圖: 1、左邊隊員勝利 2、右邊隊員勝利 3、清零重置 4、 源代碼 moduleproject_ba( Clk,Rst_n,KEY1,KEY2, LED); inputClk; inputRst_n; inputKEY1; inputKEY2;//定義輸入 output[15:0]LED;//定義輸出 reg[27:0]Cnt; regClk_100hz; regen; regKey1_n; regKey1_n_reg; regKey2_n; regKey2_n_reg; reg[3:0]t; reg[15:0]led; wirekey1,key2; parameterCNT=28d49_999; always@(posedgeClkorposedgeRst_n) begin if(Rst_n)begin Cnt<=28d0;Clk_100hz<=0;end elseif(Cnt==CNT)begin Cnt<=28d0;Clk_100hz<=~Clk_100hz;end else Cnt<=Cnt+1b1; end always@(posedgeClkorposedgeRst_n) beginif(Rst_n) beginKey1_n<=0;Key2_n<=0;end elsebegin Key1_n<=Key1_n_reg; Key2_n<=Key2_n_reg;end end always@(*) begin if(Cnt==CNT)begin Key1_n_reg=KEY1; Key2_n_reg=KEY2;end elsebegin Key1_n_reg=Key1_n; Key2_n_reg=Key2_n;end end assignkey1=Key1_n&(~Key1_n_reg); assignkey2=Key2_n&(~Key2_n_reg); always@(posedgeClk_100hzorposedgeRst_n) begin if(Rst_n) t<=7; else if(en) case({key1,key2}) 2b10:t<=t+1b1; 2b01:t<=t-1b1; default:t<=t; endcase end always@(posedgeClk) beginif(t==4d0||t==4d14) en<=1b0; else en<=1b1; end always@(*) begin case(t) 4d0:led=16b0000_0000_0000_0011; 4d1:led=16b0000_0000_0000_0110; 4d2:led=16b0000_0000_0000_1100; 4d3:led=16b0000_0000_0001_1000; 4d4:led=16b0000_0000_0011_0000; 4d5:led=16b0000_0000_0110_0000; 4d6:led=16b0000_0000_1100_0000; 4d7:led=16b0000_0001_1000_0000; 4d8:led=16b0000_0011_0000_0000; 4d9:led=16b0000_0110_0000_0000; 4d10:led=16b0000_1100_0000_0000; 4d11:led=16b0001_1000_0000_0000; 4d12:led=16b0011_0000_0000_0000; 4d13:led=16b0110_0000_0000_0000; 4d14:led=16b1100_0000_0000_0000; default:led=16b0000_0000_0000_0000; endcase end//譯碼模塊 assignLED=led; endmodule 5、 測試文件 `define clk_period 10 //定義時鐘周期 module BaTB(); reg Clk; reg Rst_n; reg KEY1,KEY2; wire[15:0] LED; project_ba u0( .Clk(Clk), .Rst_n(Rst_n), .KEY1(KEY1), .KEY2(KEY2), .LED(LED)); initial begin Clk = 0; end always #(`clk_period /2) Clk = ~ Clk; initial begin KEY1 = 0;KEY2 = 0; #(`clk_period * 10) ; Rst_n = 1; #(`clk_period * 10); Rst_n = 0; KEY1 = 1;KEY2 = 0; #(`clk_period * 100); KEY1 = 1;KEY2 = 0; #(`clk_period * 100); KEY1 = 1;KEY2 = 0; end endmodule 6、 管腳約束 set_property IOSTANDARD LVCMOS33 [get_ports {LED[15]}] set_property IOSTANDARD LVCMOS33 [get_ports {LED[14]}] set_property IOSTANDARD LVCMOS33 [get_ports {LED[13]}] set_property IOSTANDARD LVCMOS33 [get_ports {LED[12]}] set_property IOSTANDARD LVCMOS33 [get_ports {LED[11]}] set_property IOSTANDARD LVCMOS33 [get_ports {LED[10]}] set_property IOSTANDARD LVCMOS33 [get_ports {LED[9]}] set_property IOSTANDARD LVCMOS33 [get_ports {LED[8]}] set_property IOSTANDARD LVCMOS33 [get_ports {LED[7]}] set_property IOSTANDARD LVCMOS33 [get_ports {LED[6]}] set_property IOSTANDARD LVCMOS33 [get_ports {LED[5]}] set_property IOSTANDARD LVCMOS33 [get_ports {LED[4]}] set_property IOSTANDARD LVCMOS33 [get_ports {LED[3]}] set_property IOSTANDARD LVCMOS33 [get_ports {LED[2]}] set_property IOSTANDARD LVCMOS33 [get_ports {LED[1]}] set_property IOSTANDARD LVCMOS33 [get_ports {LED[0]}] set_property PACKAGE_PIN L1 [get_ports {LED[15]}] set_property PACKAGE_PIN P1 [get_ports {LED[14]}] set_property PACKAGE_PIN N3 [get_ports {LED[13]}] set_property PACKAGE_PIN P3 [get_ports {LED[12]}] set_property PACKAGE_PIN U3 [get_ports {LED[11]}] set_property PACKAGE_PIN W3 [get_ports {LED[10]}] set_property PACKAGE_PIN V3 [get_ports {LED[9]}] set_property PACKAGE_PIN V13 [get_ports {LED[8]}] set_property PACKAGE_PIN V14 [get_ports {LED[7]}] set_property PACKAGE_PIN U14 [get_ports {LED[6]}] set_property PACKAGE_PIN U15 [get_ports {LED[5]}] set_property PACKAGE_PIN W18 [get_ports {LED[4]}] set_property PACKAGE_PIN V19 [get_ports {LED[3]}] set_property PACKAGE_PIN U19 [get_ports {LED[2]}] set_property PACKAGE_PIN E19 [get_ports {LED[1]}] set_property PACKAGE_PIN U16 [get_ports {LED[0]}] set_property PACKAGE_PIN W5 [get_ports Clk] set_property PACKAGE_PIN W19 [get_ports KEY1] set_property PACKAGE_PIN T17 [get_ports KEY2] set_property PACKAGE_PIN V17 [get_ports Rst_n] set_property IOSTANDARD LVCMOS33 [get_ports Clk] set_property IOSTANDARD LVCMOS33 [get_ports KEY1] set_property IOSTANDARD LVCMOS33 [get_ports KEY2] set_property IOSTANDARD LVCMOS33 [get_ports Rst_n]- 配套講稿:
如PPT文件的首頁顯示word圖標,表示該PPT已包含配套word講稿。雙擊word圖標可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設計者僅對作品中獨創(chuàng)性部分享有著作權。
- 關 鍵 詞:
- Verilog 項目 設計 拔河 游戲機
裝配圖網(wǎng)所有資源均是用戶自行上傳分享,僅供網(wǎng)友學習交流,未經(jīng)上傳用戶書面授權,請勿作他用。
鏈接地址:http://ioszen.com/p-9281572.html