實(shí)驗(yàn)一基于fpga設(shè)計的人體反應(yīng)速度測試器 一.實(shí)驗(yàn)內(nèi)容與要求: 在DE2 fpga開發(fā)板上實(shí)現(xiàn)一個人體反應(yīng)速度測試電路。 1)測試器復(fù)位電路; 2)復(fù)位一段時間后紅燈點(diǎn)亮(用LED指示燈),計數(shù)器開始以毫秒為單位計數(shù)(計數(shù)值顯示在數(shù)碼管上)。 3) 測試人發(fā)現(xiàn)紅燈點(diǎn)亮后,迅速按住KEY1鍵,紅燈熄滅。計數(shù)器停止計數(shù),得到測試人反映時間。 4)等待時間值要求可設(shè)置,由按鍵或開關(guān)設(shè)置等待時間。
0.png (40.88 KB, 下載次數(shù): 110)
下載附件
2016-10-11 18:05 上傳
反映速度測試器所有資料打包下載:
反映速度測試器.rar
(2.5 MB, 下載次數(shù): 49)
2016-10-11 18:06 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
- module respone_time(clk,rst,dataout,en,led,key,key_start);
- input clk,rst,key,key_start;
- output led;
- output[7:0] dataout; //數(shù)碼管的段碼輸出
- output[3:0] en; //數(shù)碼管的位選使能輸出
- reg[7:0] dataout; //各段數(shù)據(jù)輸出
- reg[3:0] en;
- reg[15:0] cnt_scan;//掃描頻率計數(shù)器
- reg[3:0] dataout_buf;
-
- reg[18:0] cnt; //計數(shù)寄存器
- always @ (posedge clk or negedge rst)
- if (!rst) cnt <= 19'd0; //異步復(fù)位
- //else if(key_an) cnt <=20'd0;//發(fā)現(xiàn)按鍵按下,重新計數(shù)
- else if(cnt==19'd500000)
- cnt <= 19'd0;
- else cnt <= cnt + 1'b1;
-
- reg[9:0] postphone; //計數(shù)寄存器
- always @ (posedge clk or negedge rst)
- if (!rst)
- postphone <= 10'd0; //異步復(fù)位
- else if(cnt==19'd500000)
- postphone <= postphone+1'b1;
- else if (postphone==10'd1000)
- postphone <=10'd0;
-
- reg low_sw;
- always @(posedge clk or negedge rst)
- if (!rst) low_sw <= 1'b1;
- else if (cnt == 19'd500000) //滿20ms,將按鍵值鎖存到寄存器low_sw中 cnt == 20'hfffff
- low_sw <= key;
-
- reg low_sw_r; //每個時鐘周期的上升沿將low_sw信號鎖存到low_sw_r中
- always @ ( posedge clk or negedge rst)
- if (!rst) low_sw_r <= 1'b1;
- else low_sw_r <= low_sw;
-
- //當(dāng)寄存器low_sw由1變?yōu)?時,led_ctrl的值變?yōu)楦撸S持一個時鐘周期
- wire led_ctrl = low_sw_r & ( ~low_sw);
- reg key_st;
- always @(posedge clk or negedge rst)
- if (!rst) key_st <= 1'b1;
- else if (cnt == 19'd500000)
- key_st <= key_start;
- reg key_st_r; //每個時鐘周期的上升沿將low_sw信號鎖存到low_sw_r中
- always @ ( posedge clk or negedge rst )
- if (!rst) key_st_r <= 1'b1;
- else key_st_r <= key_st;
- //當(dāng)寄存器key_rst由1變?yōu)?時,led_an的值變?yōu)楦撸S持一個時鐘周期
- wire key_start_an = key_st_r & ( ~key_st);
- reg led1;
- //reg flag;
- always @ (posedge clk or negedge rst)
- if (!rst)
- begin
- led1 <= 1'b0;
- //flag <= 1'b0;
- end
- else if((postphone==10'd60)||(postphone==10'd190)||(postphone==10'd280)||(postphone==10'd450)||(postphone==10'd650)||(postphone==10'd750)||(postphone==10'd900))//(postphone==9'd150)&&(flag == 1'b0)
- begin
- led1 <= 1'b1;
- //flag <= 1'b1;
- end
- else if ( led_ctrl)
- led1 <=1'b0; //led1 <= ~led1 某個按鍵值變化時,LED將做亮滅翻轉(zhuǎn)
- assign led = led1;//assign led = led1 ? 1'b1 : 1'b0; //LED翻轉(zhuǎn)輸出
-
- reg[12:0] respone;//數(shù)值顯示
- always@(posedge clk or negedge rst)
- if(!rst)
- begin
- respone<=13'd0;
- end
- else if(led1 ==1'b1)
- begin
- if(cnt==19'd500000)
- respone <= respone+1'b1;
- end
- else if(key_start_an)
- respone<=13'd0;
- always@(posedge clk or negedge rst)//數(shù)碼管掃描模塊
- begin
- if(!rst)
- cnt_scan<=16'd0;
- else
- cnt_scan<=cnt_scan+1'b1;
- end
- always @(cnt_scan)
- begin
- case(cnt_scan[15:13])
- 3'b000 :
- en = 4'b1110;//位選低電平有效
- 3'b001 :
- en = 4'b1101;
- 3'b010 :
- en = 4'b1011;
- 3'b011 :
- en = 4'b0111;
- default :
- en = 4'b1110;
- endcase
- end
- always@(en) //對應(yīng)COM信號給出各段數(shù)據(jù)
- begin
- case(en)
- 4'b1110:
- dataout_buf=20*respone%10000/1000;
- 4'b1101:
- dataout_buf=20*respone%1000/100;
- 4'b1011:
- dataout_buf=20*respone%100/10;
- 4'b0111:
- dataout_buf=20*respone%10;
- default:;
- endcase
- end
- always@(dataout_buf)
- begin
- case(dataout_buf)
- 4'b0000:
- dataout=8'b1100_0000;////共陰0x3f,
- 4'b0001:
- dataout=8'b1111_1001;//0x06,
- 4'b0010:
- dataout=8'b1010_0100;//0x5b,
- 4'b0011:
- dataout=8'b1011_0000;//0x4f,
- 4'b0100:
- dataout=8'b1001_1001;//0x66,
- 4'b0101:
- dataout=8'b1001_0010;//0x6d,
- 4'b0110:
- dataout=8'b1000_0010;//0x7d,
- 4'b0111:
- dataout=8'b1111_1000;//0x07,
- 4'b1000:
- dataout=8'b1000_0000;//0x7f,
- 4'b1001:
- dataout=8'b1001_1000;//0x6f,
- default:;
- endcase
- end
- endmodule
復(fù)制代碼 |