实验工具:锆石A4开发板
软件:quartus 13.1
Signal Tap 就相当于逻辑分析仪,signal Tap是利用FPGA的内部逻辑资源形成一个内部的逻辑分析仪
有时候内部管脚还多于外部管脚,这个时候更没法测试
使用流程
//---------------------------------------------------------------------------
//-- 文件名 : A4_Ked2.v
//-- 作者 : ciscomonkey,代码搬移的锆石科技的
//-- 描述 : 按键消抖
//-- 修订历史 :
//---------------------------------------------------------------------------
module A4_Key2
(
//输入端口
CLK_50M,RST_N,KEY,
//输出端口
LED
);
//---------------------------------------------------------------------------
//-- 外部端口声明
//---------------------------------------------------------------------------
input CLK_50M; //时钟的端口,开发板用的50MHz晶振
input RST_N; //复位的端口,低电平复位
input [ 7:0] KEY; //对应开发板上的KEY
output [ 7:0] LED; //对应开发板上的LED
//---------------------------------------------------------------------------
//-- 内部端口声明
//---------------------------------------------------------------------------
reg [20:0] time_cnt; //用来计数按键延迟的定时计数器
reg [20:0] time_cnt_n; //time_cnt的下一个状态
reg [ 7:0] key_in_r; //用来接收按键信号的寄存器
reg [ 7:0] key_out; //消抖完成输出按键
reg [ 7:0] key_out_n; //key_out的下一个状态
wire key_press; //检测按键有没有变化
//设置定时器的时间为20ms,计算方法为 (20*10^3)us / (1/50)us 50MHz为开发板晶振
parameter SET_TIME_20MS = 21'd1_000_000;
//---------------------------------------------------------------------------
//-- 逻辑功能实现 ,按一下,灯变化一次
//---------------------------------------------------------------------------
//时序电路,用来key_in_r寄存器赋值
always @ (posedge CLK_50M, negedge RST_N)
begin
if(!RST_N) //判断复位
key_in_r <= 8'h00; //初始化key_in_r值
else
key_in_r <= KEY; //将按键的值赋值给key_in_r
end
assign key_press = key_in_r ^ KEY; //检测按键有没有变化
//时序电路,用来给time_cnt寄存器赋值
always @ (posedge CLK_50M, negedge RST_N)
begin
if(!RST_N) //判断复位
time_cnt <= 21'h0; //初始化time_cnt值
else
time_cnt <= time_cnt_n; //用来给time_cnt赋值
end
//组合电路,实现20ms的定时计数器
always @ (*)
begin
if(time_cnt == SET_TIME_20MS || key_press) //判断按键有没有变化、时间有没有到
time_cnt_n = 21'h0; //如果到达20ms或者按键有了变化,那么定时计数器将会被清零
else
time_cnt_n = time_cnt + 1'b1; //如果未到20ms或者按键没有变化,那么定时计数器将会继续累加
end
//时序电路,用来key_out寄存器赋值
always @ (posedge CLK_50M, negedge RST_N)
begin
if(!RST_N) //判断复位
key_out <= 8'h00; //初始化key_out值
else
key_out <= key_out_n; //用来给key_out赋值
end
//组合电路,每20ms接收一次按键的值
always @ (*)
begin
if(time_cnt == SET_TIME_20MS) //判断20ms时间
key_out_n = key_in_r; //如果到达20ms,接收一次按键的值
else
key_out_n = key_out; //如果未到20ms,保持原状态不变
end
assign LED = key_out; //将消抖的按键值赋值给LED
endmodule
选择New----》signal tap II
或者在tool下面选择signal tap II
在这里可以保存signal Tap II
signal Tap II界面的选项介绍
在信号的观察界面,右键点击Add Nodes
选中Design Entry(设计条目)
然后点击list
选择要观察的信号
观察信号界面弹出我们选中的信号。
有的时候,可能我们要观察内部的信号时红色的,这个时候往往是被优化掉了,导致我们没法观察到想要观察的信号。
这个时候有两种办法:
1,将我们要观察的信号拉到顶层接口
2. 在观察的wire信号旁边加上/synthesis keep/
对于reg信号则加 /synthesis noprune/ 或者 /synthesis preserve/
配置采样属性
对signal tap II的时钟进行配置
如上图所示,如果我们选择输入时钟,会弹出以上对话框,也就是说我们的输入时钟不能够又作为signal tap II 的采样时钟,又作为我们的系统时钟。这个时候,可以用PLL生成一个更高倍的时钟作为采样时钟。
这里我们把观察信号里面的输入时钟移去。
右下角的触发条件我们可以不用管,在观察信号里的圆圈里对每一个信号设置出发条件,就是说在观察信号的下降沿采样,还是说在信号的上升沿进行采样,还是说dont care
对采样的深度进行设置
连接好我们的板子。进行重新编译,然后选好SOF
然后下载我们的SOF文件
我们发现signal tap II 已经变成了 ready to acquire
点击run analysis,或者auto run analysis
当我按下复位键的时候,变为低电平,然后进行采样。
如果我设置为要么在按下Key键,要么在RST键采样,设置为OR即可
工程:
https://download.csdn.net/download/ciscomonkey/10801959