FPGA-基于chipscope的超声波测距调试

 

 调整chipscope数据顺序:(引荐博文)

https://blog.****.net/rill_zhen/article/details/8115756

引言

索性再破例一下,成个系列也行。

 

内容组织

1.建立工程 
2.插入及配置核 
2.1运行Synthesize 
2.2新建cdc文件 
2.3 ILA核的配置 
3. Implement and generate programming file 
4.利用Analyzer观察信号波形 
4.1连接器件 
4.2下载配置fpga 
4.3载入信号端口名 
4.4设置触发信号 
4.5运行并观察信号波形 
补充 

 

 


1. 建立工程
ChipScope是配合Xilinx Ise使用的片内逻辑分析工具,使用的第一步是建立ise工程文件,详细步骤可参考ise使用说明。如果已有建好的ise工程,可跳过此步骤,打开已有工程即可。
建立工程时注意正确添加.v源文件和.ucf管脚配置文件。

2. 插入及配置核
        这里介绍的是ICON核和ILA核的使用方法。ILA核提供触发和跟踪功能,根据用户设置的触发条件捕获数据;然后在ICON的控制下,通过边界扫描口将数据上传到PC;最后在Analyzer中显示出信号波形。

2.1 运行Ise的Synthesize
          单击选中sources栏中的顶层源文件,右键点击processs栏中的Synthesize,点击Run,进行代码综合。
      FPGA-基于chipscope的超声波测距调试


2.2 新建cdc文件
          右键单击sources栏中顶层源文件,点击new source,选择chipscope definition and connection file,设好文件名及文件路径,勾选add to project,然后一直点next完成建立。
 FPGA-基于chipscope的超声波测距调试

2.3 核的配置
          双击sources栏中的刚刚建立的cdc文件,启动core inserter。点击两次next,进入ILA的设置界面,首先是trigger parameters界面。

          弹出netlist changed的提示框,点选ok刷新网表。通过number of input trigger ports可设置要观察波形的组数,通过trigger width可设置每组观察的信号的数目。
 FPGA-基于chipscope的超声波测距调试
          
点击next进入capture parameters界面。通过data depth可设置信号采集的时钟周期数,采集数目越多,观察信号的时间越长。
    FPGA-基于chipscope的超声波测距调试
              点击next进入net connections界面。可以看到net connections端口列表显示红色字体,表示端口没有完全连接;当全部端口都与具体信号连接时,字体变为黑色。
              双击clock ports打开select net对话框。首先连接时钟信号,在右边net selections框中点clock signals,选择时钟的信道CH0,在左下方的信号列表中找到时钟信号,单击选中,然后单击右下方make connections按钮,完成clk信号的连接。

 FPGA-基于chipscope的超声波测距调试
          
          在右边net selections框中点trigger/data signals,用同样的方法连接所有想要观察的信号。如果之前设置观察多组信号,可点击右下方TP0/TP1切换信号组。连接完成后点击下方OK退出select net对话框,然后点击return to project navigator退出core inserter,并保存设置。
 FPGA-基于chipscope的超声波测距调试


3. Implement和Generate Programming File
        单击选中sources框中顶层源文件,运行processes框中的Implement。注意,如果Implement过程中报错端口连接不完全,应返回ILA配置检查端口是否全部连接。
        右键单击Generate Programming File,点击properties,在startup options中将start-up clock设为JTAG clock,点击ok。
        运行Generate Programming File,生成.bit文件。
 FPGA-基于chipscope的超声波测距调试

4. 利用Analyzer观察信号波形
        运行process框中的analyze design using chipscope,进入chipscope pro analyzer。
     
4.1 连接器件
        单击左上角file下面的图标,连接到器件,弹出对话框选ok。
 FPGA-基于chipscope的超声波测距调试

4.2 下载配置fpga
        右键点击my device1(即fpga芯片),单击configure,弹出对话框,点select new file,选择之前生成的.bit文件,点击ok,之后程序将把design下载到fpga。
 FPGA-基于chipscope的超声波测距调试

4.3 载入信号端口名
        单击file->import,点击select new file选中cdc文件,然后点击ok。此时可以看到端口列表中的端口名称都变成了对应的信号名称。

 FPGA-基于chipscope的超声波测距调试

4.4 设置触发信号
       双击trigger setup打开触发信号设置框,在value栏中可设置开始信号采集的触发信号值,其中每一位对应一个端口,按照端口顺序排列。例如图中设置为端口0(cle)为1,并且端口7(clk)为0时开始采集信号。X表示任意值。
 FPGA-基于chipscope的超声波测距调试

4.5 运行并观察波形
        单击左上角三角形按钮启动fpga电路,当各端口信号满足设置的触发信号时,程序开始采集信号,并在waveform中显示采集到的信号。可通过左上角的一系列控制按钮调节波形显示。
 FPGA-基于chipscope的超声波测距调试

 

补充:
1、 当对源文件进行过修改后需重新运行Synthesize、Implement、Generate programming file,生成.bit文件,并在chipscope analyzer中通过configure重新加载.bit文件。

 

FPGA-基于chipscope的超声波测距调试

超声波时序图

FPGA-基于chipscope的超声波测距调试
以上时序图表明你只需要提供一个 10uS 以上脉冲触发信号,该模块内部将发出 8 个 40kHz 周期电平并检测回波。一旦检测到有回波信号则输出回响信号 。回响信号的脉冲宽度与所测的距离成正比。由此通过发射信号到收到的回响信号时间间隔可以计算得到距离。公式:uS/58=厘米或者 uS/148=英寸;或是:

距离=高电平时间*声速(346M/S)(室温下)/2;建议测量周期为 60ms 以上,以防止发射信号对回响信号的影响。
注 :

1 、 此模块不宜带电连接 , 若要带电连接 , 则先让模块的  GND  端先连接 , 否则会影响
模块的正常工作。

2 、测距时,被测物体的面积不少于  5 0.5  平方米且平面尽量要求平整,否则影响测量的
结果

FPGA-基于chipscope的超声波测距调试

TOP.V:

module top(ext_clk_25m,ext_rst_n,ultrasound_trig,ultrasound_echo,led
    );
	input ext_clk_25m;
	input ext_rst_n;
	input ultrasound_echo;
	output ultrasound_trig;
	output led;
	
	wire clk_12m5;
	wire clk_25m;
	wire clk_50m;
	wire clk_100m;
	wire sys_rst_n;
	pll uut_pll
   (// 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
	
	wire clk_100khz_en;
	clk_100khz_en uut_clk_100khz_en(
	.clk(clk_25m),
	.rst_n(sys_rst_n),
	.clk_100khz_en(clk_100khz_en)
    );
	
	sound uut_sound(
	.clk(clk_25m),
	.rst_n(sys_rst_n),
	.clk_100khz_en(clk_100khz_en),
	.ultrasound_trig(ultrasound_trig),
	.ultrasound_echo(ultrasound_echo)
    );
	wire ultrasound_echo_r;
	IBUF #(
		.IOSTANDARD("DEFAULT")
	)
	IBUF_inst(
		.O(ultrasound_echo_r),
		.I(ultrasound_echo)
	);
	assign led =ultrasound_echo;
endmodule

这里不写IBUF这个不能通过chipscope检测到

clk_100khz_en.v:

module clk_100khz_en(clk,rst_n,clk_100khz_en
    );
	input clk;
	input rst_n;
	output clk_100khz_en;
	
	reg [7:0] cnt;
	[email protected](posedge clk or negedge rst_n)begin
		if(rst_n==1'b0)begin
			cnt<=1'b0;
		end
		else if(cnt==8'd249)begin
			cnt<=1'b0;
		end
		else begin
			cnt<=cnt+1'b1;
		end
	end
	assign clk_100khz_en=(cnt==8'd249);
endmodule

 sound.v:

module sound(clk,rst_n,clk_100khz_en,ultrasound_trig,ultrasound_echo
    );
	input clk;
	input rst_n;
	input clk_100khz_en;
	input ultrasound_echo;//回响信号
	output ultrasound_trig;//脉冲激励信号
	
	reg [16:0]timer_cnt;
	[email protected](posedge clk or negedge rst_n)begin
		if(rst_n==1'b0)begin
			timer_cnt<=1'b0;
		end
		else if(clk_100khz_en==1'b1)begin
			if(timer_cnt<17'd99_999)begin
				timer_cnt<=timer_cnt+1'b1;
			end
			else begin
				timer_cnt<=1'b0;
			end
		end
		else begin
			timer_cnt<=timer_cnt;
		end
	end
	assign ultrasound_trig=(timer_cnt==1'b1)?1'b1:1'b0;//每隔一秒产生一次脉冲
	
		
endmodule

FPGA-基于chipscope的超声波测距调试