概述
1、M进制计数器
一个M进制的计数器的设计,首先需要判断其需要几个触发器,假设需要N个触发器,那么必须满足,以一个十进制的计数器来说,N为4。
代码如下:十进制的计数器除了低电位复位信号清零外还需要再计数到9以后清零。
module comp_10(count,clk,reset);
output[3:0] count;
input clk, reset;
reg[3:0] count;
always@(posedge clk)
if(!reset) count<=4'b0;
else if(count==4'b1001) count<=4'b0;
else count<=count+1;
endmodule
其他进制的计数器根据同样的方式,先确定触发器的个数,随后确定计数到M-1后清零即可进行设计。
2、计数器应用1:分频器
1)偶数分频器(N分频)
偶数分频器的设计方法是:首先设计一个的计数器,然后在时钟上升沿,计数器计到最大时反转,举例8分频器,需要一个3进制的计数器,代码如下:
module count_8;
input clk,reset;
output reg clk_8;
reg[1:0] count;
always@(posedge clk or negedge reset)//0-3计数器
begin
if(!reset) count <= 2'b0;
else if(count == 2'b11) count<=2'b0;
else count <= count+1;
end
always@(posedge clk or negedge reset)//时钟上升沿触发计数器
begin
if(!reset) clk_8 <= 2'b0;
else if(count == 2'b11) clk_8 <= ~clk_8;//最大计数时反转
else clk_8 <= clk_8;
end
endmodule
上半段描述的是一个3进制的计数器,下半段是output在最大计数的时候发生反转,最终形成一个8分频器,其波形图如下:
2)奇数分频器(M分频)
奇数分频器的设计方式是,先设计一个M-1进制的计数器,然后在时钟上升沿触发计数器(时翻转一次、最大计数再翻转一次),时钟下降沿触发计数器(时翻转一次、最大计数再翻转一次),最后将时钟上升沿与下降沿结果相与作为最终的分频输出。举例7分频器,需要一个0-6的计数器,代码与波形图如下:
module count_7;
input clk,reset;
output count_7;
reg[2:0] count;
reg clk_pos,clk_neg;
always@(posedge clk or negedge reset) //0-6的计数器
begin
if(!reset) count <= 3'b0;
else if(count == 3'b110) count <= 3'b0;
else count <= count+1;
end
always@(posedge clk or negedge reset) //时钟上升沿时触发计数器
begin
if(!reset) clk_pos <= 0;
else if(count == 3'b010) clk_pos <= 1; //(M-1/2)-1时的反转
else if(count == 3'b110) clk_pos <= 0; //最大计数时的反转
else clk_pos <= clk_pos;
end
always@(negedge clk or negedge reset) //时钟下降沿时触发计数器
begin
if(!reset) clk_neg <= 0;
else if(count == 3'b010) clk_neg <= 1; //(M-1/2)-1时的反转
else if(count == 3'b110) clk_neg <= 0; //最大计数时的反转
else clk_neg <= clk_neg;
end
assign clk_7 = clk_pos && clk_neg;
endmodule
3、计数器应用2:序列信号发生器
关于序列信号发生器,我们构建的方式有很多种,第一种是采用循环移位寄存器方法,此方法将移位寄存器的最低位连接上输出端,,此方法缺点就是电路面积过大。第二种方式就是移位寄存器加组合电路的方式。还有第三种就是计数器加组合电路的方式了。
例如:构造一个“10110111”的序列信号发生器
1)移位寄存器法:虽然速度很快但是占用面积很大
module signal_maker(out,clk,load,D);
input clk,load;
input[7:0]D;
reg[7:0]Q;
initial Q=8'b10110111;
always@(posedge clk)
if(load) Q<=D;
else Q<={Q[6:0],Q[7]};
assign out=Q[7]
endmodule
2)计数器加组合电路法
首先确认的是需要几个计数器,产生一个10110111序列,模值为8,所以计数器的状态选择从000到111,是一个8进制计数器。确定好了以后将计数器与要产生的序列对应生成真值表,然后化简出最小项标准式,代码段就是先构建一个8进制计数器然后再将输出用wire连接到最小项标准式上。
对应的真值表如下:
Q2 | Q1 | Q0 | out |
0 | 0 | 0 | 1 |
0 | 0 | 1 | 0 |
0 | 1 | 0 | 1 |
0 | 1 | 1 | 1 |
1 | 0 | 0 | 0 |
1 | 0 | 1 | 1 |
1 | 1 | 0 | 1 |
1 | 1 | 1 | 1 |
真值表对应的卡诺图如下:
得到输出函数:out=
代码如下:
module signal_maker(out,clk,reset);
output out;
input clk,reset;
reg[2:0]count;
always@(posedge clk) //模8计数器
if(!reset) count <= 3'b0;
else if(count == 3'b111) count <= 3'b0;
else count <= count+1;
assign out = count[1]|((~Q[0])&(~Q[2]))|((Q[0])&(Q[2]));//组合逻辑
endmodule
最后
以上就是震动服饰为你收集整理的计数器及其应用的全部内容,希望文章能够帮你解决计数器及其应用所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复