名稱:Quartus超聲波測(cè)距設(shè)計(jì)verilog代碼青創(chuàng)QC-FPGA開發(fā)板
軟件:Quartus
語言:Verilog
代碼功能:
超聲波測(cè)距設(shè)計(jì):
控制超聲波測(cè)距模塊,數(shù)碼管顯示測(cè)量結(jié)果,單位mm
FPGA代碼Verilog/VHDL代碼資源下載:www.hdlcode.com
本代碼已在青創(chuàng)QC-FPGA開發(fā)板驗(yàn)證,青創(chuàng)QC-FPGA開發(fā)板如下,其他開發(fā)板可以修改管腳適配:
演示視頻:
設(shè)計(jì)文檔:
1. 超聲波測(cè)距原理
超聲波模塊采用HC-SR04
超聲波測(cè)距模塊工作原理
(1)采用IO口trig觸發(fā)測(cè)距,給至少10us的高電平信號(hào)(本代碼設(shè)計(jì)為15us);
(2)模塊自動(dòng)發(fā)送8個(gè)40khz的方波,自動(dòng)檢測(cè)是否有信號(hào)返回;
(3)有信號(hào)返回,通過IO口echo輸出一個(gè)高電平,高電平持續(xù)的時(shí)間就是超聲波從發(fā)射到返回的時(shí)間。測(cè)試距離=(高電平時(shí)間*聲速(340M/S))/2;
(4)本模塊使用方法簡(jiǎn)單,一個(gè)控制口發(fā)一個(gè)10US以上的高電平,就可以在接收口等待高電平輸出。一有輸出就可以開始計(jì)時(shí),當(dāng)此口變?yōu)榈碗娖綍r(shí)停止計(jì)時(shí),根據(jù)計(jì)時(shí)值即可算出距離。
2. 工程文件
3. 程序文件
4. 程序編譯
5. RTL圖
6. Testbench
7. 仿真圖
整體仿真圖
上圖為整體仿真圖即整體仿真圖的局部放大圖,可以看到發(fā)出trig觸發(fā)信號(hào),給至少10us的高電平信號(hào),然后從echo端口接收到一段高電平。測(cè)出的距離值通過數(shù)碼管顯示。
超聲波測(cè)距模塊
可以看到發(fā)出trig觸發(fā)信號(hào),給15us的高電平信號(hào),然后從echo端口接收到一段高電平,對(duì)高電平的時(shí)間進(jìn)行計(jì)時(shí),計(jì)數(shù)值為10000,一個(gè)計(jì)數(shù)為20ns,10000即對(duì)應(yīng)200000ns,換算出的距離值為34mm。
數(shù)碼管顯示模塊
將距離值進(jìn)行顯示,4個(gè)數(shù)碼管依次選通(低電平選通),顯示距離值的千、百、十、個(gè)位。圖中距離34mm顯示為0034。
部分代碼展示:
//超聲波測(cè)距模塊 module?Ultrasonic?( input?clk_50M, input?reset_n, input?echo,//接收距離高電平 output?reg?trig,//發(fā)送15us脈沖 output?[15:0]?distance//輸出距離 ); reg?[31:0]?clk_10Hz_count=32'd0; always@(posedge?clk_50M) if(reset_n==0) clk_10Hz_count<=32'd0; else if(clk_10Hz_count>=32'd5000000)//計(jì)數(shù)5000000次就是5000000分頻,50MHz分頻到10Hz clk_10Hz_count<=32'd0; else clk_10Hz_count<=clk_10Hz_count+32'd1; always@(posedge?clk_50M) if(reset_n==0) trig<=0; else if(clk_10Hz_count>32'd1?&&?clk_10Hz_count<32'd750)//750*20ns=15000ns=15us trig<=1;//發(fā)送15us高電平 else trig<=0; reg?[31:0]?echo_count=32'd0; reg?[31:0]?echo_count_buf=32'd0; reg?echo_buf1=0; reg?echo_buf2=0; always@(posedge?clk_50M) begin echo_buf1<=echo; echo_buf2<=echo_buf1; end wire?echo_posedge;//echo信號(hào)上升沿 assign?echo_posedge=echo_buf1?&?~echo_buf2; always@(posedge?clk_50M) if(echo_posedge)begin echo_count<=32'd0; echo_count_buf<=echo_count;//緩存echo高電平計(jì)數(shù) end else if(echo_buf2==1)begin echo_count<=echo_count+32'd1; echo_count_buf<=echo_count_buf; end assign?distance=echo_count_buf*34/10000; endmodule
點(diǎn)擊鏈接獲取代碼文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=377