项目要求:
超声波模块测出的距离显示在数码管上
产生时钟使能信号的模块:
`timescale 1ns / 1ps
//产生1us为周期的时钟使能信号
//1us/20ns=50,div_cnt内部计数周期为0~49
module vlg_en(
input sys_clk ,
input rst_n ,
output reg clk_en //clk_en的时钟周期为1us
);
reg [7:0] div_cnt ;
//对输入时钟sys_clk做分频计数,产生1us的时钟使能信号
always @(posedge sys_clk )
if(!rst_n)
div_cnt <= 0 ;
else if ( div_cnt == 50 )
div_cnt <= 0 ;
else
div_cnt <= div_cnt +1 ;
//产生时钟使能信号
always@(posedge sys_clk )
if(!rst_n)
clk_en <= 0 ;
else if ( div_cnt == 49 )
clk_en <= 1 ;
else
clk_en <= 0 ;
endmodule
产生trig信号的模块
`timescale 1ns / 1ps
module vlg_trig(
input sys_clk ,
input rst_n ,
input clk_en , //1us为周期的时钟使能信号
output reg trig
);
parameter trig_50000 = 16'd50_000 ;
reg [16:0] trig_cnt ; // T=50ms t=1us 50ms/1us = 50000 位宽是16
//trig_cnt计满50ms
always@(posedge sys_clk)
if(!rst_n)
trig_cnt <= 0 ;
else if ( clk_en == 1 && trig_cnt == trig_50000 -1 )
trig_cnt <= 0 ;
else if ( clk_en == 1 )
trig_cnt <= trig_cnt +1 ;
else
trig_cnt <= trig_cnt ;
//产生保持10us的高脉冲trig信号
always@(posedge sys_clk)
if (!rst_n)
trig <= 0 ;
else if ( trig_cnt > 0 && trig_cnt < 4'd10)
trig <= 1 ;
else
trig <= 0 ;
endmodule
对echo信号高脉冲计时
`timescale