1、M进制计数器
一个M进制的计数器的设计,首先需要判断其需要几个触发器,假设需要N个触发器,那么必须满足,以一个十进制的计数器来说,N为4。
代码如下:十进制的计数器除了低电位复位信号清零外还需要再计数到9以后清零。
1
2
3
4
5
6
7
8
9module 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进制的计数器,代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17module 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的计数器,代码与波形图如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27module 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)移位寄存器法:虽然速度很快但是占用面积很大
1
2
3
4
5
6
7
8
9
10
11module 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=
代码如下:
1
2
3
4
5
6
7
8
9
10module 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
最后
以上就是震动服饰最近收集整理的关于计数器及其应用的全部内容,更多相关计数器及其应用内容请搜索靠谱客的其他文章。
发表评论 取消回复