大侠好,欢迎来到FPGA技术江湖,江湖偌大,相见即是缘分。大侠可以关注FPGA技术江湖,在“闯荡江湖”、"行侠仗义"栏里获取其他感兴趣的资源,或者一起煮酒言欢。
今天给大侠带来基于FPGA的任意分频器设计,附源码,获取源码,请在“FPGA技术江湖”公众号内回复“任意分频器设计源码”,可获取源码文件。话不多说,上货。
设计概述
在FPGA设计中,分频器一直都担任着很重要的角色,我相信很多人都已经想到了利用计算器来计算想要使用的时钟频率,但问题是仅仅利用计数器来分频,只可以实现偶数分频,而如果我需要三分频,五分频,七分频等等奇数类分频,那究竟怎么办呢?在这里,让我介绍一个可以实现任意整数分频的方法,这个办法也是同样利用了计数器来计算,跟偶数分频不一样的地方是任意整数分频利用了两个计数器来实现。
设计原理
本次设计主要是设计一个可调的分频器,设置其参数,可以调节其输出的占空比,占空比的意思就是高电平所占周期的多少。我们通知计算高电平的时间和低电平的时间来实现,其实就是我们用两个计数器来控制的。
设计架构
设计框架图:
状态转移图:
通过对两个计数器的计数,一个计算到了跳转下一个状态,等下一计数器计数到了又调回第一个状态,从而完成任意分频器的设计。
设计代码
设计模块代码:
代码语言:javascript复制module fenpinqi(clk,rst_n,clk0);
input clk;
input rst_n;
output reg clk0;
parameter HW = 7 ;
parameter LW = 3 ;
localparam s0 = 1'b0;
localparam s1 = 1'b1;
reg state;
reg [2:0] count;
always @(posedge clk or negedge rst_n)
if(!rst_n)
begin
state <= 1'b0;
count <= 3'b0;
clk0 <= 1'b0;
end
else
begin
case (state)
s0:begin
/*if(0 == HW)
state <= s1;*/
if(HW 1 > 1)
if(count < HW -1 )
begin
clk0 <= 1'b1;
count <= count 1'b1;
end
else
begin
count <= 1'b0;
state <= 1;
end
end
s1:begin
if(LW 1 > 1)
if(count < LW -1)
begin
clk0 <= 1'b0;
count <= count 1'b1;
end
else
begin
count <= 1'b0;
state <= 0;
end
end
default:state <= 0;
endcase
end
endmodule
仿真测试
测试模块代码:
代码语言:javascript复制`timescale 1ns/1ps
module fenpinqi_tb();
reg clk;
reg rst_n;
wire clk0;
parameter HW = 7;
parameter LW = 3;
initial begin
clk = 1'b1;
rst_n = 1'b0;
#200.1 rst_n = 1'b1;
#2000 $stop;
end
always #10 clk = ~clk;
fenpinqi #(.HW(HW),.LW(LW))
fenpinqi_dut(
.clk(clk),
.rst_n(rst_n),
.clk0(clk0)
);
endmodule
仿真图:
图中我们通过数上升沿的个数可以看到输出clk0的输出为高7,低3,符合我们的设计。
END
后续会持续更新,带来Vivado、 ISE、Quartus II 、candence等安装相关设计教程,学习资源、项目资源、好文推荐等,希望大侠持续关注。
大侠们,江湖偌大,继续闯荡,愿一切安好,有缘再见!