1、什么是ISSP?ISSP有什么用?

        Quartus II提供了In-System Sources and Probes Editor调试工具,通过JTAG接口使用该工具可以驱动和采样内部节点的逻辑值。即通过 Sources功能来驱动fpga内部信号,通过Probes功能来探测内部节点的逻辑值。在系统设计还不完整的时候可以利用该工具模拟众多的输入激励。比如,可以通过该IP核来实时修改内部某些寄存器的值,而不用重新修改代码,再全编译,再下载调试。

        通俗来说,使用ISSP IP核可以对被测模块提供输入,而这个输入是可以在线更改的;同时,还可以检测被测模块的输出值(作用类似Signaltap)。

2、ISSP的使用

        在数码管的静态显示章节(FPGA极易入门教程—-数码管篇(1)静态显示)我们编写了动态驱动代码,并使用定时生成数据的方式对驱动代码进行了测试。这种测试方式的覆盖率高,但是不够灵活。我们如果使用ISSP IP核来测试就可以直接在线修改输入,起到特定的调试作用。

        1、先新建一个工程issp_test

        2、新建数码管驱动文件并将其添加到工程    

//6位8段式数码管静态显示驱动
 
//端口定义
module dis_sta_dri (
	input 				sys_clk ,				//时钟信号
	input 				sys_rst_n ,				//复位信号(低有效)
			
	input		[3:0]	num,					//数码管显示的十进制数
	output reg 	[5:0] 	dis_sel,				//数码管位选
	output reg 	[6:0] 	dis_seg, 				//数码管段选
	output				dis_dp					//数码管小数点
);
 
assign dis_dp = 1'b1;							//小数点,我们暂时不同,使其无效即可
 
//控制数码管位选信号(低电平有效),选中所有的数码管
always @ (posedge sys_clk or negedge sys_rst_n) begin
	if (!sys_rst_n)
		dis_sel <= 6'b111111;					//复位熄灭所有数码管
	else
		dis_sel <= 6'b000000;					//复位完成后给所有数码管供电
end
 
//根据数码管显示的数值,控制段选信号(低电平有效)
always @ (posedge sys_clk or negedge sys_rst_n) begin
	if (!sys_rst_n)
		dis_seg <= 7'b111_1111;					//复位时熄灭数码管(这一条用处不大,因为复位时数码管也不供电)
	else begin
		case (num)
			4'h0 : dis_seg <= 7'b000_0001;		//显示数字“0”,则数码管的段选编码为7'b000_0001
			4'h1 : dis_seg <= 7'b100_1111;
			4'h2 : dis_seg <= 7'b001_0010;
			4'h3 : dis_seg <= 7'b000_0110;
			4'h4 : dis_seg <= 7'b100_1100;
			4'h5 : dis_seg <= 7'b010_0100;
			4'h6 : dis_seg <= 7'b010_0000;
			4'h7 : dis_seg <= 7'b000_1111;
			4'h8 : dis_seg <= 7'b000_0000;
			4'h9 : dis_seg <= 7'b000_0100;		//显示数字“9”,则数码管的段选编码为7'b000_0100
			default : dis_seg <= 7'b111_1111;	//其他数字(16进制的数字相对10进制无效)则熄灭数码管
		endcase
	end
end
 
endmodule

        3、进入IP选择界面

image.png

image.png

        4、例化In-System Sources and Probes Editor IP核,名(随便取)为Sou_Pro ,点击 Next进入 IP参数设置界面。

image.png

        5、按以下设置IP参数

              (1)选择是否指定例化IP的编号,默认设置,不用修改

              (2)是否设置IP核的ID号。因为在一个工程中,可以例化多个In-System Sources and Probes Editor IP核,该ID号就是用来区分不同的IP核

              (3)用来设置探测(Probes)端口,probe功能我们用来检测数码管的段选值,以此验证输入数值是否能有对应的正确输出,位宽设置为7,

              (4)用来设置驱动(Sources)端口,source位宽设为20(注意图片不一致),与数码管驱动数字的位宽一致

              (5)高级设置选项。可以用来设置驱动 信号的初始值以及发送驱动信号是否与源时钟同步。(通常保持默认即可)

image.png

        6、一直点next直到finish,完成IP的创建。

        7、编写顶层文件并将其添加到工程,例化数码管驱动和ISSP IP核,如下:

//ISSP IP 测试文件
module issp_test(
	input				sys_clk		,		//时钟信号
	input 				sys_rst_n 	,		//复位信号(低有效)
	
	output  	[5:0] 	dis_sel		,		//数码管位选
	output  	[6:0] 	dis_seg		, 		//数码管段选
	output				dis_dp				//数码管小数点
 
);
 
wire	[3:0]	num;						//数码管显示的十进制数,10进制,范围0-9
 
//例化数码管驱动
dis_sta_dri dis_sta_dri_inst(
	.sys_clk 		(sys_clk 	),		
	.sys_rst_n 		(sys_rst_n 	),		
                     
	.num			(num		),		
	.dis_sel		(dis_sel	),		
	.dis_seg		(dis_seg	), 		
	.dis_dp			(dis_dp		)		
);
 
//例化ISSP IP核
Sou_Pro	Sou_Pro_inst (
	.probe 			(dis_seg	),			//探测数码管段选
	.source 		(num		)			//生成数码管显示数据
);
 
endmodule

        8、全编译工程,并将生成的文件下载到FPGA

        至此就完成了IP核的创建,接下来就使用在线调试工具对被测模块进行调试。

3、测试过程与结果

        1、打开在线调试工具,如下:

image.png

        2、窗口右边选择自己的JTAG接口

image.png

        3、界面如下:

image.png

        4、右击probe和source,可以选择数据的进制,分别将 probe设置为2进制,将source设置为10进制

image.png

image.png

         5、我们在source窗口输入1,然后读取探测数据,此时读到的数码管段选值为10011111,与预计一致

image.png

        同时发现我们的开发板上的数码管显示111111,与预计一致

image.png

6、我们在source窗口输入7,然后读取探测数据,此时读到的数码管段选值为00011111,与预计一致

image.png

        同时发现我们的开发板上的数码管显示777777,与预计一致

image.png

4、其他

创作不易,如果本文对您有帮助,还请多多点赞、评论和收藏。您的支持是我持续更新的最大动力!

关于本文,您有什么想法均可在评论区留言。如果需要整个工程,请在评论留下邮箱或者私信我邮箱(注意保护隐私)。

自身能力不足,如有错误还请多多指出!

版本信息

        文件:V1.0

        编号:0003

        Quartus II:Quartus II 13.1 (64-bit)

————————————————

版权声明:本文为CSDN博主「孤独的单刀」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/wuzhikaidetb/article/details/122358545