调整chipscope数据顺序:(引荐博文)
https://blog.csdn.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.2 新建cdc文件
右键单击sources栏中顶层源文件,点击new source,选择chipscope definition and connection file,设好文件名及文件路径,勾选add to project,然后一直点next完成建立。
2.3 核的配置
双击sources栏中的刚刚建立的cdc文件,启动core inserter。点击两次next,进入ILA的设置界面,首先是trigger parameters界面。
弹出netlist changed的提示框,点选ok刷新网表。通过number of input trigger ports可设置要观察波形的组数,通过trigger width可设置每组观察的信号的数目。
点击next进入capture parameters界面。通过data depth可设置信号采集的时钟周期数,采集数目越多,观察信号的时间越长。
点击next进入net connections界面。可以看到net connections端口列表显示红色字体,表示端口没有完全连接;当全部端口都与具体信号连接时,字体变为黑色。
双击clock ports打开select net对话框。首先连接时钟信号,在右边net selections框中点clock signals,选择时钟的信道CH0,在左下方的信号列表中找到时钟信号,单击选中,然后单击右下方make connections按钮,完成clk信号的连接。
在右边net selections框中点trigger/data signals,用同样的方法连接所有想要观察的信号。如果之前设置观察多组信号,可点击右下方TP0/TP1切换信号组。连接完成后点击下方OK退出select net对话框,然后点击return to project navigator退出core inserter,并保存设置。
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文件。
4. 利用Analyzer观察信号波形
运行process框中的analyze design using chipscope,进入chipscope pro analyzer。
4.1 连接器件
单击左上角file下面的图标,连接到器件,弹出对话框选ok。
4.2 下载配置fpga
右键点击my device1(即fpga芯片),单击configure,弹出对话框,点select new file,选择之前生成的.bit文件,点击ok,之后程序将把design下载到fpga。
4.3 载入信号端口名
单击file->import,点击select new file选中cdc文件,然后点击ok。此时可以看到端口列表中的端口名称都变成了对应的信号名称。
4.4 设置触发信号
双击trigger setup打开触发信号设置框,在value栏中可设置开始信号采集的触发信号值,其中每一位对应一个端口,按照端口顺序排列。例如图中设置为端口0(cle)为1,并且端口7(clk)为0时开始采集信号。X表示任意值。
4.5 运行并观察波形
单击左上角三角形按钮启动fpga电路,当各端口信号满足设置的触发信号时,程序开始采集信号,并在waveform中显示采集到的信号。可通过左上角的一系列控制按钮调节波形显示。
补充:
1、 当对源文件进行过修改后需重新运行Synthesize、Implement、Generate programming file,生成.bit文件,并在chipscope analyzer中通过configure重新加载.bit文件。
超声波时序图
以上时序图表明你只需要提供一个 10uS 以上脉冲触发信号,该模块内部将发出 8 个 40kHz 周期电平并检测回波。一旦检测到有回波信号则输出回响信号 。回响信号的脉冲宽度与所测的距离成正比。由此通过发射信号到收到的回响信号时间间隔可以计算得到距离。公式:uS/58=厘米或者 uS/148=英寸;或是:
距离=高电平时间*声速(346M/S)(室温下)/2;建议测量周期为 60ms 以上,以防止发射信号对回响信号的影响。
注 :
1 、 此模块不宜带电连接 , 若要带电连接 , 则先让模块的 GND 端先连接 , 否则会影响
模块的正常工作。
2 、测距时,被测物体的面积不少于 5 0.5 平方米且平面尽量要求平整,否则影响测量的
结果
TOP.V:
moduletop(ext_clk_25m,ext_rst_n,ultrasound_trig,ultrasound_echo,led ); inputext_clk_25m; inputext_rst_n; inputultrasound_echo; outputultrasound_trig; outputled; wireclk_12m5; wireclk_25m; wireclk_50m; wireclk_100m; wiresys_rst_n; plluut_pll(//Clockinports .CLK_IN1(ext_clk_25m), //IN//Clockoutports .CLK_OUT1(clk_12m5), //OUT .CLK_OUT2(clk_25m), //OUT .CLK_OUT3(clk_50m), //OUT .CLK_OUT4(clk_100m), //OUT//Statusandcontrolsignals .RESET(~ext_rst_n),//IN .LOCKED(sys_rst_n)); //OUTwireclk_100khz_en; clk_100khz_enuut_clk_100khz_en( .clk(clk_25m), .rst_n(sys_rst_n), .clk_100khz_en(clk_100khz_en) ); sounduut_sound( .clk(clk_25m), .rst_n(sys_rst_n), .clk_100khz_en(clk_100khz_en), .ultrasound_trig(ultrasound_trig), .ultrasound_echo(ultrasound_echo) ); wireultrasound_echo_r; IBUF#( .IOSTANDARD("DEFAULT") )IBUF_inst( .O(ultrasound_echo_r), .I(ultrasound_echo) ); assignled=ultrasound_echo; endmodule
这里不写IBUF这个不能通过chipscope检测到
clk_100khz_en.v:
moduleclk_100khz_en(clk,rst_n,clk_100khz_en ); inputclk; inputrst_n; outputclk_100khz_en; reg [7:0] cnt; always@(posedgeclkornegedgerst_n)beginif(rst_n==1'b0)begincnt<=1'b0;endelseif(cnt==8'd249)begincnt<=1'b0;endelsebegincnt<=cnt+1'b1;endendassignclk_100khz_en=(cnt==8'd249);endmodule
sound.v:
modulesound(clk,rst_n,clk_100khz_en,ultrasound_trig,ultrasound_echo ); inputclk; inputrst_n; inputclk_100khz_en; inputultrasound_echo;//回响信号outputultrasound_trig;//脉冲激励信号reg [16:0]timer_cnt; always@(posedgeclkornegedgerst_n)beginif(rst_n==1'b0)begintimer_cnt<=1'b0;endelseif(clk_100khz_en==1'b1)beginif(timer_cnt<17'd99_999)begintimer_cnt<=timer_cnt+1'b1;endelsebegintimer_cnt<=1'b0;endendelsebegintimer_cnt<=timer_cnt; endendassignultrasound_trig=(timer_cnt==1'b1)?1'b1:1'b0;//每隔一秒产生一次脉冲endmodule