在时钟的上升沿和下降沿都对触发always块好不好
2个回答
展开全部
一、在不同的alwys语句里面在时钟的上升沿和下降沿对不同寄存器进行赋值
always @(posedge clk ) begin .......reg1<=....end //对寄存器1赋值
always @(negedge clk) begin .........reg2<=....end // 对寄存器1赋值
上升沿和下降沿都使用,就相当于是电平触发,电平触发比时钟沿触发更容易受到干扰,在高速时容易受干扰,不够好。
二、解决方法
方法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
end
always @(posedge clk ) begin .......reg1<=....end //对寄存器1赋值
always @(negedge clk) begin .........reg2<=....end // 对寄存器1赋值
上升沿和下降沿都使用,就相当于是电平触发,电平触发比时钟沿触发更容易受到干扰,在高速时容易受干扰,不够好。
二、解决方法
方法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
end
2015-03-28
展开全部
regF1,F2;
always @(posedge CLK or negedge RSTn)
if(!RSTn)
begin
F1<=1'b1;
F2<=1'b1;
end
else
begin
F1<=SCKr;//需要检测的引脚
F2<=F1;
end
/******************************/
assign SCK_fallingedge = F2 && !F1;//检测时钟的上升沿
assign SCK_risingedge = F1 && !F2;//检测时钟的下降沿
always @(posedge CLK or negedge RSTn)
if(!RSTn) begin .... end
else if(SCK_fallingedge == 1)
bigin
//SCK_fallingedge为一表示上升沿到来,上升沿到来之后SCK_fallingedge会自动清零
end
else if(SCK_risingedge == 1)
begin
//同样,SCK_fallingedge为一表示下降沿到来,下降沿到来之后SCK_fallingedge会自动 清零
end
always @(posedge CLK or negedge RSTn)
if(!RSTn)
begin
F1<=1'b1;
F2<=1'b1;
end
else
begin
F1<=SCKr;//需要检测的引脚
F2<=F1;
end
/******************************/
assign SCK_fallingedge = F2 && !F1;//检测时钟的上升沿
assign SCK_risingedge = F1 && !F2;//检测时钟的下降沿
always @(posedge CLK or negedge RSTn)
if(!RSTn) begin .... end
else if(SCK_fallingedge == 1)
bigin
//SCK_fallingedge为一表示上升沿到来,上升沿到来之后SCK_fallingedge会自动清零
end
else if(SCK_risingedge == 1)
begin
//同样,SCK_fallingedge为一表示下降沿到来,下降沿到来之后SCK_fallingedge会自动 清零
end
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询