ISE软件硬件调试
硬件调试是FPGA开发中非常重要的一环,能够占据开发周期的40%。本文主要是利用ISE的Chipscope插件进行硬件调试,侧重基本功能。
目录
内置逻辑分析仪
ISE内部集成了逻辑分析仪,在线逻辑分析仪会占用一定数量的内部逻辑资源,如块 RAM、查找表、触发器等等。
在线逻辑分析仪的功能称为 Chipscope,以 IP 核的形式被加入设计中。有两种插入方式,core inserter ,直接创建IP核,以及core generator,需要例化之后才能使用。前者缺点是步骤比较繁杂,每换一个工程就需要重新生成一个IP核,每次编译时间都比较长。后者的优点就是可以拷贝,直接把.v文件拷贝,例化时改一下端口即可用到下一个工程。
代码优化
ISE在编译时会根据自己的算法对代码进行优化,把认为对工程影响不大或者没有作为输出的一些信号给优化掉,这样在ChipScope中就看不到这个信号。解决办法:
1.输出
新定义一个输出信号
module flow_led(
input sys_clk , //系统时钟
input sys_rst_n, //系统复位,低电平有效
output reg [3:0] led, //4个LED灯
output [23:0] counter_1 //定义一个输出
);
//reg define
reg [23:0] counter;
assign counter_1 = counter; //给输出赋值
2.添加KEEP TRUE语句
Edit——Language Templates——Synthesis Constructs——Attributes——Synthesis——Keep/Preserve a Signal (KEEP)——复制 (* KEEP=“TRUE” *)语句到指定语句之前。
3.Sythesize的Keep Hierarchy
Sythesize之前需要对Sythesize Properties做调整,把Keep Hierarchy改为Yes,这样在ChipScope中信号会有一种层次性,代码被优化的可能性就变低。
创建文件,放在prj文件夹中。
打开.cdc文件,连续next直到以下界面,Trigger Width为要监测的端口个数,此处流水灯为4个,但是如果工程大,不知道多少个,就用256,到后面把想抓取的信号全部添加完成后还可以再回到这步修改。
Match Type:触发类型,选择Basic w/edges
(参考正点原子) 然后再next:
在这个页面双击这两个红色的,选择相应的信号。
注意TRIGGER PORTS选择的时候,
然后,此时,还是红色,因为Trigger Width不对,回到之前界面改成4就可以了。(clk的不计入数)
然后,对原来的rtl文件即.V文件全编译,生成bit流文件,用ChipScope下载到开发板中即可。
core inserter在线调试
下载bit流文件到开发板
1.点击左上角按钮,匹配硬件
2.configure,下载bit流文件。
这种方法主要是第二种,我们只看弹窗的下半部分,直接点击OK即可。
在线调试
- 图中标号1处为 Value 触发条件设置;Radix 为信号显示的进制,默认二进制;
- Depth 采样深度,表示一共抓取多少个数据;
- 图中标号2处为Position 偏移量,默认情况是 0,但是最好设置一个偏移量,例如设置300,表示的是把触发条件满足之前的300个数据和触发条件满足之后的724(1024-300)个数据显示到波形窗中,这样就可以捕捉到在触发之前的部分信息,有助于问题的定位。
打开Listing,没有数据,这时按下图添加进去。
core generator 插入例化IP核
1.创建例化IP核
1.创建ILA文件
然后生成generate,等待一段时间即可。
2.创建ICON文件
其他工程中,可以直接复制这个文件夹。然后add source把.V添加进去即可。
3.例化
先选中icon,
将这段代码复制到流水灯的rtl文件中,
然后再选择ILA文件,同样操作,最后效果如下(重命名)。
//最终完整代码,例化部分已标注
module flow_led(
input sys_clk , //系统时钟
input sys_rst_n, //系统复位,低电平有效
output reg [3:0] led //4个LED灯
);
//reg define
reg [23:0] counter;
**********例化部分1**********
//wire define
wire [35:0] CONTROL0;
wire [255:0] TRIG0;
**********例化部分1**********
//*****************************************************
//** main code
//*****************************************************
**********例化部分2**********
assign TRIG0 [3:0] = led;
**********例化部分2**********
//计数器对系统时钟计数,计时0.2秒(仿真时,设置为10)
always @(posedge sys_clk or negedge sys_rst_n) begin
if (!sys_rst_n)
counter <= 24'd0;
else if (counter < 24'd10)
counter <= counter + 1'b1;
else
counter <= 24'd0;
end
//通过移位寄存器控制IO口的高低电平,从而改变LED的显示状态
always @(posedge sys_clk or negedge sys_rst_n) begin
if (!sys_rst_n)
led <= 4'b0001;
else if(counter == 24'd10)
led[3:0] <= {led[2:0],led[3]};
else
led <= led;
end
**********例化部分3**********
//----------- Begin Cut here for INSTANTIATION Template ---// INST_TAG
flow_led_icon flow_led_icon_u (
.CONTROL0(CONTROL0) // INOUT BUS [35:0]
);
//----------- Begin Cut here for INSTANTIATION Template ---// INST_TAG
flow_led_ila flow_led_ila_u (
.CONTROL(CONTROL0), // INOUT BUS [35:0]
.CLK(sys_clk), // IN
.TRIG0(TRIG0) // IN BUS [255:0]
);
**********例化部分3**********
endmodule
然后全编译,生成bit流文件,打开ChipScope。
2.在线调试
打开ChipScope后,重新Configure
把四个窗口添加到一根总线上。如下
那么,基本上ChipScope的使用就到这了,具体使用还是要以后多练习才行。