verilog奇数分频器的问题讲解(7分频为例)

先不多哔哔,直接上代码(verilogHDL),代码的后面讲原理
module fenpin3(clk,clk7,rst);
input clk,rst; //设置rst的目的是当rst=1的时候给cnt0和cnt1赋初值
output clk7;
reg [2:0] cnt0,cnt1; //定义两个加法器分别生成两个7分频的信号
reg clk0,clk1; // 由加法器两个7分频的信号
wire clk7; //用于后面clk0和clk1相加得到最后的结果clk7
always@(posedge clk or posedge rst ) //clk取上升沿,区别于下面的always@(negedge clk or posedge rst )
begin
if(rst1)
cnt0<=0;
else if(cnt0
3’d6) //是cnt在0-6无限循环方能得到7分频信号,简言之想得到N分频,就0——(N-1)循环
cnt0<=0;
else
cnt0<=cnt0+1;
end
always@(posedge clk)
begin
if(cnt03’d0||cnt03’d1||cnt03’d6) //这个地方比较重要,文章后面单独讲
clk0<=1;
else
clk0<=0;
end
always@(negedge clk or posedge rst ) //注意clk是取下降沿,为的就是保证下面的clk1与上面的clk0相差一周期
begin
if(rst
1)
cnt1<=0;
else if(cnt13’d6)
cnt1<=0;
else
cnt1<=cnt1+1;
end
always@(negedge clk)
begin
if(cnt1
3’d0||cnt13’d1||cnt13’d6)
clk1<=1;
else
clk1<=0;
end
assign clk7=clk0|clk1; // 两个七分频信号按位或运算
endmodule
强调文本 强调文本

== if(cnt03’d0||cnt03’d1||cnt0==3’d6)
clk0<=1;
else
clk0<=0;==这一句的解读:七分频就是讲原始clk这个时钟信号的七个周期合并到一个周期内,可以理解为7=3+4;
这里的3+4是指3周期+4周期。当cnt分别等于0、1、6的时候clk等于1,这其实就是高电平占了三个周期,剩下四个都是低电平。
好了,说到这里我们不禁会想到这样一个问题,你三个周期高电平,四个周期低电平它不是50%占空比啊,咋办!掌握了怎么搞出一个七分频信号后,我们可以在搞出一个七分频信号,这也就是代码中clk0、clk1;由于这两个信号是相差了一个周期的时间,我们让他们按位或就能得到50%占空比的七分频信号啦!
注意我讲的过程中可能有些表述不是很合理,但是奇数分频器的原理确实是这样的,不必怀疑方法有问题。

你可能感兴趣的:(verilog奇数分频器的问题讲解(7分频为例))