搶答器在各類(lèi)競(jìng)賽中的必備設(shè)備,有單路輸入的,,也有組輸入方式,,本設(shè)計(jì)以FPGA 為基礎(chǔ)設(shè)計(jì)了有三組輸入(每組三人),具有搶答計(jì)時(shí)控制,,能夠?qū)Ω鲹尨鹦〗M成績(jī)進(jìn)行相應(yīng)加減操作的通用型搶答器,;現(xiàn)行的搶答器中主要有兩種:小規(guī)模數(shù)字邏輯芯片譯碼器和觸發(fā)器來(lái)做,另外一種用單片機(jī)來(lái)做,;小規(guī)模數(shù)字邏輯電路比較復(fù)雜,,用單片機(jī)來(lái)做隨著搶答組數(shù)的增加有時(shí)候存在I/O 口不足的情況;本設(shè)計(jì)采用FPGA 來(lái)做增強(qiáng)了時(shí)序控制的靈活性,,同時(shí)由于FPGA 的I/O 端口資源豐富,,可以在本設(shè)計(jì)基礎(chǔ)上稍加修改可以設(shè)計(jì)具有多組輸入的搶答器。
功能描述
本文設(shè)計(jì)了一個(gè)通用型電子搶答器:三個(gè)參賽隊(duì),,每個(gè)隊(duì)有三個(gè)成員,,各自可手動(dòng)按按鈕申請(qǐng)搶答權(quán),;回到正確加1 分,回答錯(cuò)誤減1 分,,違規(guī)搶答減1分,,不搶答不加分不扣分;用4 位LED 的左邊2 位顯示搶答組號(hào)及搶答計(jì)時(shí)時(shí)間,,右邊2 位顯示相應(yīng)組的成績(jī),。
搶答器具體功能如下:
1、可同時(shí)進(jìn)行三組每個(gè)小組三人的搶答,, 用9 個(gè)按鈕Group1_1,,Group1_2,Group1_3,,Group2_1,Group2_2,,Group2_3,,Group3_1,Group3_2,,Group3_3 表示,;
2、設(shè)置一個(gè)搶答控制開(kāi)關(guān)Start,,該開(kāi)關(guān)由主持人控制;只有當(dāng)主持人按下開(kāi)始鍵才能搶答,;在按開(kāi)始按鈕前搶答屬于違規(guī);
3,、搶答器具有定時(shí)搶答功能,,且一次搶答的時(shí)間設(shè)定為30 秒。當(dāng)主持人啟動(dòng)“開(kāi)始”鍵后,,用4 位LED 數(shù)碼管左邊兩位顯示30s 的倒計(jì)時(shí),;同時(shí)紅色LED燈亮,表明可以搶答,。
4,、搶答器具有鎖存與顯示功能。即選手按動(dòng)按鈕,,鎖存相應(yīng)的組號(hào),,并在4 位LED 數(shù)碼管的左邊兩位顯示,同時(shí)用一個(gè)綠色LED 指示是否有選手搶答,,如果是違規(guī)搶答還能用選手蜂鳴器報(bào)警提示,。搶答實(shí)行優(yōu)先鎖存,優(yōu)先搶答選手的相應(yīng)組號(hào)和成績(jī)一直保持到下一輪搶答開(kāi)始,。
5,、參賽選手在設(shè)定的時(shí)間內(nèi)進(jìn)行搶答,,搶答有效,數(shù)碼管左邊兩位顯示 ”FX”,,如果搶答違規(guī)則顯示 ”XF”(其中X 表示組號(hào)1~3),,并保持到下一輪搶答。如果搶答延遲時(shí)間已到,,無(wú)人搶答,,本次搶答無(wú)效,系統(tǒng)回到主持人按開(kāi)始前的等待狀態(tài),,數(shù)碼管上左邊兩位顯示“FF”,。
6、當(dāng)搶答有效后,,主持人可以根據(jù)搶答選手回答問(wèn)題正確與否對(duì)選手相應(yīng)組數(shù)的成績(jī)進(jìn)行加減分操作,,搶答違規(guī)也能減分操作,用4 位LED 數(shù)碼管右邊兩位顯示相應(yīng)組數(shù)的成績(jī),。(注各組初始成績(jī)?yōu)?0 分)
設(shè)計(jì)架構(gòu)
本文以FPGA 為基礎(chǔ)設(shè)計(jì)的電子搶答器,,根據(jù)設(shè)計(jì)功能要求,改設(shè)計(jì)主要包括搶答輸入鍵盤(pán),,數(shù)碼管顯示,,報(bào)警及FPGA 最小系統(tǒng)。搶答器結(jié)構(gòu)簡(jiǎn)圖如圖1所示,。
1,、FPGA 最小系統(tǒng)電路:FPGA 正常工作時(shí)的基本電路,由時(shí)鐘和復(fù)位電路組成,。
2,、鍵盤(pán)輸入電路:用3×3 矩陣鍵盤(pán)組成3 個(gè)組共9 個(gè)人的搶答按鈕。同時(shí)包括Start,, Add,, Sub 三個(gè)由主持人控制的單獨(dú)按鈕。
3,、顯示模塊:用移位寄存器74HC164 驅(qū)動(dòng)4 位共陰數(shù)碼管顯示,;數(shù)碼管要顯示的數(shù)據(jù)通過(guò)74HC164 串行數(shù)據(jù)端口輸入。
4,、報(bào)警及相關(guān)信息顯示:蜂鳴器電路和LED 燈顯示相關(guān)狀態(tài)信息指示電路,。
各模塊詳細(xì)描述
1、FPGA 與各個(gè)模塊的接口
本文以XC3S400 為基礎(chǔ)設(shè)計(jì)的電子搶答器,,搶答器實(shí)際上是一個(gè)人機(jī)接口的一個(gè)智能設(shè)備,,該設(shè)計(jì)中用到的FPGA 外部I/O 口及其與外部各個(gè)模塊連接的網(wǎng)絡(luò)標(biāo)識(shí)如圖2 所示。
圖2.FPGA 的IO 接口
2,、按鍵模塊
由于按鍵是機(jī)械的動(dòng)作,,按鍵存在電平抖動(dòng),,為了消除按鍵抖動(dòng)引起的干擾,需要等按鍵值達(dá)到穩(wěn)定狀態(tài)時(shí)才讀取按鍵的值,,也就是說(shuō)要當(dāng)按鍵按下一段時(shí)間后,,才讀取按鍵值;本設(shè)計(jì)中搶答開(kāi)始鍵(Start),、搶答后各組成績(jī)的加(Add)和減(Sub)按鍵是以單鍵的形式輸入,,按鍵延遲時(shí)間為20ms,對(duì)于搶答組的按鍵是用3×3 陣列鍵盤(pán)實(shí)現(xiàn),,row=3’b001 以周期為5.08ms 進(jìn)行循環(huán)左移掃描,,掃描完三行的周期為15.24ms,這個(gè)就是說(shuō)只有當(dāng)兩個(gè)按鍵之間的時(shí)間間隔在15.24ms 之內(nèi)時(shí)才有可能存在一個(gè)按鈕在比另一個(gè)按鈕先按,,而響應(yīng)后者,;實(shí)際操作中,兩人按鍵之間的間隔大于這個(gè)時(shí)間間隔,,因此,,不會(huì)出現(xiàn)錯(cuò)誤響應(yīng)。同時(shí)每個(gè)按鍵后的延遲等待125.76ms 后此按鍵值才有效,;經(jīng)過(guò)實(shí)際測(cè)試,鍵盤(pán)具有消抖功能,,能夠正確檢測(cè)按鍵值,。按鍵電路圖如圖3 所示。
圖3.按鍵電路
圖注: Group1_1,,Group1_2,,Group1_3 分別表示第一參賽小組的三個(gè)成員的按鈕, 依次類(lèi)推Group2_1,,Group2_2,,Group2_3 和 Group1_1,Group1_2,,Group1_3 分別代表第二和第三參賽小組的三個(gè)成員,;Start、Add,、Sub 分別代表?yè)尨痖_(kāi)始按鍵,、對(duì)小組成績(jī)的加操作和減操作按鈕!
3,、顯示模塊
顯示模塊由4 位的LED 數(shù)碼管顯示搶答組數(shù),、是否違規(guī)搶答信息、按下?lián)尨疰I后的搶答時(shí)間,、各組所得分?jǐn)?shù)等信息,;其中數(shù)碼管左邊2 位顯示搶答組號(hào)及搶答計(jì)時(shí)時(shí)間,,右邊2 位顯示相應(yīng)組的成績(jī)。數(shù)碼管的驅(qū)動(dòng)電路(譯碼電路)用兩片74164 控制,;電路圖如圖4 所示,。
顯示數(shù)據(jù)信息通過(guò)74164 的串行譯碼傳送到數(shù)碼管對(duì)應(yīng)段,對(duì)應(yīng)位顯示,;對(duì)于數(shù)碼管顯示的時(shí)序特別要注意:數(shù)碼管是采用動(dòng)態(tài)掃描方式顯示,,所有位掃描顯示一次的頻率一定要大于相應(yīng)位數(shù)據(jù)改變的頻率;同時(shí)當(dāng)數(shù)碼管對(duì)于數(shù)據(jù)改變的同時(shí)一定要把相應(yīng)數(shù)據(jù)送到數(shù)碼管進(jìn)行顯示,,即數(shù)據(jù)改變和數(shù)據(jù)顯示要同步,;此設(shè)計(jì)中4 位數(shù)碼管動(dòng)態(tài)掃描頻率位190Hz,而數(shù)碼管要顯示的搶答組數(shù),、搶答組的成績(jī)等信息的變化頻率都是秒級(jí),,即幾秒鐘或者幾分鐘變化一次,滿(mǎn)足數(shù)碼管顯示要求,。
圖4.顯示電路
注:數(shù)碼管為共陰數(shù)碼管,,其中pin6,pin8,,pin9,,pin12 依次為位碼,其余為段碼,;
4,、時(shí)鐘復(fù)位
此模塊用于生成FPGA 系統(tǒng)時(shí)鐘和復(fù)位電路,采用有源晶振和低電平復(fù)位,。系統(tǒng)時(shí)鐘采用50MHz,,能夠滿(mǎn)足電路設(shè)計(jì)要求,電路如圖5 所示,。
圖5.時(shí)鐘復(fù)位電路
5,、報(bào)警模塊
報(bào)警主要用于響應(yīng)當(dāng)沒(méi)有按開(kāi)始鍵之前違規(guī)搶答信號(hào);即當(dāng)違規(guī)時(shí)蜂鳴器響,;同時(shí)還增加了一個(gè)紅色用于顯示當(dāng)按下開(kāi)始鍵的信號(hào),;即當(dāng)主持人按下開(kāi)始按鍵時(shí),紅色LED 燈亮,;同時(shí)用一個(gè)綠色LED 燈指示有選手按搶答按鈕,,選手按鍵搶答,綠色LED 閃爍一次,。電路圖如圖6 所示,。
圖6.報(bào)警和指示
軟件代碼描述
軟件設(shè)計(jì)主要采用verilog HDL 語(yǔ)言進(jìn)行設(shè)計(jì),采用狀態(tài)機(jī)對(duì)搶答器的各個(gè)過(guò)程進(jìn)行控制,,設(shè)計(jì)中采用了層次化和模塊化的思想,,即頂層模塊只有一個(gè)控制搶答器的主狀態(tài)機(jī)和模塊例化,,然后分別用子模塊實(shí)現(xiàn)數(shù)碼管顯示,成績(jī)多路選擇器,,成績(jī)的處理模塊,,按下?lián)尨痖_(kāi)始鍵后的延遲等待模塊,按鍵模塊等,。程序流程圖如圖7 所示,。
圖7.程序流程圖
圖注: 顯示“FF+成績(jī)”中FF 表示無(wú)效狀態(tài),成績(jī)表示上一次搶答的那個(gè)小組的成績(jī),;顯示“FX+成績(jī)”表示搶答小組答題完并進(jìn)行評(píng)分操作后的組號(hào)和成績(jī),;顯示“XF+成績(jī)”表示違規(guī)搶答的那個(gè)小組組號(hào)及減1分后的成績(jī)信息(X 表示1,2,,3),。這里“+”是為了區(qū)分組號(hào)和成績(jī)信息,數(shù)碼管并不顯示加號(hào),,下同,。
用Verilog HDL 分別編寫(xiě)各個(gè)模塊,然后在ISE 環(huán)境下運(yùn)行程序,,調(diào)試成功,。最后生成的頂層模塊的方塊圖如圖8 所示。
圖8.頂層模塊圖
圖注:Line(2:0)和row(2:0)分別表示參賽小組按鍵的輸入陣列信號(hào)和輸出掃描陣列信號(hào),;start_key,,add_key, sub_key,,分別代表?yè)尨痖_(kāi)始命令,對(duì)各組成績(jī)的加,、減操作命令,;dp,error,,push_key 分別表示開(kāi)始鍵按下后的信號(hào),,違規(guī)搶答信號(hào)以及參賽組有人按鍵的響應(yīng)信號(hào);hc_cp,,hc_si 表示顯示譯碼芯片74HC164 的串行時(shí)鐘和數(shù)據(jù)信號(hào),。
問(wèn)題與解決
1、狀態(tài)機(jī)問(wèn)題
在整體調(diào)試的時(shí)候,,當(dāng)主持人按開(kāi)始按鈕后,,程序就死在那里,不能接收搶答信息,,由于搶答鍵盤(pán)已單獨(dú)調(diào)試成功,,因此懷疑是控制搶答過(guò)程的狀態(tài)機(jī)除了問(wèn)題,,指示進(jìn)入開(kāi)始狀態(tài)的紅色LED燈一直亮著,說(shuō)明程序的確死在開(kāi)始狀態(tài),。再次綜合的過(guò)程中發(fā)現(xiàn)警告提示:狀態(tài)機(jī)的狀態(tài)量的賦值錯(cuò)誤,,把二進(jìn)制標(biāo)識(shí)“b”誤寫(xiě)為“h”,這樣由于狀態(tài)機(jī)數(shù)據(jù)寬度小于時(shí)間數(shù)據(jù)數(shù)據(jù)長(zhǎng)度,,自動(dòng)取較小位數(shù)據(jù),;如state_start = 4‘b0010誤寫(xiě)為state_start = 4’h0010,實(shí)際就是state_start = 4’b0000,,這肯定與前面狀態(tài)沖突,;同時(shí)調(diào)試過(guò)程中也遇到過(guò)復(fù)位時(shí)沒(méi)有把狀態(tài)機(jī)復(fù)位到初始狀態(tài)的情況。經(jīng)過(guò)此次設(shè)計(jì),,體會(huì)認(rèn)識(shí)到狀態(tài)機(jī)在實(shí)際控制中的重要性,,以后設(shè)計(jì)中要學(xué)會(huì)看綜合布線(xiàn)過(guò)程中警告信息。
2,、信號(hào)同步的問(wèn)題
在搶答器按下開(kāi)始鍵后有一個(gè)等待搶答30s 的延遲時(shí)間,,當(dāng)30s 完成后如果三個(gè)小組都沒(méi)有人按搶答鍵,那么此次比賽搶答無(wú)效,,系統(tǒng)自動(dòng)回到主持人按開(kāi)始前的系統(tǒng)等待狀態(tài),;當(dāng)計(jì)時(shí)完成30s 后生成一個(gè)高電平的脈沖信號(hào)(pulse),由于此脈沖信號(hào)高電平持續(xù)時(shí)間是整個(gè)系統(tǒng)的系統(tǒng)時(shí)鐘(clk),,這個(gè)時(shí)鐘周期小于狀態(tài)機(jī)的時(shí)鐘周期(clk_4),,直接用狀態(tài)機(jī)的時(shí)鐘是檢測(cè)不到此脈沖信號(hào),需要把此脈沖信號(hào)同步到與狀態(tài)機(jī)時(shí)鐘同步,。
采用的方法是:首先用一個(gè)鎖存器(pulse_reg)鎖存此脈沖信號(hào)(鎖存器時(shí)鐘也為系統(tǒng)時(shí)鐘),,通過(guò)鎖存器的輸出值和原脈沖信號(hào)寄存器值就可以檢測(cè)到脈沖由低電平0 到高電平1 的跳變沿,同樣用一個(gè)與系統(tǒng)時(shí)鐘同步的鎖存器(flag)鎖存這個(gè)跳變沿,,當(dāng)出現(xiàn)這個(gè)跳變沿時(shí)flag=1;而為了讓狀態(tài)機(jī)時(shí)鐘(clk_4)檢測(cè)到flag 信號(hào),,同時(shí)要在狀態(tài)機(jī)時(shí)鐘檢測(cè)到后要把flag 清零,為下一次檢測(cè)作準(zhǔn)備,,這時(shí)可以當(dāng)狀態(tài)機(jī)時(shí)鐘(clk_4)檢測(cè)到flag=1’b1 后,,同時(shí)生成一個(gè)flag的清零信號(hào)(flag_rst)flag_rst=1’b1;當(dāng)flag_rst 為1 時(shí)把flag 清零。
調(diào)試信號(hào)同步的部分程序如下:
reg flag_rst; //生成flag_rst 信號(hào)
always @ (posedge clk_4 or negedge rst_n)
begin
if(,!rst_n)
begin
flag_rst <= 1‘b0;
end
else
begin
if(flag == 1’b0)
flag_rst <= 1‘b0;
else
begin
flag_rst <= 1’b1;
end
end
end
always @ (posedge clk)
begin
pulse_reg <= pulse;
end
reg flag; //flag 用來(lái)檢測(cè)pulse 上升沿
always @ (posedge clk)
begin
if(,!rst_n)
flag <= 1’b0;
else
begin
if((pulse_reg == 1‘b0)&&(pulse == 1’b1))
flag <= 1‘b1;
else if(flag_rst == 1’b1)
flag <= 1‘b0;
end
end
reg flag_reg; //生成與clk_4 同步的用于檢測(cè)脈沖上升沿信號(hào)的flag 信號(hào)
always @ (posedge clk_4)
begin
flag_reg <= flag;
end
用modesim6.0 仿真波形如下:
圖9.信號(hào)的同步的仿真波形
從仿真波形中可以看出當(dāng)pulse 高電平時(shí)的下一個(gè)時(shí)鐘flag = 1’b1;為了讓時(shí)鐘clk_4 能夠檢測(cè)到flag = 1’b1,就讓flag 一直保存到clk_4 上升沿出現(xiàn),,然后在clk_4 上升沿把flag 的復(fù)位信號(hào)flag_rst 置1,;然后flag, flag_rst都清零。改變pulse 脈沖出現(xiàn)的時(shí)間或者clk_4 的頻率都能檢測(cè)到pulse 的高電平,。經(jīng)過(guò)信號(hào)同步后,,狀態(tài)機(jī)能夠檢測(cè)搶答計(jì)時(shí)完30s 后生成的一個(gè)脈沖信號(hào)然后回到初狀態(tài)。
時(shí)序設(shè)計(jì)是數(shù)字電路電路的主要工作,,在設(shè)計(jì)中一定要明白信號(hào)如何傳遞,,在何時(shí)賦值,何時(shí)信號(hào)值需要改變等,,這樣才能更好的設(shè)計(jì),。在需要改變寄存器值的時(shí)刻沒(méi)有對(duì)寄存器進(jìn)行操作,會(huì)造成結(jié)果的錯(cuò)誤,。
設(shè)計(jì)結(jié)果
根據(jù)搶答器功能要求,,規(guī)劃程序包括的子模塊,并編寫(xiě)Verilog 代碼,,在硬件電路上調(diào)試運(yùn)行成功,。
操作過(guò)程:開(kāi)始時(shí)對(duì),整個(gè)系統(tǒng)復(fù)位(默認(rèn)每組成績(jī)?yōu)?0 分),,數(shù)碼管顯示“FF+10”,。在主持人發(fā)出開(kāi)始搶答的Start 之后,參賽隊(duì)員就可以按自己前面的搶答按鈕,,同時(shí)用數(shù)碼管左邊兩位計(jì)時(shí)搶答時(shí)間30s,,如果在30s 內(nèi)各組都無(wú)人搶答,則此次搶答無(wú)效,,系統(tǒng)自動(dòng)回到開(kāi)始前的初狀態(tài)(數(shù)碼管顯示“FF+成績(jī)”),,等待下一次操作;主持人可根據(jù)回答爭(zhēng)取與否,,以及是否違規(guī)搶答,,決定加減分(Add 為加分控制,Sub 為減分控制),,加減操作后系統(tǒng)又回到開(kāi)始前的等待狀態(tài),。設(shè)計(jì)中,哪個(gè)組搶答,,就顯示哪個(gè)組的信息。如果搶答沒(méi)有違規(guī)(按開(kāi)始后搶答)則顯示器左邊兩位顯示“FX”;反之,,則顯示“XF”,,X 代表組號(hào)1,2,,3,。按照操作方法,以第1 組搶答為例在VX_SP306 開(kāi)發(fā)平臺(tái)上運(yùn)行看看數(shù)碼管顯示及整個(gè)過(guò)程:
1、在系統(tǒng)復(fù)位后顯示“FF+10”;
2,、等待主持人按開(kāi)始狀態(tài),;
3、主持人按開(kāi)始按鈕前第1 組搶答,,顯示“1F+10”,,減1 分操作后顯示“1F+09”;回到步驟2;
4,、主持人按開(kāi)始按鈕后,,顯示“30+10”;30 每秒鐘減1 直到00;
5,、在30s 內(nèi)第1 組搶答,,顯示“F1+10”,主持人根據(jù)回答情況進(jìn)行加,、減分操作,,顯示“F1+分?jǐn)?shù)”;然后回到步驟2,;
6,、如果在30s 內(nèi)沒(méi)有人搶答,顯示“FF+10”,,回到步驟2,。