用的是Fusion StartKit。
目的:测试异步上电复位,确定FPGA上电后的状态。
原理描述:复位按键的上升沿给led(板子上的八个发光二极管)赋值10101010,每个时钟(大约10s)上升沿输出led+1。
程序:
module power_up(reset,clk,led);
input reset,clk;
output reg [7:0] led;
reg [29:0] count;
always @ (posedge clk) //大约10s,方便观察
begin
count <= count +1;
end
always @ (posedge count[29],posedge reset)
begin
if(reset)
led <= 8'b1010_1010;
else
led <= led + 1;
end
endmodule
按键电路:reset用的是KEY4
实验现象:1 系统上电,led显示10101010,每隔10s加1。按复位键,led复位到10101010。 2 系统上电,不按复位键,led依然能显示10101010,每隔10s加1。
问题来了:既然上电时reset并没有上升沿,而且我又没有按复位键,那为什么led显示10101010 ?
讨论:reset在上电时没有上升沿,理论上并不能触发posedge reset,也不满足 if(reset) led <= 8'b1010_1010; 如果不按复位键,那理论上led并没有机会被初始化。但从实验现象来看,led在上电的瞬间就已经被正确的初始化到10101010了,这让我很疑惑。 难道综合工具能够智能的识别异步复位?即使是这样,从硬件上怎么解释呢?一个一直为低的信号竟然触发了上升沿的条件,并满足电平为高的条件?
希望大家讨论一下。 |