always @(posedge clk ) begin .......reg1<=....end //对寄存器1赋值
always @(negedge clk) begin .......reg1<=....end // 对寄存器1赋值
第三种写法:在不同的alwys语句里面在时钟的上升沿和下降沿对不同寄存器进行赋值
always @(posedge clk ) begin .......reg1<=....end //对寄存器1赋值
always @(negedge clk) begin .........reg2<=....end // 对寄存器1赋值
很明显,第1和第一种写法是不可行的,在verilog的语法里面有说明,编译也明显通不过,
现在对第三种进行讨论,第三种是在时钟的上升沿和下降沿分别对不同的寄存器进行赋值处理,
上升沿和下降沿都使用,就相当于是电平触发,电平触发比时钟沿触发更容易受到干扰,在高速时
容易受干扰,也不够好。
解决方法
方法1.先通过PLL锁相环产生两个频率相同相位差为180度的clk1,clk2,然后在每个clk的上升沿输出
always@(posedge clk1)
begin
...
end
always@(posedge clk2)
begin
...
end
方法2:通过PLL对clk进行倍频,得到clk2,那么clk2的上升沿也就是clk的下降沿
always@(posedge clk)
begin
...
end
always@(posedge clk2)//相当于clk的下降沿
begin
...
end
方法3:如果对clk的下降沿操作只是用于后面的使能之用,可以把clk分频得到clk_new;
例如:
always @(posedge clk)
begin
clk_new<=!clk_new;//把clk_new当作是新时钟用,信号都是在clk_new的上升和下降沿触发
end
always @(posedge clk_new)//clk_new的上升沿
begin
....
end
always @(posedge clk)///clk_new的下降沿,由于clk信号是clk_new的二倍频,
begin
....
end
方法4:在低速信号处理的时候可以把clk取反得到一个新的时候clk_n
always @(posedge clk)
begin
end
always @(posedge clk_n)//取反后clk_n的上升沿也就是clk的上升沿
begin