實(shí)驗(yàn)21:智力競賽搶答器
實(shí)驗(yàn)?zāi)康?/h2>實(shí)驗(yàn)任務(wù)
本實(shí)驗(yàn)的任務(wù)是設(shè)計(jì)一個(gè)智力競賽搶答器,帶復(fù)位和主持人控制功能。
本文引用地址:http://2s4d.com/article/202310/451512.htm實(shí)驗(yàn)原理
根據(jù)搶答器的功能,采用模塊化設(shè)計(jì),如下
搶答判斷模塊(judge):根據(jù)開關(guān)的輸入判斷搶答的選手信號,通過輸出的LED顯示搶答選手;內(nèi)部定義block標(biāo)志信號用來鎖定搶答完成;判斷搶答之后答題超過30秒產(chǎn)生報(bào)警信號。
分?jǐn)?shù)模塊(score):復(fù)位信號單獨(dú)復(fù)位所有選手分?jǐn)?shù);加減按鍵消抖后用來增加減少分?jǐn)?shù)。
顯示模塊(dseg):當(dāng)前搶答的選手分?jǐn)?shù)顯示在數(shù)碼管上。
分頻模塊(divide):分頻產(chǎn)生計(jì)時(shí)時(shí)鐘信號。
Verilog HDL建模描述
程序清單answer.v
module answer
(
input wire clk,rst, //時(shí)鐘和復(fù)位信號
input wire k1,k2,k3,k4, //選手開關(guān)
input wire reset,add,sub, //復(fù)位分?jǐn)?shù),加分,減分按鍵
output wire led1,led2,led3,led4,//選手對應(yīng)
ledoutput wire buzz, //報(bào)警信號
output wire [8:0] segment_led //數(shù)碼管信號
);
wire clk1h;
divide #( //產(chǎn)生1秒時(shí)鐘信號
.WIDTH(24),
.N(12000000)
) u1(.clk(clk),
.rst_n(rst),
.clkout(clk1h));judge u2 //判斷搶答選手,答題超時(shí)報(bào)警
(
.clk(clk1h),
.k1(k1),
.k2(k2),
.k3(k3),
.k4(k4),
.start(rst),
.out1(led1),
.out2(led2),
.out3(led3),
.out4(led4),
.buzz(buzz)
);
wire [3:0] score1,score2,score3,score4;
score u3 //主持人控制答題選手分?jǐn)?shù)
(
.clk(clk),.rst(rst),
.add(add),.sub(sub),
.reset(reset),
.c1(led1),.c2(led2),.c3(led3),.c4(led4),
.score1(score1),.score2(score2),.score3(score3),.score4(score4)
);
dseg u4 //數(shù)碼管驅(qū)動顯示答題選手分?jǐn)?shù)
(
.rst(rst),
.c1(led1),.c2(led2),.c3(led3),.c4(led4),
.score1(score1),.score2(score2),.score3(score3),.score4(score4),
.segment_led(segment_led)
);
endmodule
頂層文件一共調(diào)用了4個(gè)模塊judge.v、score.v、dseg.v、divide.v。所有的子模塊源碼請參考前例實(shí)驗(yàn)的工程文件
實(shí)驗(yàn)步驟
當(dāng)程序下載成功時(shí),按下rst復(fù)位,表示搶答開始。由于開發(fā)板上的開關(guān)有限,所以采用四個(gè)撥碼開關(guān)分別表示4個(gè)搶答選手。當(dāng)判斷撥碼開關(guān)狀態(tài)后,同時(shí)該選手對應(yīng)的led點(diǎn)亮。
按下reset復(fù)位鍵,搶答完成后在數(shù)碼管上顯示選手分?jǐn)?shù),可以通過加減分按鍵修改分?jǐn)?shù)。
本實(shí)驗(yàn)的任務(wù)是設(shè)計(jì)一個(gè)智力競賽搶答器,帶復(fù)位和主持人控制功能。
根據(jù)搶答器的功能,采用模塊化設(shè)計(jì),如下
搶答判斷模塊(judge):根據(jù)開關(guān)的輸入判斷搶答的選手信號,通過輸出的LED顯示搶答選手;內(nèi)部定義block標(biāo)志信號用來鎖定搶答完成;判斷搶答之后答題超過30秒產(chǎn)生報(bào)警信號。
分?jǐn)?shù)模塊(score):復(fù)位信號單獨(dú)復(fù)位所有選手分?jǐn)?shù);加減按鍵消抖后用來增加減少分?jǐn)?shù)。
顯示模塊(dseg):當(dāng)前搶答的選手分?jǐn)?shù)顯示在數(shù)碼管上。
分頻模塊(divide):分頻產(chǎn)生計(jì)時(shí)時(shí)鐘信號。
程序清單answer.v
module answer ( input wire clk,rst, //時(shí)鐘和復(fù)位信號 input wire k1,k2,k3,k4, //選手開關(guān) input wire reset,add,sub, //復(fù)位分?jǐn)?shù),加分,減分按鍵 output wire led1,led2,led3,led4,//選手對應(yīng) ledoutput wire buzz, //報(bào)警信號 output wire [8:0] segment_led //數(shù)碼管信號 ); wire clk1h; divide #( //產(chǎn)生1秒時(shí)鐘信號 .WIDTH(24), .N(12000000) ) u1(.clk(clk), .rst_n(rst), .clkout(clk1h));judge u2 //判斷搶答選手,答題超時(shí)報(bào)警 ( .clk(clk1h), .k1(k1), .k2(k2), .k3(k3), .k4(k4), .start(rst), .out1(led1), .out2(led2), .out3(led3), .out4(led4), .buzz(buzz) ); wire [3:0] score1,score2,score3,score4; score u3 //主持人控制答題選手分?jǐn)?shù) ( .clk(clk),.rst(rst), .add(add),.sub(sub), .reset(reset), .c1(led1),.c2(led2),.c3(led3),.c4(led4), .score1(score1),.score2(score2),.score3(score3),.score4(score4) ); dseg u4 //數(shù)碼管驅(qū)動顯示答題選手分?jǐn)?shù) ( .rst(rst), .c1(led1),.c2(led2),.c3(led3),.c4(led4), .score1(score1),.score2(score2),.score3(score3),.score4(score4), .segment_led(segment_led) ); endmodule
頂層文件一共調(diào)用了4個(gè)模塊judge.v、score.v、dseg.v、divide.v。所有的子模塊源碼請參考前例實(shí)驗(yàn)的工程文件
當(dāng)程序下載成功時(shí),按下rst復(fù)位,表示搶答開始。由于開發(fā)板上的開關(guān)有限,所以采用四個(gè)撥碼開關(guān)分別表示4個(gè)搶答選手。當(dāng)判斷撥碼開關(guān)狀態(tài)后,同時(shí)該選手對應(yīng)的led點(diǎn)亮。
按下reset復(fù)位鍵,搶答完成后在數(shù)碼管上顯示選手分?jǐn)?shù),可以通過加減分按鍵修改分?jǐn)?shù)。
評論