「每周FPGA案例」基於FPGA的超聲波測距系統設計

2020-08-27 明德揚FPGA科教

本文為明德揚原創及錄用文章,轉載請註明出處!
1.1 總體設計
1.1.1 概述
學習了明德揚至簡設計法和明德揚設計規範,本人用FPGA設計了一個測距系統。該系統採用超聲波進行測量距離再在數碼管上顯示。在本案例的設計過程中包括了超聲波的驅動、三線式數碼管顯示等技術。經過逐步改進、調試等一系列工作後,最終完成了此設計,並進行上板驗證,下面將完整的設計記錄與大家分享。
1.1.2 設計目標
此系統將實時顯示前方障礙與裝置之間的距離。
1.1.3 系統結構框圖
系統結構框圖如下所示:

1.1.4 模塊功能
hc_sr04模塊實現功能:
該模塊通過控制觸發信號trig(10us的TTL)使內部循環發出8個40KHZ脈衝即驅動超聲波,接收回響信號echo,通過echo得到距離。


顯示模塊實現功能:
該模塊完成了對所測距離通過數碼管對其顯示。


1.1.5頂層信號



1.1.6頂層代碼

module top( clk , rst_n , echo , trig , sel, seg ); input clk ; input rst_n ; input echo ; output trig ; wire [3:0] s_g ; wire [3:0] s_s ; wire [3:0] s_b ; wire [3:0] s_q ; output [7:0] sel ; output [7:0] seg ; hc_sr04 hc_sr04_1( .clk (clk) , .rst_n (rst_n) , .echo (echo) , .trig (trig) , .s_g (s_g ), .s_s (s_s ), .s_b (s_b ), .s_q (s_q ) ); seg_disp u_seg_disp( .clk (clk ), .rst_n (rst_n), .segment_data({s_q,s_b,s_s,s_g}), .segment (seg ), .seg_sel (sel ) ); endmodule



1.2 hc_sr04模塊設計
1.2.1 接口信號


1.2.2 設計思路
我們只需要提供一個短期的10uS脈衝觸發信號trig,該模塊內部將發出8個40kHz周期電平並檢測回波,一旦檢測到有回波信號則輸出迴響信號,迴響信號echo是一個脈衝的寬度成正比的距離變量,可通過發射信號到收到的迴響信號時間間隔可以計算得到距離。建議測量周期為60ms以上,以防止發射信號對迴響信號的影響,這裡我們採用的是1s測量一次。


時鐘計數器cnt0:用於計算 1 秒的時鐘個數,加一條件為1,表示一直計數;結束條件為數到 TIME_1S ,表示數到 1 秒就清零。


距離計數器 h_cnt:用於計算flag為高電平的寬度的時間,如果flag為1,h_cnt就加一;每完成1秒計數後h_cnt就變為0,此外h_cnt等於h_cnt。


模塊時序圖


1.2.3 參考代碼

module hc_sr04(    clk    ,    rst_n  ,    echo   ,    trig   ,    s_g    ,    s_s    ,    s_b    ,    s_q          );       parameter      DATA_W = 14  ;        parameter                 TIME_1S = 50_000_000;    input               clk     ;    input               rst_n   ;    input               echo    ;    output              trig    ;    output[ 3:0]        s_g     ;        output[ 3:0]        s_s     ;        output[ 3:0]        s_b     ;        output[ 3:0]        s_q     ;                 wire                trig    ;    reg   [ 3:0]        s_g     ;        reg   [ 3:0]        s_s     ;        reg   [ 3:0]        s_b     ;        reg   [ 3:0]        s_q     ;        reg   [DATA_W-1:0]  distance;             reg   [25:0]        cnt0    ;    reg   [20:0]        h_cnt   ;    reg                 echo_2  ;    reg                 echo_1  ;    wire                add_cnt0;    wire                end_cnt0;             wire                flag_h  ;    wire                flag_l  ;                        always @(posedge clk or negedge rst_n)begin        if(!rst_n)begin            cnt0 <= 0;        end        else if(add_cnt0)begin            if(end_cnt0)                cnt0 <= 0;            else                cnt0 <= cnt0 + 1&39;b0)begin            echo_1 <= 0;            echo_2 <= 0;        end        else begin            echo_1 <= echo  ;            echo_2 <= echo_1;        end    end    always @(posedge clk or negedge rst_n)begin        if(!rst_n)begin            h_cnt <= 0;        end        else if(add_h_cnt)begin            if(end_h_cnt)                h_cnt <= 0;            else                h_cnt <= h_cnt + 1;        end        else if(end_cnt0)begin            h_cnt <= 0;        end    end    assign add_h_cnt = echo_2;           assign end_h_cnt = 0 ;           always  @(posedge clk or negedge rst_n)begin        if(rst_n==1&39;b0)begin            s_g <= 0;        end        else begin            s_g <= distance%10;        end    end    always  @(posedge clk or negedge rst_n)begin        if(rst_n==1&39;b0)begin            s_b <= 0;        end        else begin            s_b <= (distance/100)%10;        end    end    always  @(posedge clk or negedge rst_n)begin        if(rst_n==1&39;b1100_0000          ;parameter   ONE            =   8&39;b1010_0100          ;parameter   THREE          =   8&39;b1001_1001          ;parameter   FIVE           =   8&39;b1000_0010          ;parameter   SEVEN          =   8&39;b1000_0000          ;parameter   NINE           =   8&39;b0)begin        segment <= ZERO;    end    else begin        case(segment_tmp)            4&39;d1:segment <= ONE  ;            4&39;d3:segment <= THREE;            4&39;d5:segment <= FIVE ;            4&39;d7:segment <= SEVEN;            4&39;d9:segment <= NINE ;            default:begin                segment <= segment;            end        endcase    endendalways  @(posedge clk or negedge rst_n)begin    if(rst_n==1&39;b1111_1111;    end    else begin        seg_sel <= ~(8'b1<<delay_time);    endendendmodule



1.4 效果和總結


上板驗證效果

在FPGA實驗箱上的效果


在MP801開發板上的效果


在點撥開發板上的效果



在這個設計中,使用明德揚的至簡設計法,讓我的思路非常清晰,邏輯非常嚴謹,雖然沒有做到一遍成功,但在調試過程中我都比較快速的找到問題,並快速解決。對於學習FPGA的同學,我非常推薦使用明德揚至簡設計法和明德揚模塊進行學習和設計。

詳細的教學視頻和工程原始碼請移步明德揚論壇學習!


感興趣的朋友也可以訪問明德揚論壇(http://www.fpgabbs.cn/)進行FPGA相關工程設計學習,也歡迎大家在評論與我進行討論!
也可以看一下我們往期的文章:

《基於FPGA的密碼鎖設計》

《波形相位頻率可調DDS信號發生器》

《基於FPGA的曼徹斯特編碼解碼設計》

《基於FPGA的計程車計費系統》

《數電基礎與Verilog設計》《基於FPGA的頻率、電壓測量》

《基於FPGA的漢明碼編碼解碼設計》

《關於鎖存器問題的討論》

《阻塞賦值與非阻塞賦值》

《參數例化時自動計算位寬的解決辦法》


1.15公司簡介
明德揚是一家專注於FPGA領域的專業性公司,公司主要業務包括開發板、教育培訓、項目承接、人才服務等多個方向。

點撥開發板——學習FPGA的入門之選。
MP801開發板——千兆網、ADDA、大容量SDRAM等,學習和項目需求一步到位。

網絡培訓班——不管時間和空間,明德揚隨時在你身邊,助你快速學習FPGA。

周末培訓班——明天的你會感激現在的努力進取,升職加薪明德揚來助你。

就業培訓班——七大企業級項目實訓,獲得豐富的項目經驗,高薪就業。

專題課程——高手修煉課:提升設計能力;

實用調試技巧課:提升定位和解決問題能力;

FIFO架構設計課:助你快速成為架構設計師;

時序約束、數位訊號處理、PCIE、綜合項目實踐課等你來選。

項目承接——承接企業FPGA研發項目。人才服務——提供人才推薦、人才代培、人才派遣等服務。

相關焦點

  • 基於FPGA的八通道超聲探傷系統設計
    摘要:文中提出了一種基於FPGA的八通道超聲探傷系統設計方案。該系統利用低功耗可變增益運放和八通道ADC構成高集成度的前端放大和數據採集模塊;採用FPGA和ARM作為數位訊號處理的核心和人機互動的通道。
  • 「每周FPGA案例」至簡設計系列_BCD解碼實現
    在前面的案例中已經有串口接收模塊的介紹,所以這裡不在過多介紹,詳細介紹請看下方連結:http://www.fpgabbs.cn/forum.php?在前面的案例中已經有數碼管顯示的介紹,所以這裡不在過多介紹,詳細介紹請看下方連結:http://fpgabbs.com/forum.php?
  • 基於nRF24L01+與Arduino的超聲波測距系統設計
    本文引用地址:http://www.eepw.com.cn/article/201610/308661.htm1 系統結構超聲波測距系統由發射端和接收端兩部分組成。發射端由Arduino開發板、無線射頻發射模塊、天線、超聲波模塊及電源模塊組成。接收端由Arduino開發板、無線射頻接收模塊、天線和終端設備等組成。
  • 基於SoC+FPGA平臺快速動態加載驅動開發及實現
    摘要:以TI公司的OMAP-L138型號雙核處理器單片系統(SoC)與ALTERA公司 EP3C80F484型號FPGA為核心的嵌入式硬體平臺,介紹了SoC與FPGA通過高速SPI接口實現固件動態加載的方法,以及基於Linux的SoC對FPGA快速動態加載驅動程序開發的原理及步驟。
  • 基於FPGA技術的全方位移動機器人運動控制系統的方案設計
    本文研究了一種用FPGA技術實現三輪全方位移動機器人運動控制系統的方法,與雙DSP結構,DSP+CPLD結構,以及DSP+專用集成電路結構等相比,該方法具有簡單可靠,擴展性強等特點。且FPGA設計簡單,使用方便,開發周期短,能夠實現真正的SOPC系統。
  • 基於FPGA的RS232行列式矩陣鍵盤接口設計
    一、引言本文引用地址:http://www.eepw.com.cn/article/245960.htm本方案是用VHDL語言來實現的基於RS232按位串行通信總線的行列式矩陣鍵盤接口電路,具有復位和串行數據的接收與發送功能,根據發光二極體led0
  • 一種基於FPGA的視頻圖像畫面分割器設計
    最後,按照數字視頻圖像的數據格式,將四路視頻圖像合成一路編碼輸出,實現了四路視頻圖像分割的功能,提高了系統集成度,並可根據系統需要修改設計和進一步擴展功能,增加了系統的靈活性,適用於多種不同領域。本文引用地址:http://www.eepw.com.cn/article/236794.htm隨著計算機、DSP、超大規模集成電路等技術的發展,畫面分割器開始採用硬體設計。
  • 基於FPGA的Gzip解壓縮硬體設計
    fpga相關文章:fpga是什麼
  • 基於SYN6288的超聲波語音測距拐杖的設計
    本文採用STC89C52R單片機,結合超聲波測距技術設計導盲杖,並通過語音合成晶片SYN6288實現文本到語音的直接轉換,無需預先錄製,通過外置揚聲器提醒盲人前方道路情況,實現語音導盲功能。TTS轉換過程是先將文字序列轉換成音韻序列,再由系統根據音韻序列生成語音波形。這個過程涉及語言學處理和韻律處理,目前實現這個過程較好的途徑是,把基於規則的波形拼接技術和參數語音合成方法結合起來。2 系統設計2.1 硬體設計硬體電路主要由數據採集電路、數據處理電路、語音合成輸出電路以及系統電源四部分組成,其硬體結構如圖1所示。
  • 基於Modelsim FLI接口的FPGA仿真技術
    除此之外,Modelsim還能夠與 C 語言一起實現對 HDL 設計文件的協同仿真。同時,相對於大多數的 HDL 仿真軟體來說,Modelsim 在仿真速度上也有明顯優勢。這些特點使 Modelsim 越來越受到 EDA設計者、尤其是 FPGA 設計者的青睞。
  • 基於FPGA的高速PID控制器設計與仿真
    其設計技術成熟,長期以來形成了典型的結構,參數整定方便,結構更改靈活,能滿足一般控制的要求。  採用這種結構設計的控制系統,其性能只能與原連續控制系統性能接近而不會超過,逼近的精度與被變換的連續數學模型大小及採樣周期長短有關 [1]。特別是在高速運動控制的情況下,採樣周期的影響更大,採樣周期相對較長時,逼近程度才較好,但是對PID控制算法的運算速度及迴路的調節時間等也 提出了更高的要求。
  • 基於Arduino的超聲測距系統的設計
    本文引用地址:http://www.eepw.com.cn/article/256964.htmArduino是目前較為流行的電子互動平臺,基於嵌入式系統開發,具有使用簡單,功能多樣,價格低廉等優點,廣泛應用於電子系統設計和互動產品開發方面。
  • 超聲波測距的原理和超聲波測距系統的電路設計詳細概述
    打開APP 超聲波測距的原理和超聲波測距系統的電路設計詳細概述 佚名 發表於 2019-11-09 10:32:19 由於超聲波指向性強
  • 基於FPGA的司機眼球跟蹤疲勞檢測報警系統
    基於FPGA的司機眼球跟蹤疲勞報警系統可以很好的解決上述問題,且相較於傳統的DSP實現具有集成度高、處理速度快、功能更強大、方便改進內部設計等諸多優點。1、研究意義視頻實時跟蹤作為一個應用性研究方向,其應用愈加廣泛,如軍事、航空、防盜、視頻會議等場合,特別是重要場合的安檢系統成為新的應用領域。
  • 基於FPGA+Python的定點平方根實現
    Python是一種簡單易學並且功能強大的程式語言,並具有強大的軟硬體描述能力,MyHDL採用Python擴展包的形式使其能支持硬體設計和仿真並在仿真結果符合要求後可將軟體算法自動轉換為相應的Verilog 或VHDL硬體描述。本文試圖採用這種新的基於Python的軟硬體設計方法在FPGA上實現定點平方根。
  • 使用MATLAB和Simulink算法創建FPGA原型(二)
    對於DDC案例研究而言,可以在55秒內生成了5780行HDL代碼。工程師可以瀏覽並很快理解代碼(圖7)。自動代碼生成功能允許工程師對系統級模型進行更改,並且,通過重新生成HDL代碼,該功能可以在數分鐘之內生成更新的HDL實現方案。
  • 基於太陽能和超聲波測距技術實現導盲器的設計
    基於太陽能和超聲波測距技術實現導盲器的設計 吳飛斌,張晉平,陳 發表於 2020-04-12 17:22:00 引言 為了更好地幫助盲人行走,各科研機構研製了各種電子導盲設備
  • 基於FPGA的實時中值濾波器硬體實現
    文獻[7]為了提高紅外成像跟蹤器設計了大窗口的中值濾波器。文獻[3]、[4]提出了鄰域圖像幀存的存儲結構,該結構充分利用了圖像幀存的數據結構轉換特性,並行高速提供鄰域圖像數據,配以FPGA作為並行處理器,高速實時地實現了中值濾波。但是以上研究都是基於標清圖像的中值濾波器,處理的圖像大小一般為256×256、512×512的灰度圖等,很少有實現高清圖像的中值濾波器。
  • fpga應用領域_fpga應用三個主要方向
    4)FPGA是ASIC電路中設計周期最短、開發費用最低、風險最小的器件之一。   5) FPGA採用高速CHMOS工藝,功耗低,可以與CMOS、TTL電平兼容。   可以說,FPGA晶片是小批量系統提高系統集成度、可靠性的最佳選擇之一。那麼fpga的應用領域有哪些呢?主要的方向又是什麼呢?具體的跟隨小編來了解一下。
  • 基於FPGA的通用CNN加速設計
    過早地執著於fpga的技術細節容易護士許多的細節。現在software define network/flash/xxx,已然大勢所趨。   WHEN?深度學習異構計算現狀   隨著網際網路用戶的快速增長,數據體量的急劇膨脹,數據中心對計算的需求也在迅猛上漲。