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