烂泥桑 发表于 2014-4-18 15:28:19

菜鸟求教,两个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:36:03

本帖最后由 Uplate 于 2014-4-18 15:40 编辑

下个周期的上升沿才有效

honeybear 发表于 2014-4-18 15:42:49

楼上正解,always是同时执行的

7802848 发表于 2014-4-18 16:07:45

1是判断边沿的
这个边沿只有一个时钟周期

fgdzypf 发表于 2014-4-19 10:04:59

学习了,我还没有研究过

Jigsaw 发表于 2014-4-19 10:17:28

l楼主还没发现数字电路与MCU之间的区别啊
永远记住:你用Verilog是在描述电路,不是写程序

linjpxt 发表于 2014-4-19 10:18:05

这两个always其实是同一个,只是分开为了好读
这个周期上升沿用的输入是上周期改变后的

cuiliang1984 发表于 2014-4-19 12:57:14

1 用来做信号ps2k_clk边沿检测,里面锁存了两次,你需要理解的是只有主时钟clk走一拍后,ps2k_clk及其锁存的值才会更新,2和1是时钟同步的,只有在主时钟clk posedge后1和2中所有的寄存器值同步更新。
页: [1]
查看完整版本: 菜鸟求教,两个always语句,怎么判断先后