赞
踩
在Verilog代码中,计数器可在时钟上升沿有效,也可在时钟下降沿有效,但无法在时钟上升沿和下降沿同时有效,即以下代码无法编译通过:
- reg [3:0] cnt;
- always@(posedge clk or negedge clk or rst_n)begin
- if(!rst_n)
- cnt<=4'd0;
- else if(cnt==8-1)
- cnt<=4'd0;
- else
- cnt<=cnt+1'b1;
- end
本文研究了一种计算方法,可实现计数器在时钟信号的上升沿和下降沿同时有效,效果如图所示:
Verilog代码如下:
- //双边沿计数器;
- module cnt_2(
- input wire clk,
- input wire rst_n,
-
- output reg [4:0] cnt
-
- );
- parameter N = 5'd4;
- reg [4:0] cnt_p;
- reg [4:0] cnt_n;
-
- always@(posedge clk or negedge rst_n)
- begin
- if(!rst_n)
- cnt_p<=5'd0;
- else if(cnt==N-1)
- cnt_p<=5'd0;
- else
- cnt_p<=cnt+5'd1;
- end
-
- always@(negedge clk or negedge rst_n)
- begin
- if(!rst_n)
- cnt_n<=5'd0;
- else if(cnt==N-1)
- cnt_n<=5'd0;
- else
- cnt_n<=cnt+5'd1;
- end
-
- //assign cnt = ((cnt_p==0)&&(cnt_n==N-1)||(cnt_p==N-1)&&(cnt_n==0)) ? 0 : (cnt_p >= cnt_n) ? cnt_p : cnt_n;
- always@(*) begin
- if((cnt_p==0)&&(cnt_n==N-1)||(cnt_p==N-1)&&(cnt_n==0))
- cnt=0;
- else if(cnt_p >= cnt_n)
- cnt=cnt_p;
- else
- cnt=cnt_n;
- end
-
- endmodule
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。