距离计算:
还是先给出程序之后在简单解释吧。
顶层模块:
/
//工程硬件平台: Xilinx Spartan 6 FPGA
/
//每100ms产生1个超声波测距模块所需的10us高脉冲激励,并用数码管以10进制数据显示最终经过换算后的距离信息(单位mm)
module sp6(
input ext_clk_25m, //外部输入25MHz时钟信号
input ext_rst_n, //外部输入复位信号,低电平有效
output ultrasound_trig, //超声波测距模块脉冲激励信号,10us的高脉冲
input ultrasound_echo, //超声波测距模块回响信号
output[3:0] dtube_cs_n, //7段数码管位选信号
output[7:0] dtube_data //7段数码管段选信号(包括小数点为8段)
);
//-------------------------------------
//PLL例化
wire clk_12m5; //PLL输出12.5MHz时钟
wire clk_25m; //PLL输出25MHz时钟
wire clk_50m; //PLL输出50MHz时钟
wire clk_100m; //PLL输出100MHz时钟
wire sys_rst_n; //PLL输出的locked信号,作为FPGA内部的复位信号,低电平复位,高电平正常工作
pll_controller uut_pll_controller
(// Clock in ports
.CLK_IN1(ext_clk_25m), // IN
// Clock out ports
.CLK_OUT1(clk_12m5), // OUT
.CLK_OUT2(clk_25m), // OUT
.CLK_OUT3(clk_50m), // OUT
.CLK_OUT4(clk_100m), // OUT
// Status and control signals
.RESET(~ext_rst_n),// IN
.LOCKED(sys_rst_n)); // OUT
//-------------------------------------
//25MHz时钟进行分频,产生一个100KHz频率的时钟使能信号
wire clk_100khz_en; //100KHz频率的一个时钟使能信号,即每10us产生一个时钟脉冲
clkdiv_generation uut_clkdiv_generation(
.clk(clk_25m), //时钟信号
.rst_n(sys_rst_n), //复位信号,低电平有效
.clk_100khz_en(clk_100khz_en) //100KHz频率的一个时钟使能信号,即每10us产生一个时钟脉冲
);
//-------------------------------------
//每100ms产生一个10us的高脉冲作为超声波测距模块的激励
wire[15:0] echo_pulse_num; //以10us为单位对超声波测距模块回响信号高脉冲进行计数的最终值
wire echo_pulse_en; //超声波测距模块回响信号计数值有效信号
ultrasound_controller uut_ultrasound_controller(
.clk(clk_25m), //时钟信号
.rst_n(sys_rst_n), //复位信号,低电平有效
.clk_100khz_en(clk_100khz_en), //100KHz频率的一个时钟使能信号,即每10us产生一个时钟脉冲
.ultrasound_trig(ultrasound_trig), //超声波测距模块脉冲激励信号,10us的高脉冲
.ultrasound_echo(ultrasound_echo), //超声波测距模块回响信号
.echo_pulse_en(echo_pulse_en), //超声波测距模块回响信号计数值有效信号
.echo_pulse_num(echo_pulse_num) //以10us为单位对超声波测距模块回响信号高脉冲进行计数的最终值
);
//-------------------------------------
//缓存最近采集到的8组超声波测距回响脉冲计数值,对它们进行累加并求平均
wire[15:0] echo_pulse_filter_num; //滤波处理后的超声波测距模块回响信号高脉冲计数值
filter uut_filter(
.clk(clk_25m), //时钟信号
.rst_n(sys_rst_n), //复位信号,低电平有效
.echo_pulse_en(echo_pulse_en), //超声波测距模块回响信号计数值有效信号
.echo_pulse_num(echo_pulse_num), //以10us为单位对超声波测距模块回响信号高脉冲进行计数的最终值
.echo_pulse_filter_num(echo_pulse_filter_num) //滤波处理后的超声波测距模块回响信号高脉冲计数值
);
//-------------------------------------
//换算出超声波测距的实际距离,并且以十进制,单位mm形式输出
wire[15:0] echo_pulse_f_mul_num; //以10us为单位对超声波测距模块回响信号高脉冲进行计数的最终值,换算为实际距离的10进制数据
distance_compute uut_distance_compute(
.clk(clk_25m), //时钟信号
.rst_n(sys_rst_n), //复位信号,低电平有效
.echo_pulse_filter_num(echo_pulse_filter_num), //以10us为单位对超声波测距模块回响信号高脉冲进行计数的最终值
.echo_pulse_f_mul_num(echo_pulse_f_mul_num) //以10us为单位对超声波测距模块回响信号高脉冲进行计数的最终值,换算为实际距离的10进制数据
);
//-------------------------------------
//4位数码管显示驱动
seg7 uut_seg7(
.clk(clk_25m), //时钟信号
.rst_n(sys_rst_n), //复位信号,低电平有效
.display_num(echo_pulse_f_mul_num), //显示数据
.dtube_cs_n(dtube_cs_n), //7段数码管位选信号
.