一、概论
在我们进行FPGA分频器的学习当中,我们通常会学习怎样完成任意分频器的设计,其中就包括偶数分频最为常见。在实现的分频器的同时我们也会不定时的要求同时设置对应的占空比。今天我们就来看看怎样同时设置奇数分频器和其对应50%的占空比。
二、实现原理
我们在进行偶数分频时可以很轻松的就可以实现对应的分频器和其占空比,因为就是简单实现高低电平反转就行。而在奇数分频中要实现50占空比就需要一种特定的思想。
1、设计源码
这里我使用的是先进行n分频器的设计,然后利用两个n分频的相位延迟一个周期的方法对于实现n分频的50%占空比。特别需要注意的是两个子分频逻辑只能用组合逻辑,否则使用时序逻辑的话会自动忽略低电平。在下面的代码中n=3。
module divider(input clk,input rst_n,output reg clk_out
);
parameter TIME = 3;
reg [2:0]cnt;
reg [2:0] cnt1;
reg [2:0] cnt2;
reg clk_out1;
reg clk_out2;//子分频器1
always @(posedge clk or negedge rst_n)beginif(!rst_n)cnt1<=0;else if(cnt1==(TIME-1))cnt1<=0;else cnt1<=cnt1+1;
end //子分频器2
always @(negedge clk or negedge rst_n)beginif(!rst_n)cnt2<=0;else if(cnt2==(TIME-1))cnt2<=0;elsecnt2<=cnt2+1;
end //子分频器1频率分布
always @(posedge clk or negedge rst_n)begin if(!rst_n)clk_out1<=0;else if(cnt1<(TIME>>1))clk_out1<=0;else clk_out1<=1;
end //子分频器2频率分布
always @(negedge clk or negedge rst_n)begin if(!rst_n)clk_out2<=0;else if(cnt0<(TIME>>1))clk_out2<=0;else clk_out2<=1;
end assign clk_out=clk_out1 &&clk_out2;
2、仿真文件
//定义时间尺度
`timescale 1ns/1ns
module divider_tb ;//输入信号定义
reg clk;
reg rst_n;wire clk_out;
//模块例化
divider div (/*input */ .clk (clk ),/*input */ .rst_n (rst_n ),/*output*/ .clk_out (clk_out )
);
//激励信号产生
parameter CLK_CYC = 20;
//时钟
initial clk=1;
always #(CLK_CYC/2)clk=~clk;//复位
initial beginrst_n= 1'b0;#(CLK_CYC*3);#5;//复位结束避开时钟上升沿rst_n= 1'b1;
end//激励endmodule
这里的测试文件和上一篇偶数分频器的测试文件一样,可以拿来直接用。
四、仿真波形图
通过仿真波形图我们可以看到:计数器1和计数器2的两个子分频的相位是相差一个周期的,而且通过观察clk_out我们可以看到实现了3分频的50%占空比。