整合超声测距模块和OV7670模块

2019-03-25 07:28发布

我已经完成O7670模块了 ,现在有超声测距模块的代码,需要大神帮忙整合一下,可以通过编译。
module wireless(iclk,trig,echo,data6,data7,hummer);                  
input
iclk,                      //时钟是50ns,即20MHz
echo;                      //回响信号输出
output
trig,                      //超声波模块触发信号输入
hummer;                    //我的开发板上的蜂鸣器
output [5:0]data6;         //数码管位选
output [7:0]data7;         //数码管段选
reg trig;
reg [7:0]cnt;              //计数器,计250个50ns,12.5us,为echo提供时序
reg [13:0] cnt1;           //计数器,计8000个12.5us,100ms
//无cnt2和data5
reg [7:0]cnt3;             //计数124个时钟周期是1mm
reg [7:0] dis[9:0];        //数码管显示的数字
reg [3:0]                  //数码管需要显示的数字
data1,                     //个位,mm
data2,                     //十位,cm
data3,                     //百位,dm
data4;                     //千位,m
reg[5:0]data6;             //数码管位选寄存器
reg [7:0]data7;            //数码管段选寄存器
reg[1:0]cnt4;              //控制数码管依次闪亮的计数器
reg
echo_buf,                  //echo的上一个时钟的状态
echo_rising,               //捕捉echo的上升沿
echo_falling,              //捕捉echo的下降沿
flag1;                     //echo为高电平时flag1会是1,低电平时会是0
reg clk;                   //数码管显示所需的时钟
reg[3:0] cnt5;             //用于产生数码管显示用的时钟的分频器

assign hummer = 1'b1;      //让我的开发板上的蜂鸣器关闭,否则它会一直响

//显示存储器初始化
initial
begin
dis[0] = 8'hc0;
dis[1] = 8'hf9;
dis[2] = 8'ha4;
dis[3] = 8'hb0;
dis[4] = 8'h99;
dis[5] = 8'h92;
dis[6] = 8'h82;
dis[7] = 8'hf8;
dis[8] = 8'h80;
dis[9] = 8'h90;
end

//产生echo控制信号250*8000*50ns,echo高电平持续12.5us,即250个时钟周期
always@(posedge iclk)                  
begin
if(cnt == 249)
cnt <= 1'b0;
else
cnt <= cnt +1;
end

always@(posedge iclk)
begin
if(cnt == 249)
if(cnt1 == 7999)
begin
trig <= 1'b1;
cnt1 <= 1'b0;
end
else
begin
trig <= 1'b0;
cnt1 <= cnt1 + 1'b1;
end
end

//捕捉trig上升沿与下降沿,并产生标志位
always@(posedge iclk)
begin
echo_buf <= echo;
echo_rising <= echo & (~echo_buf);
echo_falling <= (~echo) & echo_buf;
end
always@(posedge iclk)
begin
if(echo_rising == 1'b1)
begin
flag1 = 1'b1;                       //echo已经变为高电平
end
else if(echo_falling == 1'b1)
begin
flag1 = 1'b0;                       //echo已经变为低电平
end
end

//在flag1 = 1 期间计时,即对时钟进行计数。(4m的距离会是25ms,1mm是125个时钟周期)
always@(posedge iclk)
begin
if(flag1 == 1'b1)
begin
if(cnt3 == 124)                     //1mm
cnt3 <= 1'b0;
else
cnt3 <= cnt3 + 1'b1;
end
else if(echo_rising == 1'b1)
cnt3 <= 1'b0;
end

always@(posedge iclk)
begin
if(flag1 == 1'b1)
begin
if(cnt3 == 124)
if(data1 == 9)                      //1cm
data1 <= 4'd0;
else
data1 <= data1 + 1'b1;
end
else if(echo_rising == 1'b1)
data1 <= 1'b0;
end

always@(posedge iclk)
begin
if(flag1 == 1'b1)
begin
if(data1 == 9 && cnt3 == 124)
if(data2 == 9)                     //1dm
data2 <= 1'b0;
else
data2 <= data2 + 1'b1;
end
else if(echo_rising == 1'b1)
data2 <= 1'b0;
end

always@(posedge iclk)
begin
if(flag1 == 1'b1)
begin
if(data2 == 9 && data1 == 9 && cnt3 == 124)
if(data3 == 9)                    //1m
data3 <= 1'b0;
else
data3 <= data3 + 1'b1;
end
else if(echo_rising == 1'b1)
data3 <= 1'b0;
end

always@(posedge iclk)
begin
if(flag1 == 1'b1)
begin
if(data3 == 9 && data2 == 9 && data1 == 9 && cnt3 == 124)
if(data4 == 9)                     //说明书上最远是测距4m
data4 <= 1'b0;
else
data4 <= data4 + 1'b1;
end
else if(echo_rising == 1'b1)
data4 <= 1'b0;
end


//产生显示用的时钟信号
always@(posedge iclk)
begin
if(cnt5 == 5)
begin
clk = ~clk;
cnt5 = 1'b0;
end
else
cnt5 = cnt5 + 1'b1;
end

//00-11为一个周期,每个周期点亮一个数码管
always@(posedge clk)
begin
cnt4 = cnt4 + 1'b1;
end



//我的板上共有6个数码管,让其中4个数码管显示四位数字,单位是毫米。
always@(posedge clk)
begin
if(flag1 == 1'b0)
case(cnt4)
2'b00:
begin
data7 = dis[data1];
data6 = 6'b111110;
end
2'b01:
begin
data7 = dis[data2];
data6 = 6'b111101;
end
2'b10:
begin
data7 = dis[data3];
data6 = 6'b111011;
end
2'b11:
begin
data7 = dis[data4];
data6 = 6'b110111;
end
default: ;
endcase
else
begin
data7 = dis[0];
data6 = 6'b110000;
end
end

endmodule

以上是超声测距模块的代码
谢谢各位大神了!!!!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。