开头,感谢各位大哥帮忙转发!最近涨粉很快,也感谢各位关注的朋友!
看到了一些interesting的题,和大家分享一下,如果大家有什么额外的见解欢迎大家公众号后台留言!
题目:
设计一个占空比1:1的三分频电路
怎么做暂且不讲,容我先念叨一下这类题的原理!
首先要明确的是:几分频就是输出的分频时钟中包含几个系统时钟。
其次分频有两种,一种是偶分频,另一种是奇分频,我们分开来讲。
一、偶分频
分频在FPGA通过计数器实现,偶分频计数只需计数到N/2-1,然后进行时钟翻转,同时将计数器清零,即可得到(偶数)N分频,很简单就不赘述了。
二、奇分频(占空比50%)
简单的非50%占空比的就不说了,免得浪费大家时间。
实现奇分频的方法有很多种,很常用的方法为相位异或法,该方法的总结:对于实现50%奇数N分频电路,首先进行进行上升沿进行模长N计数,计数选定到某一个值进行输出时钟翻转,然后再经过(N-1)/2(重点!一定是(N-1)/2)再次进行翻转得到一个占空比非50%奇数N分频时钟;同时进行下降沿触发的模N计数,到和上升沿触发输出时钟翻转选定值相同,进行输出时钟翻转,同样经过(N-1)/2时,输出时钟再次翻转会生成占空比非50%的奇数N分频时钟,两个占空比非50%的奇数N分频时钟相或运算,得到占空比50%的N分频时钟。
回到正题,设计一个三分频,占空比0.5
代码:
代码语言:javascript复制module tfp(
input clk,
input rst_n,
output reg clk0,clk1,
output clk_o
);
reg [1:0]cnt0;
reg [1:0]cnt1;
//占空比1/3的脉冲 001
always@(posedge clk or negedge rst_n)
if(~rst_n)
begin
cnt0<=0;
clk0<=1'b0;
end
else if(cnt0==2'b10)
begin
clk0<=clk0;
cnt0<=2'b00;
end
else begin
cnt0<=cnt0 1'b1;
clk0<=~clk0;
end
endmodule
仿真结果:
升级:设计一个5分频,占空比0.5
代码:
代码语言:javascript复制/*
5分频
*/
module fivefp(
input clk,
input rst_n,
output clko
);
reg [2:0]cnt0;
reg [2:0]cnt1;
reg clk0;
reg clk1;
always@(posedge clk or negedge rst_n)
if(~rst_n)
begin
clk0<=1'b0;
cnt0<=3'd0;
end
else if(cnt0==3'b100)
begin
clk0<=clk0;
cnt0<=3'd0;
end
else if(cnt0==3'b000) //0时候翻转一次,下一次翻转是(5-1/2=2)系统时钟之后,也就是cnt=2时
begin
clk0<=~clk0;
cnt0<=cnt0 1'b1;
end
else if(cnt0==3'd2)
begin
clk0<=~clk0;
cnt0<=cnt0 1'b1;
end
else begin
clk0<=clk0;
cnt0<=cnt0 1'b1;
end
always@(negedge clk or negedge rst_n)
if(~rst_n)
begin
cnt1<=3'b000;
clk1<=1'b0;
end
else if(cnt1==0)
begin
cnt1<=cnt1 1'b1;
clk1<=~clk1;
end
else if(cnt1==3'd2)
begin
cnt1<=cnt1 1'b1;
clk1<=~clk1;
end
else if(cnt1==3'd4)
begin
cnt1<=0;
clk1<=clk1;
end
else begin
cnt1<=cnt1 1'b1;
clk1<=clk1;
end
assign clko=clk0|clk1;
endmodule
仿真结果:
~~~~感谢阅读~~~~