Verilog实现八人抢答器
Verilog實(shí)現(xiàn)八人搶答器
- 一設(shè)計(jì)需求
- 二模塊劃分和代碼
- 1、搶答模塊
- 2、倒計(jì)時(shí)模塊
- 3、分頻模塊
- 4、掃描顯示模塊
- 5、蜂鳴器
- 三、頂層
- 四、一些問題及總結(jié)
一設(shè)計(jì)需求
搶答器由FPGA中verilog語言編寫,一共有六個(gè)模塊,分別為:daojishi,divscandisplay,fmq2,shuju,qqddqq組成,可實(shí)現(xiàn)八人搶答功能,并實(shí)現(xiàn)30s倒計(jì)時(shí),當(dāng)?shù)褂?jì)時(shí)時(shí)間為0時(shí)無人搶答會(huì)使蜂鳴器報(bào)警,當(dāng)有人成功搶答時(shí)會(huì)顯示搶答選手序號(hào)并產(chǎn)生報(bào)警。qqddqq為頂層文件,級(jí)聯(lián)各個(gè)模塊
二模塊劃分和代碼
1、搶答模塊
為實(shí)現(xiàn)八人搶答功能模塊,選手成功搶答會(huì)顯示序號(hào)并產(chǎn)生報(bào)警
module shuju(clk,start,xuan,answer,EnFlat); input start,clk; input[7:0] xuan; output reg EnFlat; output reg [3:0] answer;always@(posedge clk) beginif(start==1'b0)beginEnFlat=1'b1;//鎖存置高endelse if(EnFlat)begincase(xuan)//選手搶答,選手按下時(shí)輸出自己序號(hào),并使鎖存置0達(dá)到鎖存效果8'b00000001:beginEnFlat<=1'b0;answer<=8'b00000001;end8'b00000010:beginEnFlat<=1'b0;answer<=8'b00000010;end8'b00000100:beginEnFlat<=1'b0;answer<=8'b00000011;end8'b00001000:beginEnFlat<=1'b0;answer<=8'b00000100;end8'b00010000:beginEnFlat<=1'b0;answer<=8'b00000101;end8'b00100000:beginEnFlat<=1'b0;answer<=8'b00000110;end8'b01000000:beginEnFlat<=1'b0;answer<=8'b00000111;end8'b10000000:beginEnFlat<=1'b0;answer<=8'b00001000;enddefault:answer<=0;endcaseend end endmodule2、倒計(jì)時(shí)模塊
實(shí)現(xiàn)30s倒計(jì)時(shí)模塊
module daojishi (q,qout,reset,cout,clk); output reg [7:0] qout; output cout; reg cout; input reset,clk,q; always@(posedge clk or negedge reset )beginif(!reset) beginqout <= 8'h30;cout <=0;endelse if(q)beginif(qout[3:0]==0) //判斷十位是否為0beginif(qout[7:4]==0) //判斷個(gè)位是否為0begincout <=1;//全為0時(shí)給一個(gè)cout信號(hào)給蜂鳴器qout <=0;//使倒計(jì)時(shí)一直為0endelsebeginqout[3:0]<=9;//個(gè)位為0,十位不為0,讓個(gè)位為9qout[7:4]<=qout[7:4]-1;//讓十位減一endendelse beginqout[3:0]<= qout[3:0]-1;//若都不為0,讓個(gè)位減1endend end endmodule3、分頻模塊
module div(rst_n,clk_in,clk_out);parameter period=5,duty=2;input rst_n,clk_in;output reg clk_out;reg [25:0] counter;always@(posedge clk_in or negedge rst_n)beginif(!rst_n)begincounter<=0;clk_out<=0;endelse beginif(counter>=period)counter<=0;elsecounter<=counter+1;if(counter>duty)clk_out<=1;elseclk_out<=0;endend endmodule4、掃描顯示模塊
為掃描顯示模塊,一個(gè)用了四個(gè)數(shù)碼管顯示,一個(gè)顯示選手搶答序號(hào),兩個(gè)分別顯示倒計(jì)時(shí)十位和個(gè)位,一個(gè)顯示橫杠分開選手序號(hào)和倒計(jì)時(shí)
module scandisplay(clk,mdata0,ddata0,ddata1,seg_sel,seg7);input clk;input[3:0]mdata0,ddata1,ddata0;output reg[2:0] seg_sel;output reg[7:0] seg7;reg[3:0] data;reg cnt;always@(posedge clk)beginif(seg_sel<3)seg_sel<=seg_sel+1;elseseg_sel<=0;endalways@(seg_sel)begincase(seg_sel)0: data<=ddata0;//顯示倒計(jì)時(shí)的個(gè)位1: data<=ddata1;//顯示倒計(jì)時(shí)的十位2: data<=11;//一個(gè)橫桿3: data<=mdata0;//選手號(hào)碼default:data<=0;endcaseendalways@(data)begincase(data)0:seg7<=8'b00111111;1:seg7<=8'b00000110; 2:seg7<=8'b01011011;3:seg7<=8'b01001111;4:seg7<=8'b01100110;5:seg7<=8'b01101101;6:seg7<=8'b01111101;7:seg7<=8'b00000111;8:seg7<=8'b01111111;9:seg7<=8'b01101111;default:seg7<=8'b01000000;endcaseendendmodule5、蜂鳴器
module fmq2(q,clk,cout,beep); input clk,q; input cout; output reg beep;always @ (posedge clk)beginif(cout==1||q==1) beep=0;//蜂鳴器為低時(shí)響else beep=1;end endmodule三、頂層
module qqddqq(xuan,seg7,clk,start,z,seg_sel,res); input start; input clk; input[7:0] xuan; wire [7:0] xuan; input wire res; wire[7:0] sout; wire carry_s; wire clk_100; wire clk_1; output wire[7:0] seg7; output wire[2:0] seg_sel; output z; reg EnFlat=1'b0; reg [3:0]answer=4'b0; wire [7:0]ans; wire en;div #(2999,1499) div_u1(res,clk,clk_100); div #(1999,999) div_u2(res,clk_100,clk_1);shuju( .clk (clk_100), .start (start),//start為總開關(guān),控制選手搶答和倒計(jì)時(shí)開始 .xuan (xuan), .answer (ans), .EnFlat (en) );scandisplay scandisp_u1(clk_100,ans[3:0],sout[3:0],sout[7:4],seg_sel,seg7);daojishi( .q (en), .qout (sout), .reset (start), .cout (carry_s), .clk (clk_1) );fmq2(.q (!en),.clk (clk_1),.cout (carry_s),.beep (z) );endmodule四、一些問題及總結(jié)
1、第一次完成fpga編寫,完成八人搶答器,其中一些變量命名中英文混合,可能看的有點(diǎn)惡心。
2、寫代碼時(shí)一些邏輯問題經(jīng)過多次改進(jìn)才最終實(shí)現(xiàn)目標(biāo)。
總結(jié)
以上是生活随笔為你收集整理的Verilog实现八人抢答器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 物联网护理系统源码
- 下一篇: Elastic Search学习笔记