功能实现
简单实现一个对输入时钟的3分频。相信2分频可能是一个FPGA的初学者最先实现的模块了,但是心里一直有个疑问,3分频如何实现?最近无意中在网络上发现了一个讲解3分频实现的博客(抱歉忘了博客网址),按其方法在Vivado上实现了3分频。
3分频模块实现
实现过程很简单:
- 对输入时钟进行0-2计数;
- 依据计数值生成占空比为1/3的3分频时钟;
- 占空比为1/3的3分频时钟向后延迟半个时钟(使用输入时钟下降沿触发延迟);
- 占空比为1/3的3分频时钟与其延迟时钟取或即可。
源代码如下:
`timescale 1ns / 1ps
//功能:实现输入时钟的1.5倍频
//输入:时钟、复位
//输出:1.5倍频时钟
module top(
input clk200M ,
input rst_n ,
output freq3 //3倍频输出信号
);
reg [1:0] cnt;
reg clk_13;
reg clk_13_r;
//cnt,计数器
always @(posedge clk200M or negedge rst_n) begin
if(~rst_n)
cnt <= 2'd0;
else if(cnt == 2'd2)
cnt <= 2'd0;
else
cnt <= cnt + 'd1;
end
//clk_13,生成时钟1/3占空比的信号
always @(posedge clk200M or negedge rst_n) begin
if(~rst_n)
clk_13 <= 1'b0;
else if(cnt == 2'd2)
clk_13 <= 1'b1;
else
clk_13 <= 1'b0;
end
//clk_13_r,延迟半拍clk_13
always @(negedge clk200M or negedge rst_n) begin
if(~rst_n)
clk_13_r <= 1'b0;
else
clk_13_r <= clk_13;
end
//freq3,生成3倍频信号
assign freq3 = clk_13 | clk_13_r;
endmodule
仿真
仿真输入时钟和复位信号即可,不需要其他任何操作,源代码如下:
`timescale 1ns / 1ps
module tb_t36;
reg clk200M ;
reg rst_n ;
wire freq3 ;
top top_inst(
.clk200M ( clk200M ),
.rst_n ( rst_n ),
.freq3 ( freq3 ) //1.5倍频输出信号
);
initial begin
clk200M = 1'b0;
rst_n = 1'b0;
#100;
//
rst_n = 1'b1;
end
//时钟
always #5 clk200M = ~clk200M;
endmodule
仿真结果如图所示。