第12周实验---基于FPGA的超声波测距

在这里插入图片描述
距离计算:
在这里插入图片描述
还是先给出程序之后在简单解释吧。

顶层模块:

/
//工程硬件平台: 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段数码管位选信号
				
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值