菜鸟求教,两个always语句,怎么判断先后
这个标题不好取,如果有什么问题,多包涵。是这样的,我在看特权同学的程序时,看到:
always @ (posedge clk or negedge rst_n) begin
if(!rst_n) begin
ps2k_clk_r0 <= 1'b0;
ps2k_clk_r1 <= 1'b0;
ps2k_clk_r2 <= 1'b0;
end
else begin //锁存状态,进行滤波
ps2k_clk_r0 <= ps2k_clk;
ps2k_clk_r1 <= ps2k_clk_r0;
ps2k_clk_r2 <= ps2k_clk_r1;
end
end
assign neg_ps2k_clk = ~ps2k_clk_r1 & ps2k_clk_r2; //**********************①
//------------------------------------------
reg ps2_byte_r; //PC接收来自PS2的一个字节数据存储器
reg temp_data; //当前接收数据寄存器
reg num; //计数寄存器
always @ (posedge clk or negedge rst_n) begin
if(!rst_n) begin
num <= 4'd0;
temp_data <= 8'd0;
end
else if(neg_ps2k_clk) begin //*************************************②
case (num)
4'd0: num <= num+1'b1;
...........
上面的程序中,我在理解时,很疑惑①和②之间的问题,时钟上升沿到来后——posedge clk,假如ps2k_clk_r0ps2k_clk_r1 ps2k_clk_r2发生了变化,导致neg_ps2k_clk重现计算,例如从0—>1,那么②这句的条件到底成不成立啊,此时neg_ps2k_clk是0还是1? 本帖最后由 Uplate 于 2014-4-18 15:40 编辑
下个周期的上升沿才有效 楼上正解,always是同时执行的 1是判断边沿的
这个边沿只有一个时钟周期 学习了,我还没有研究过 l楼主还没发现数字电路与MCU之间的区别啊
永远记住:你用Verilog是在描述电路,不是写程序 这两个always其实是同一个,只是分开为了好读
这个周期上升沿用的输入是上周期改变后的 1 用来做信号ps2k_clk边沿检测,里面锁存了两次,你需要理解的是只有主时钟clk走一拍后,ps2k_clk及其锁存的值才会更新,2和1是时钟同步的,只有在主时钟clk posedge后1和2中所有的寄存器值同步更新。
页:
[1]