Verilog項目設(shè)計報拔河游戲機.doc
《Verilog項目設(shè)計報拔河游戲機.doc》由會員分享,可在線閱讀,更多相關(guān)《Verilog項目設(shè)計報拔河游戲機.doc(19頁珍藏版)》請在裝配圖網(wǎng)上搜索。
河海大學(xué)物聯(lián)網(wǎng)工程學(xué)院 Verilog HDL項目設(shè)計報告 題目 拔 河 游 戲 機 專業(yè) 電子科學(xué)與技術(shù) 學(xué)號1562910123、1562910125 授課班號 6292758 學(xué)生姓名 徐子豪、楊詩欣 指導(dǎo)教師 華迪、齊本勝 摘 要 和 關(guān) 鍵 字 為了掌握數(shù)字系統(tǒng)的設(shè)計方法,掌握硬件描述語言——Verilog HDL,掌握模塊化設(shè)計方法,掌握開發(fā)軟件的使用方法。 選擇 基于FPGA開發(fā)板設(shè)計的拔河游戲機,使用兩個按鍵進行比賽,利用按鍵按下的快慢作為模擬的雙方選手拔河過程,led燈的變化決定繩子的位置,led燈到了一邊以后比賽終止,整個過程的難點在于,需要過濾信號,使按鍵產(chǎn)生的信號穩(wěn)定,所以程序中需要有按鍵消抖模塊,同時需標識符來控制比賽的開始與結(jié)束。 關(guā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)設(shè)計 1 . 實驗要求 設(shè)計拔河游戲電路,用按鍵與LED表示輸入與輸出。 (1)初始時,16個LED中間的兩個點亮,然后游戲雙方不停按動按鍵,點亮的兩個LED向按動按鍵慢的一方移動; (2)每按動一下按鍵,LED向?qū)Ψ揭苿右桓瘢? (3)只要LED移動到頭,游戲結(jié)束; (4)工作時鐘100Hz即可; (5)完成全部流程:設(shè)計規(guī)范文檔、模塊設(shè)計、代碼輸入、功能仿真、約束與綜合、布局布線、時序仿真、下載驗證等。 2 . 方案對比 脈沖信號方案: 在選定一定的時間周期內(nèi),檢測按鍵A與按鍵B的產(chǎn)生的脈沖個數(shù),進行比較,若A的脈沖數(shù)量大于B,則Led向A方向移動,反之則向B方向移動,若相等則不動。 消抖模塊方案 給所定按鍵兩個狀態(tài),一個前狀態(tài),一個后狀態(tài),當時鐘時鐘的脈沖沿來臨時,將按鍵狀態(tài)賦值給前狀態(tài),設(shè)置定時器,當計數(shù)計滿后,前狀態(tài)值賦給后狀態(tài),按鍵輸出值為前狀態(tài)和后狀態(tài)的取反的并。 此方案當一直按住按鍵時,按鍵電平信號一直為高,取反后的變?yōu)榈?,可以避免一直按住而直接比賽結(jié)束的特殊情況。 3. 系統(tǒng)框圖 譯碼模塊 Led移動 比較模塊 按鍵模塊 消抖模塊 時鐘分頻 由分頻后的時鐘信號模塊控制按鍵信號模塊,之后進入比較模塊,若A的脈沖數(shù)大于B,則Led向A代表方向移動,反之則向B代表方向移動,若相等則不動。由Led的位置決定使能端的開啟與關(guān)閉,若移動至A或B的頂端,則使能端控制Led無法再移動。 4. 代碼設(shè)計和說明 (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轉(zhuǎn)化為,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、 結(jié)果與討論 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、 問題與分析 在仿真成功以后生成比特流文件時一直顯示錯誤無法成功,之后在請教其他同學(xué)以后,共同分析后發(fā)現(xiàn),一開始設(shè)計中的數(shù)碼管模塊無法在結(jié)束后對應(yīng)顯示,于是便刪除了數(shù)碼管模塊,在led移動到一端后便是游戲結(jié)束標志。 4、 結(jié)果 在分析出問題兵解決之后,將程序燒寫到fpga開發(fā)板上,設(shè)計的功能都能實現(xiàn),于是上板驗證也成功。 三、心得體會 一開始接觸這個課題的時候,不知道怎么下手,通過其他同學(xué)的講解以及查找資料基本了解了拔河游戲機的設(shè)計原理。通過這次課程設(shè)計,我更加感到理論和實際之間的差異很大。我也越來越強烈地感到要掌握一項技術(shù),唯一的辦法也是最好的辦法就是實踐。只有通過實踐才能將書本上的知識應(yīng)用,也只有實踐才能發(fā)現(xiàn)很多問題,真正掌握知識,學(xué)以致用。雖然遇到的問題很多,但是同時得到很多有用的經(jīng)驗。這些對于以后的學(xué)習和工作都有很大的幫助。 四、參考文獻 [1] 夏宇聞,Verilog數(shù)字系統(tǒng)設(shè)計教程,北京航天航空大學(xué)出版社,2013 [2] 王金明,數(shù)字系統(tǒng)設(shè)計與Verilog HDL,北京電子工業(yè)出版社,2009 [3] 潘松,EDA技術(shù)實用教程,北京科學(xué)出版社,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]- 1.請仔細閱讀文檔,確保文檔完整性,對于不預(yù)覽、不比對內(nèi)容而直接下載帶來的問題本站不予受理。
- 2.下載的文檔,不會出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請點此認領(lǐng)!既往收益都歸您。
下載文檔到電腦,查找使用更方便
9.9 積分
下載 |
- 配套講稿:
如PPT文件的首頁顯示word圖標,表示該PPT已包含配套word講稿。雙擊word圖標可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計者僅對作品中獨創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- Verilog 項目 設(shè)計 拔河 游戲機
鏈接地址:http://italysoccerbets.com/p-9281572.html