分频器是FPGA常用的一种时序电路,在各种的小项目中应用的尤为常见,今天李老湿哦给大家讲讲分频器之偶数分频。
基本原理:**偶数倍分频是最简单的一种分频模式,完全可通过计数器计数实现。如要进行N倍偶数分频,那么可由待分频的时钟触发计数器计数,当计数器从0计数到N/2-1时,输出时钟进行翻转,并给计数器一个复位信号,使得下一个时钟从零开始计数,以此循环下去。这种方法可以实现任意的偶数分频。例4-13给出的是一个参数型偶数分频电路,通过调用该模块可实现任意偶数分频。
不多扯淡了 直接上代码,用的软件是VIVADO2017.4.
底层代码如下:
在这里插入代码片
`timescale 1ns / 1ps
module divf(clk,clk_N,reset_n
);
input clk,reset_n;
output reg clk_N;
parameter N=6;
reg [7:0] p;
always @(posedge clk or negedge reset_n)
begin
if (!reset_n)
begin
p<=1'b0 ;
clk_N<=1'b0;
end
else if(p==N/2-1) //6分频
begin
p<=0;
clk_N<=~clk_N;
end
else
p<=p+1;
end
endmodule
顶层代码:
`timescale 1ns / 1ps
module divf_top(clk,clk_12,clk_10,reset_n
);
input clk,reset_n;
output clk_12,clk_10;
divf# (12) divf_12( // #代表传递参数,传递底层的N
.clk(clk),
.reset_n(reset_n),
.clk_N(clk_12)
);
divf# (10) divf_10(
.clk(clk),
.reset_n(reset_n),
.clk_N(clk_10)
);
endmodule
仿真代码`在这里插入代码片`
module devf_TB;
reg clk,reset_n;
wire clk_10,clk_12;
initial
begin
reset_n=0;
#20;
reset_n=1;
clk = 1'b0;
end
always#10 clk = ~clk; //输入时钟为50MHZ
divf_top dut
( .clk (clk),
//.clk_12 (clk_12), //10分频
.clk_10 (clk_10),
.clk_12 (clk_12),
.reset_n (reset_n) );
endmodule
仿真结果
![大家自己一定要亲手做做哦](https://img-blog.csdnimg.cn/20190510101527881.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjI5NzMwOA==,size_16,color_FFFFFF,t_70)