基于FPGA的超聲波顯示水位距離,通過藍牙傳輸水位數據到手機,同時支持RAM存儲水位數據,讀取數據。

基于FPGA的超聲波顯示水位距離

  • 前言
  • 一、整體框架
  • 二、代碼架構
    • 1.超聲波測距模塊
    • 2.藍牙數據發送模塊
    • 3.數碼管數據切換模塊
    • 4.數碼管驅動模塊
    • 6.串口驅動
    • 7.頂層模塊
    • 8.RAM ip核
  • 仿真相關截圖

前言

隨著工業化進程的加速和環境保護意識的提升,對水資源管理和水位監測的需求日益迫切。傳統的水位監測系統多采用單片機或PLC作為控制核心存在處理速度慢、實時性差、擴展性有限等問題。基于FPGA的水位監測系統以其強大的并行處理能力、高度的靈活性和可重配置性,為水位監測提供了新的解決方案。本課題旨在設計并實現一個基于FPGA的水位監測系統,通過實時采集水位數據,結合先進的數據處理算法,實現高效、準確的水位監測。

本課題聚焦于設計一個基于FPGA的水位監測系統,它通過部署在水源處的傳感器精確獲取水位信息,利用FPGA強大的并行處理能力實時分析數據一旦水位超限立即觸發報警,并上傳數據至監測中心進行記錄和存儲。
1)查找資料對水位監測技術進行了解,提出系統整體設計方案。
2)選擇適合的傳感器模塊、FPGA模塊、通信模塊、顯示塊等進行系統硬件設計。
3)利用自頂向下的設計方法進行系統頂層設計,并分模塊進行FPGA程序設進行軟硬件系統調試。

一、整體框架

硬件需求:FPGA開發板、數碼管模塊、3個按鍵、1個復位按鍵、藍牙模塊、超聲波測距模塊、蜂鳴器模塊

軟件模塊框架:
示例:pandas 是基于NumPy 的一種工具,該工具是為了解決數據分析任務而創建的。

二、代碼架構

(仿真不需要按鍵消抖,同時時間間隔縮小)

1.超聲波測距模塊

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2025/04/12 16:01:55
// Design Name: 
// Module Name: HC_SR04
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//module HC_SR04(input                     sys_clk  ,  input                     rst_n,   //signal  input                     Echo,output     wire    [15:0] Distance,output     reg            Trig_signal);parameter IDLE=4'd0;
parameter SEND=4'd1;
parameter RECIEVE=4'd2;
parameter OVER=4'd3;parameter MAX_CNT=24'd500;
parameter time_1s=32'd50000000;
reg [3:0] state;
reg [3:0] state_1;
reg [23:0] cnt;
reg [31:0] time_cnt;
reg [23:0] distance_temp;
reg key_start;assign Distance=distance_temp/1000;
always @(posedge sys_clk or negedge rst_n)beginif(!rst_n)begintime_cnt<=32'd0;key_start<=1'b0;endelse if(time_cnt<time_1s)begintime_cnt<=time_cnt+1;key_start<=1'b0;endelse if(time_cnt==time_1s)begintime_cnt<=32'd0;key_start<=1'b1;end
endalways @(posedge sys_clk or negedge rst_n)beginif(!rst_n)beginstate<=IDLE;Trig_signal<=1'b0;state_1<=IDLE;distance_temp<=24'd10000000;cnt<=24'd0;endelse begincase(state)IDLE:begincnt<=24'd0;if(key_start==1'b1)beginstate<=SEND;endelse beginstate<=IDLE;endendSEND:beginif(cnt<MAX_CNT)begincnt<=cnt+1;Trig_signal<=1'b1;state<=SEND;endelse begincnt<=16'd0;Trig_signal<=1'b0;state<=RECIEVE;endendRECIEVE:begincase(state_1)IDLE:beginif(Echo==1'b1)beginstate_1<=RECIEVE;  endelse beginstate_1<=IDLE;endendRECIEVE:beginif(Echo==1'b1)begincnt<=cnt+1;  endelse begincnt<=cnt+1;state_1<=OVER;endendOVER:beginstate_1<=IDLE;state<=OVER;enddefault:state_1<=IDLE;endcaseendOVER:begindistance_temp<=cnt*34;state<=IDLE;enddefault:state<=IDLE;endcaseend
endendmodule

2.藍牙數據發送模塊

module Bluetooth_data(input           clk,input           rst_n,input  [3:0]    data_3,input  [3:0]    data_2,input  [3:0]    data_4,input           uart_tx_done,input  [7 :0]   uart_rx_data,input           uart_rx_done,output  reg             uart_tx_en,output  reg     [7:0]   uart_tx_data);parameter IDLE              = 4'd0;parameter WAIT_1s           = 4'd1;parameter SEND              = 4'd2;parameter OVER              = 4'd3;parameter count_max              = 32'd50000000; ////spo2:23.6  ---->  74 65 6D 70 3A 32 33 2E 36 0d 0a//hert:23.6  ---->  68 75 6D 69 3A 32 33 2E 36 0d 0areg  [87:0]   cmd_temp    ={8'h68,8'h20,8'h3a,8'h32,8'h32,8'h2e,8'h33,8'h63,8'h6d,8'h0d,8'h0a};reg  [87:0]   cmd_humi    ={8'h68,8'h20,8'h3a,8'h32,8'h32,8'h2e,8'h33,8'h63,8'h6d,8'h0d,8'h0a};reg	[3: 0]	state;reg	[31:0]	count;reg  [5 :0]   tx_count;reg	[1: 0]	tx_en_count;reg           uart_tx_en_temp;reg	[1 :0]	change_count;wire	[7:0]		bluedata_1;wire	[7:0]		bluedata_2;wire	[7:0]		bluedata_3;assign bluedata_1=(data_4==4'd0)?8'h20:8'h30+data_4;assign bluedata_2=8'h30+data_3;assign bluedata_3=8'h30+data_2;//����??tx_dataalways @(posedge clk or negedge rst_n) beginif(!rst_n) beginuart_tx_data <= 8'd0;endelse if(change_count==2'd0)beginif((state==SEND) && tx_count<8'd3 ) beginuart_tx_data <= cmd_temp[87 - tx_count *8 -:8];endelse if((state==SEND) && tx_count==8'd3 ) beginuart_tx_data <= bluedata_1;endelse if((state==SEND) && tx_count==8'd4 ) beginuart_tx_data <= bluedata_2;endelse if((state==SEND) && tx_count==8'd5 ) beginuart_tx_data <= 8'h3a;endelse if((state==SEND) && tx_count==8'd6 ) beginuart_tx_data <= bluedata_3;endelse if((state==SEND) && tx_count<8'd11 ) beginuart_tx_data <= cmd_temp[87 - tx_count *8 -:8];end	endelse if(change_count==2'd1)beginif((state==SEND) && tx_count<8'd3 ) beginuart_tx_data <= cmd_humi[87 - tx_count *8 -:8];endelse if((state==SEND) && tx_count==8'd3 ) beginuart_tx_data <= bluedata_1;endelse if((state==SEND) && tx_count==8'd4 ) beginuart_tx_data <= bluedata_2;endelse if((state==SEND) && tx_count==8'd5 ) beginuart_tx_data <= 8'h3a;endelse if((state==SEND) && tx_count==8'd6 ) beginuart_tx_data <= bluedata_3;endelse if((state==SEND) && tx_count<8'd11 ) beginuart_tx_data <= cmd_humi[87 - tx_count *8 -:8];end	endend//tx_en timealways @(posedge clk or negedge rst_n) beginif(!rst_n) begintx_en_count <= 2'b0;endelse if((state==SEND) && tx_en_count<2'd1 && tx_count==8'd0) begintx_en_count <=tx_en_count+ 1'd1;endelse if((state==SEND) && tx_en_count==2'd1 && tx_count==8'd0) begintx_en_count <= 2'd3;endelse if(state==OVER)begintx_en_count <= 2'd0;endelse begintx_en_count <= tx_en_count;end
end//����??tx_countalways @(posedge clk or negedge rst_n) beginif(!rst_n) begintx_count <= 8'd0;endelse if(state==SEND) beginif(uart_tx_done==1'd1)tx_count <= tx_count+1'b1;endelse begintx_count <= 8'd0;end
end//����??data_tx_enalways @(posedge clk or negedge rst_n) beginif(!rst_n) beginuart_tx_en_temp <= 1'b0;uart_tx_en <= uart_tx_en_temp;endelse if((state==SEND ) && tx_en_count==1) beginuart_tx_en_temp <= 1'b1;uart_tx_en <= uart_tx_en_temp;endelse if((state==SEND ) && tx_count<8'd10 && uart_tx_done==1)beginuart_tx_en_temp <= 1'b1;uart_tx_en <= uart_tx_en_temp;endelse beginuart_tx_en_temp <= 1'b0;uart_tx_en <= uart_tx_en_temp;endend//state go always @(posedge clk or negedge rst_n) beginif(!rst_n) begincount <= 32'd0;endelse if(state == WAIT_1s && count < count_max)begincount <= count + 32'd1;endelse if(state == WAIT_1s && count == count_max)begincount <= 32'd0;endelse begincount <= count;endend//state go always @(posedge clk or negedge rst_n) beginif(!rst_n) beginstate <= IDLE;change_count<=2'd0;endelse begincase(state)IDLE:beginstate<=WAIT_1s;endWAIT_1s:beginif(count==count_max)beginstate<=SEND;endelse beginstate<=WAIT_1s;endendSEND:beginif(tx_count==6'd11)beginstate <= OVER;endelse beginstate <= SEND;endendOVER:beginstate <= IDLE;if(change_count<2'd1)beginchange_count<=change_count+2'd1;endelse if(change_count==2'd1)beginchange_count<=2'd0;endenddefault:state <= IDLE;endcaseendendendmodule

3.數碼管數據切換模塊

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2025/05/26 14:56:37
// Design Name: 
// Module Name: display_data
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//module display_data(input                     sys_clk  ,  input                     rst_n,   input                     change_key,   input             [15:0]  Distance,input             [15:0]  data_out,output    wire    [3:0]   data_3,output    wire    [3:0]   data_2,output    wire    [3:0]   data_4,output    reg     [3 :0]  display_point,output    reg     [15:0]  display_data);wire [15:0] Distance_temp;wire [15:0] data;wire [3:0]  data_1;
// wire [3:0] data_3;
// wire [3:0] data_2;
// wire [3:0] data_4;reg [1:0] cnt;function [15:0]Hex_to_Doc;
input  [15:0] num_h;
beginHex_to_Doc = num_h[3:0] + num_h[7:4]*16 +num_h[11:8]*256 +num_h[15:12]*4096;
end 
endfunctionassign data=(cnt==2'd0)?Distance:data_out;assign Distance_temp=Hex_to_Doc(data);assign data_1=Distance_temp%10;assign data_2=(Distance_temp%100)/10;assign data_3=(Distance_temp%1000)/100;assign data_4=(Distance_temp/1000);always @(posedge sys_clk or negedge rst_n)beginif(!rst_n)begincnt<=2'd0;endelse if(change_key && cnt<2'd1)begincnt<=cnt+1;endelse if(change_key && cnt==2'd1)begincnt<=2'd0;endendalways @(*)beginif(data_4==4'd0)begindisplay_data<={4'he,data_3,data_2,data_1};display_point<=4'b1111;endelse begindisplay_data<={data_4,data_3,data_2,data_1};display_point<=4'b1111;endendendmodule

4.數碼管驅動模塊

module seg_ctrl( input				clk		,input				rst_n	,input		[15:0]	din		,//????6��???????????????��???????4��input       [3:0]   point_n ,//????��????????��output	reg	[3:0]	sel	,//????��?output	reg	[7:0]	dig  //???????
);								 
//---------<????????>--------------------------------------------------------- parameter TIME_1MS = 50_000;//1ms//????????????????localparam NUM_0 = 7'b100_0000,//0NUM_1 = 7'b111_1001,//1NUM_2 = 7'b010_0100,//NUM_3 = 7'b011_0000,//NUM_4 = 7'b001_1001,//NUM_5 = 7'b001_0010,//NUM_6 = 7'b000_0010,//NUM_7 = 7'b111_1000,//NUM_8 = 7'b000_0000,//NUM_9 = 7'b001_0000,//A     = 7'b000_1000,//B     = 7'b000_0011,//bC     = 7'b100_0110,//OFF   = 7'b111_1111,//???CROSS = 7'b011_1111,//????//D     = 7'b010_0001,//d//E     = 7'b000_0110,//F     = 7'b000_1110;////---------<?????????>-----------------------------------------------------reg			[15:0]	cnt_1ms	   	;//1ms???????????????????????wire				add_cnt_1ms	;wire				end_cnt_1ms	;reg         [3:0]   disp_data   ;//??��??????????????reg                 point_n_r   ;//??��???????????��????//****************************************************************
//--cnt_1ms
//****************************************************************always @(posedge clk or negedge rst_n)begin if(!rst_n)begincnt_1ms <= 'd0;end else if(add_cnt_1ms)begin if(end_cnt_1ms)begin cnt_1ms <= 'd0;endelse begin cnt_1ms <= cnt_1ms + 1'b1;end endend assign add_cnt_1ms = 1'b1;//??????????assign end_cnt_1ms = add_cnt_1ms && cnt_1ms == TIME_1MS - 1;//****************************************************************
//--seg_sel
//****************************************************************always @(posedge clk or negedge rst_n)begin if(!rst_n)beginsel <= 4'b1_110;//?????��???????????��??????end else if(end_cnt_1ms)begin sel <= {sel[2:0],sel[3]};//???????end end//****************************************************************
//--disp_data
//****************************************************************always @(posedge clk or negedge rst_n)begin if(!rst_n)begindisp_data <= 'd0;point_n_r <= 1'b1;end else begin case (sel)4'b1_110 : begin disp_data <= din[3:0]  ; point_n_r <= point_n[0]; end//???��??????????????4'b1_101 : begin disp_data <= din[7:4]  ; point_n_r <= point_n[1]; end4'b1_011 : begin disp_data <= din[11:8] ; point_n_r <= point_n[2]; end4'b0_111 : begin disp_data <= din[15:12]; point_n_r <= point_n[3]; enddefault: disp_data <= 'd0;endcaseend end//****************************************************************
//--seg_dig
//****************************************************************always @(*)begin case (disp_data)0 :  dig = {point_n_r,NUM_0};1 :  dig = {point_n_r,NUM_1};2 :  dig = {point_n_r,NUM_2};3 :  dig = {point_n_r,NUM_3};4 :  dig = {point_n_r,NUM_4};5 :  dig = {point_n_r,NUM_5};6 :  dig = {point_n_r,NUM_6};7 :  dig = {point_n_r,NUM_7};8 :  dig = {point_n_r,NUM_8};9 :  dig = {point_n_r,NUM_9};10 : dig = {point_n_r,A    };11 : dig = {point_n_r,B    };12 : dig = {point_n_r,C    };13 : dig = {point_n_r,CROSS};14 : dig = {point_n_r,OFF  };15 : dig = {point_n_r,F    };default: dig = 8'hff;endcaseendendmodule

6.串口驅動

module uart_top_blue( input            sys_clk  ,   //�?50MHz?��input            sys_rst_n,   //?�?��λ�??�����Ч//UART�?�   input            uart_rxd ,   //UART���??�output           uart_txd ,    //UART���??�input               uart_tx_en,    //UART���������?�output wire         uart_rx_done,    //UART���������?�  output wire         uart_tx_done,    //UART���������?�  input        [7:0]  uart_tx_data,    //UART��������     output wire  [7:0]  uart_rx_data    //UART��������         );//parameter define
parameter CLK_FREQ = 50000000;    //����???��?��
parameter UART_BPS = 9600  ;    //���崮�?�����//wire define
//wire         uart_rx_done;    //UART���������?�
//wire  [7:0]  uart_rx_data;    //UART��������//*****************************************************
//**                    main code
//*****************************************************//���?���?��
uart_rx_blue #(.CLK_FREQ  (CLK_FREQ),.UART_BPS  (UART_BPS))    u_uart_rx_blue(.clk           (sys_clk     ),.rst_n         (sys_rst_n   ),.uart_rxd      (uart_rxd    ),.uart_rx_done  (uart_rx_done),.uart_rx_data  (uart_rx_data));uart_tx_blue #(.CLK_FREQ  (CLK_FREQ),.UART_BPS  (UART_BPS))    u_uart_tx_blue(.clk          (sys_clk     ),.rst_n        (sys_rst_n   ),.uart_tx_en   (uart_tx_en),.uart_tx_data (uart_tx_data),.uart_tx_done (uart_tx_done),.uart_txd     (uart_txd    ),.uart_tx_busy (            ));endmodule
module uart_rx_blue(input               clk         ,  //???��input               rst_n       ,  //??��λ������Чinput               uart_rxd    ,  //UART���??�output  reg         uart_rx_done,  //UART���������?�output  reg  [7:0]  uart_rx_data  //UART���?�������);//parameter define
parameter CLK_FREQ = 100000000;               //???��?��
parameter UART_BPS = 115200  ;               //���?�����
localparam BAUD_CNT_MAX = CLK_FREQ/UART_BPS; //?�?�?�������?���???�?���BPS_CNT��//reg define
reg          uart_rxd_d0;
reg          uart_rxd_d1;
reg          uart_rxd_d2;
reg          rx_flag    ;  //���?��?�?�?�
reg  [3:0 ]  rx_cnt     ;  //�������?�����
reg  [15:0]  baud_cnt   ;  //�����?�����
reg  [7:0 ]  rx_data_t  ;  //�������??���//wire define
wire        start_en;//*****************************************************
//**                    main code
//*****************************************************
//�������??��?���(��?λ)���?�?��?�����?������?�
assign start_en = uart_rxd_d2 & (~uart_rxd_d1) & (~rx_flag);//�����?�??�?������
always @(posedge clk or negedge rst_n) beginif(!rst_n) beginuart_rxd_d0 <= 1'b0;uart_rxd_d1 <= 1'b0;uart_rxd_d2 <= 1'b0;endelse beginuart_rxd_d0 <= uart_rxd;uart_rxd_d1 <= uart_rxd_d0;uart_rxd_d2 <= uart_rxd_d1;end
end//�����?�?��?
always @(posedge clk or negedge rst_n) beginif(!rst_n) rx_flag <= 1'b0;else if(start_en)    //���?��?λrx_flag <= 1'b1; //���?����У���?�?�rx_flag���//��??λ?����?�򣬼����?��?�������?�?�rx_flag���else if((rx_cnt == 4'd9) && (baud_cnt == BAUD_CNT_MAX/2 - 1'b1))rx_flag <= 1'b0;elserx_flag <= rx_flag;
end        //�����??�������?
always @(posedge clk or negedge rst_n) beginif(!rst_n) baud_cnt <= 16'd0;else if(rx_flag) begin     //���?��?���?�������?�������baud_cnt������?������if(baud_cnt < BAUD_CNT_MAX - 1'b1)baud_cnt <= baud_cnt + 16'b1;else baud_cnt <= 16'd0; //�����??�����������?�����end    elsebaud_cnt <= 16'd0;     //���?��?���?����������
end//�?������?�������rx_cnt������
always @(posedge clk or negedge rst_n) beginif(!rst_n) rx_cnt <= 4'd0;else if(rx_flag) begin                  //���?��?���?rx_cnt�?����if(baud_cnt == BAUD_CNT_MAX - 1'b1) //�������?�����������?������������?rx_cnt <= rx_cnt + 1'b1;        //�������?�������1elserx_cnt <= rx_cnt;endelserx_cnt <= 4'd0;                     //���?��?���?����������
end        //����rx_cnt��?�rxd�??�����
always @(posedge clk or negedge rst_n) beginif(!rst_n) rx_data_t <= 8'b0;else if(rx_flag) begin                           //??���?��?���?if(baud_cnt == BAUD_CNT_MAX/2 - 1'b1) begin  //�ж�baud_cnt�?�����������λ���м�case(rx_cnt)4'd1 : rx_data_t[0] <= uart_rxd_d2;   //�?����?�����λ4'd2 : rx_data_t[1] <= uart_rxd_d2;4'd3 : rx_data_t[2] <= uart_rxd_d2;4'd4 : rx_data_t[3] <= uart_rxd_d2;4'd5 : rx_data_t[4] <= uart_rxd_d2;4'd6 : rx_data_t[5] <= uart_rxd_d2;4'd7 : rx_data_t[6] <= uart_rxd_d2;4'd8 : rx_data_t[7] <= uart_rxd_d2;   //�?����???�λdefault : ;endcase  endelserx_data_t <= rx_data_t;endelserx_data_t <= 8'b0;
end        //�����������???��?������?�?
always @(posedge clk or negedge rst_n) beginif(!rst_n) beginuart_rx_done <= 1'b0;uart_rx_data <= 8'b0;end//���������?�����������??λ����baud_cnt������??λ���м�?else if(rx_cnt == 4'd9 && baud_cnt == BAUD_CNT_MAX/2 - 1'b1) beginuart_rx_done <= 1'b1     ;  //��?��������?�uart_rx_data <= rx_data_t;  //����UART���?������?��и�?end    else beginuart_rx_done <= 1'b0;uart_rx_data <= uart_rx_data;end
endendmodule
module uart_tx_blue(input               clk         , //???��input               rst_n       , //??��λ������Чinput               uart_tx_en  , //UART�?���?��input     [7:0]     uart_tx_data, //UART?���?�����output  reg         uart_txd    , //UART���??�output  reg  [3:0]  tx_cnt      ,  //�������?�����output  reg  [15:0] baud_cnt    ,  //�����?�����output  reg         uart_tx_done,output  reg         uart_tx_busy  //����???�?�);//parameter define
parameter CLK_FREQ = 100000000;               //???��?��
parameter UART_BPS = 115200  ;               //���?�����
localparam BAUD_CNT_MAX = CLK_FREQ/UART_BPS; //?�?�?�������?���???�?���BPS_CNT��//reg define
reg  [7:0]  tx_data_t;  //�������??���
//�����??�������?
always @(posedge clk or negedge rst_n) beginif(!rst_n) uart_tx_done<=1'b0;else if(tx_cnt == 4'd9 && baud_cnt == BAUD_CNT_MAX - 1) beginuart_tx_done<=1'b1;end    elseuart_tx_done<=1'b0;     //���?��?���?����������
end//*****************************************************
//**                    main code
//*****************************************************//��uart_tx_en?��?���?������?������?������BUSY�?�
always @(posedge clk or negedge rst_n) beginif(!rst_n) begintx_data_t <= 8'b0;uart_tx_busy <= 1'b0;end//����?��?���?�?���?����?������BUSY�?�else if(uart_tx_en) begintx_data_t <= uart_tx_data;uart_tx_busy <= 1'b1;end//��������??���?��??���?���else if(tx_cnt == 4'd9 && baud_cnt == BAUD_CNT_MAX - 1) begintx_data_t <= 8'b0;     //���?������??���uart_tx_busy <= 1'b0;  //�����BUSY�?�endelse begintx_data_t <= tx_data_t;uart_tx_busy <= uart_tx_busy;end
end//�����??�������?
always @(posedge clk or negedge rst_n) beginif(!rst_n) baud_cnt <= 16'd0;else if(uart_tx_en)  baud_cnt <= 16'd0;      //�����?��?���?�������?�������baud_cnt������?������else if(uart_tx_busy) beginif(baud_cnt < BAUD_CNT_MAX - 1'b1)baud_cnt <= baud_cnt + 16'b1;else baud_cnt <= 16'd0; //�����??�����������?�����end    elsebaud_cnt <= 16'd0;     //���?��?���?����������
end//tx_cnt����
always @(posedge clk or negedge rst_n) beginif(!rst_n) tx_cnt <= 4'd0;else if(uart_tx_en)  tx_cnt <= 16'd0;         else if(uart_tx_busy) begin             //���?��?���?tx_cnt�?����if(baud_cnt == BAUD_CNT_MAX - 1'b1) //�������?�����������?������������?tx_cnt <= tx_cnt + 1'b1;        //�������?�������1elsetx_cnt <= tx_cnt;endelsetx_cnt <= 4'd0;                     //���?��?���?����������
end//����tx_cnt���uart���???�?
always @(posedge clk or negedge rst_n) beginif(!rst_n) uart_txd <= 1'b1;else if(uart_tx_busy) begincase(tx_cnt) 4'd0 : uart_txd <= 1'b0        ; //��?λ4'd1 : uart_txd <= tx_data_t[0]; //����λ����λ4'd2 : uart_txd <= tx_data_t[1];4'd3 : uart_txd <= tx_data_t[2];4'd4 : uart_txd <= tx_data_t[3];4'd5 : uart_txd <= tx_data_t[4];4'd6 : uart_txd <= tx_data_t[5];4'd7 : uart_txd <= tx_data_t[6];4'd8 : uart_txd <= tx_data_t[7]; //����λ����λ4'd9 : uart_txd <= 1'b1        ; //??λdefault : uart_txd <= 1'b1;endcaseendelseuart_txd <= 1'b1;                    //����?���??�?�?�?
endendmodule

7.頂層模塊

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2025/04/20 09:30:52
// Design Name: 
// Module Name: top
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//module top(input                     sys_clk  ,  input                     rst_n,   input                     save_key,input                     read_key,input                     change_key,input                     Echo,   output    wire            Trig_signal,input            		     uart_rxd1 ,   output           		     uart_txd1 ,output	wire	[3:0]	  sel,output	wire	[7:0]	  dig,output	wire			  sim_start,output   wire          Beep);//seg signalwire [15:0] display_data;wire [15:0] Distance;wire [3:0] data_3;wire [3:0] data_2;wire [3:0] data_4;wire            uart_tx_en1; wire            uart_rx_done1; wire            uart_tx_done1; wire  [7:0]     uart_tx_data1; wire  [7:0]     uart_rx_data1; wire  [15:0]		data_out;assign Beep=(Distance<16'd500)?1'b0:1'b1;HC_SR04 u_HC_SR04(.sys_clk(sys_clk)		,.rst_n(rst_n)	,.Echo(Echo)	,.Distance(Distance)	,.sim_start(sim_start),.Trig_signal(Trig_signal)	);display_data u_display_data(.sys_clk(sys_clk)		,.rst_n(rst_n)	,.Distance(Distance)		,.data_out(data_out)		,.change_key(change_key)		,.data_3(data_3)		,.data_2(data_2)		,.data_4(data_4)		,.display_data(display_data)	);ram	u_ram (.address ( 5'd1 ),.clock ( sys_clk ),.data ( Distance ),.rden ( read_key ),.wren ( save_key ),.q ( data_out ));Bluetooth_data u_Bluetooth_data(.clk(sys_clk),   .rst_n(rst_n),   .data_3(data_3)		,.data_2(data_2)		,.data_4(data_4)		,.uart_rx_done  (uart_rx_done1),.uart_rx_data  (uart_rx_data1),.uart_tx_en   (uart_tx_en1),.uart_tx_data (uart_tx_data1),.uart_tx_done (uart_tx_done1)   );uart_top_blue u_uart_top_blue(.sys_clk(sys_clk)  ,   .sys_rst_n(rst_n),   .uart_rx_done  (uart_rx_done1),.uart_rx_data  (uart_rx_data1),.uart_tx_en   (uart_tx_en1),.uart_tx_data (uart_tx_data1),.uart_tx_done (uart_tx_done1),.uart_rxd(uart_rxd1) ,  .uart_txd(uart_txd1)    );seg_ctrl u_seg_ctrl( .clk(sys_clk)		,.rst_n(rst_n)	,.din(display_data),.point_n(4'b1011) ,.sel(sel)	,.dig(dig)  
);	endmodule

8.RAM ip核

在這里插入圖片描述

仿真相關截圖

在這里插入圖片描述
仿真沒有按鍵消抖,測距時間間隔縮短一點,其他正常。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/86230.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/86230.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/86230.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

OD 算法題 B卷【水果攤小買賣】

文章目錄 水果攤小買賣 水果攤小買賣 小王手里有點閑錢&#xff0c;想做點水果買賣&#xff0c;給出兩個數組m, n&#xff0c; m[i]表示第i個水果的成本價&#xff0c;n[i]表示第i個水果能賣出的價格&#xff1b;假如現在有本錢k&#xff0c;試問最后最多能賺多少錢&#xff1…

(新手友好)MySQL學習筆記(6):分組查詢,正則表達式

目錄 分組查詢 創建分組 過濾分組 分組查詢練習 正則表達式 匹配單個實例 匹配多個實例 正則表達式練習 練習答案 分組查詢練習答案 正則表達式練習答案 分組查詢 創建分組 group by 子句&#xff1a;根據一個或多個字段對結果集進行分組&#xff0c;在分組的字段上…

Android 之 kotlin 語言學習筆記四(Android KTX)

一、Android KTX 簡介 Android KTX 是包含在 Android Jetpack 及其他 Android 庫中的一組 Kotlin 擴展程序。KTX 擴展程序可以為 Jetpack、Android 平臺及其他 API 提供簡潔的慣用 Kotlin 代碼。為此&#xff0c;這些擴展程序利用了多種 Kotlin 語言功能&#xff0c;其中包括&…

云原生思維重塑數字化基座:從理念到實踐的深度剖析

&#x1f4dd;個人主頁&#x1f339;&#xff1a;慌ZHANG-CSDN博客 &#x1f339;&#x1f339;期待您的關注 &#x1f339;&#x1f339; 一、引言&#xff1a;云原生為何成為數字化的“基礎設施語言”&#xff1f; 隨著5G、人工智能、物聯網等技術逐步進入規模化落地階段&am…

【C/C++】STL實現版本為什么比手寫版本高?

文章目錄 為什么標準庫版本效率更高&#xff1f;1 具體介紹1.1 **內聯優化&#xff08;Inlining&#xff09;和模板展開**1.2 **分支預測友好&#xff08;Branch Prediction&#xff09;**1.3 **迭代器解耦 靜態分發**1.4 **代碼緊湊&#xff0c;編譯器優化空間大**1.5 **高質…

35.成功解決編寫關于“江協科技”編寫技巧第二期標志位積累的問題

江科大學長又發布了第二期的編寫技巧&#xff01; 大家可以看看&#xff1a;https://space.bilibili.com/383400717 最后面給了一個未完成的任務&#xff1a; 這里我已經把這個問題給解決了&#xff01; 總代碼放在資源里面&#xff0c;key.c放在文章最后面&#xff01;同時感…

STM32什么是寄存器

提示&#xff1a;文章 文章目錄 前言一、背景二、2.12.2 三、3.1 總結 前言 前期疑問&#xff1a; 1、什么是寄存器&#xff1f; 答&#xff1a;在4GB的地址空間中&#xff0c;512MB的block2上&#xff0c;每4個字節組成32位&#xff0c;這個32位為一個單元&#xff0c;控制&a…

【Pinia】Pinia和Vuex對比

Pinia 是 Vue 官方團隊成員專門開發的一個全新狀態管理庫&#xff0c;并且 Vue 的官方狀態管理庫已經更改為了 Pinia。 在 Vuex 官方倉庫中也介紹說可以把 Pinia 當成是不同名稱的 Vuex 5&#xff0c;這也意味不會再出 5 版本了。 優點 1. 更加輕量級&#xff0c;壓縮后提交只…

通過 Ansible 在 Windows 2022 上安裝 IIS Web 服務器

拓撲結構 這是一個用于通過 Ansible 部署 IIS Web 服務器的實驗室拓撲。 前提條件&#xff1a; 在被管理的節點上安裝WinRm 準備一張自簽名的證書 開放防火墻入站tcp 5985 5986端口 準備自簽名證書 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…

Oracle雙平面適用場景討論會議

4月28日&#xff0c;我在杭州組織召開了Oracle雙平面會議討論沙龍。在國產化數據庫浪潮的今天&#xff0c;Oracle數據庫作為國產數據庫的應急庫&#xff0c;在國產數據庫發生故障或者性能下降時&#xff0c;如何更好的使用Oracle。會議主題如下&#xff1a; 1、背景與痛點速覽&…

10.Linux進程信號

1. 理解信號 信號VS信號量 老婆&#xff1a;老婆餅-》沒有任何關系&#xff01;信號&#xff1a;鬧鐘&#xff0c;上課鈴聲&#xff0c;臉色...人-》進程&#xff1b;信號中斷人正在做的事&#xff0c;是一種事件的異步通知機制&#xff1b; 我們自習一會&#xff0c;等張三回…

求解插值多項式及其余項表達式

例 求滿足 P ( x j ) f ( x j ) P(x_j) f(x_j) P(xj?)f(xj?) ( j 0 , 1 , 2 j0,1,2 j0,1,2) 及 P ′ ( x 1 ) f ′ ( x 1 ) P(x_1) f(x_1) P′(x1?)f′(x1?) 的插值多項式及其余項表達式。 解&#xff1a; 由給定條件&#xff0c;可確定次數不超過3的插值多項式。…

C++刷題:日期模擬(1)

&#xff08;注&#xff1a;本文所展示代碼均為本人所寫&#xff0c;不一定為最優&#xff09; 我們首先用純邏輯和手動計算來拆解日期模擬題&#xff0c;再來代碼實現&#xff0c;看看這些問題的底層思路怎么玩明白&#xff5e; 一、基礎日期計算&#xff1a;直接算“過幾天是…

深入剖析Nginx:從入門到高并發架構實戰

深入剖析Nginx&#xff1a;從入門到高并發架構實戰 摘要&#xff1a;本文全面解析Nginx的核心功能、架構原理及實戰配置&#xff0c;涵蓋負載均衡、反向代理、動靜分離等高級應用場景&#xff0c;助你構建高性能Web服務架構。 一、Nginx是什么&#xff1f;為什么它如此重要&…

Qt客戶端技巧 -- 窗口美化 -- 圓角窗口

不解析&#xff0c;直接給代碼例子 利用窗口重繪事件處理函數paintEvent main.cpp #include <QtCore/qglobal.h> #if QT_VERSION > 0x050000 #include <QtWidgets/QApplication> #else #include <QtGui/QApplication> #endif#include "roundedwin…

Three.js學習筆記-三要素

Three.js 學習筆記-三要素 一、Three.js 簡介 (一)前世今生 Three.js 是一款運行在瀏覽器中的 3D 引擎,由 Ricardo Cabello(Mr.doob)在 2010 年 4 月于 GitHub 首次發布 。其起源可追溯到本世紀初,代碼最初用 ActionScript 編寫,2009 年移植到 JavaScript。隨著 Web…

動力電池點焊機:驅動電池焊接高效與可靠的核心力量|比斯特自動化

在新能源汽車與儲能設備需求激增的背景下&#xff0c;動力電池的制造工藝直接影響產品性能與安全性。作為電芯與極耳連接的核心設備&#xff0c;點焊機如何平衡效率、精度與可靠性&#xff0c;成為電池企業關注的重點。 動力電池點焊機的核心功能是確保電芯與極耳的穩固連接。…

OpenCV CUDA模塊圖像處理------創建一個模板匹配(Template Matching)對象函數createTemplateMatching()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 創建一個用于在 GPU 上執行模板匹配的 TemplateMatching 對象。 該函數返回一個指向 TemplateMatching 的智能指針&#xff08;Ptr&#xff09;…

natapp 內網穿透失敗

連不上網絡錯誤調試排查詳解 - NATAPP-內網穿透 基于ngrok的國內高速內網映射工具 如何將DNS服務器修改為114.114.114.114_百度知道 連不上/錯誤信息等問題解決匯總 - NATAPP-內網穿透 基于ngrok的國內高速內網映射工具 nslookup auth.natapp.cnping auth.natapp.cn

游戲(game)

題目描述 小明最近迷上了一款游戲&#xff0c;并且很想成為這款游戲的高手&#xff0c;這款游戲需要用 資源來買裝備。他剛開始的資源價值為0,于是他每天都會做日常任務來獲得價值為1的資源。 這款游戲中有每日商店&#xff0c;小明已經提前知道了接下來n天會出現的裝備&#x…