大侠好,欢迎来到FPGA技术江湖,江湖偌大,相见即是缘分。大侠可以关注FPGA技术江湖,在“闯荡江湖”、"行侠仗义"栏里获取其他感兴趣的资源,或者一起煮酒言欢。
今天给大侠带来“FPGA学习系列 altera"系列,持续更新。此学习心得是本人之前所写,所用设计软件为Quartus II 13.1,现Quartus II 新版本已更新到19 ,以下仅供初学者学习参考。后续会更新其他系列,敬请关注。话不多说,上货。
对于每一个的小实验,我们都可以把它看作是一个小项目,逐步的去分析,设计,调试,最后完成功能。下面我们就开始我们的“小项目”。
项目名称:奇分频;
具体要求:奇分频且占空比为50%;
项目分析:将外部的时钟进行奇数分频,且要求占空比为50%。
架构图如下:
系统设计:
1. 工程的名称:div_freq。
2. 假设进行奇分频(3分频),只在上升沿的时候发生动作是不可能完成占空比为50%(占空比是1/3或者2/3)。所以我们考虑在时钟的上升沿和下降沿发生动作。
3. 设计方法
使用两个计数器,一个计数器在上升沿计数,一个计数器在下降沿计数(假设5分频)。
然后根据两个计数器形成对应的波形(前面3周期的高电平,后面两个低电平):
分析形成的clk1和clk2:
如果把上述的clk1和clk2相与那么就可以得出2.5周期的高电平(占空比为50%):
设计代码如下:
代码语言:javascript复制/*
模块名称:div_freq
模块功能:奇分频且占空比为50%
作者:郝旭帅
邮箱:746833924@qq.com
*/
module div_freq (clk, rst_n, clk_out);
input clk;
input rst_n;
output clk_out;
parameter N = 3;
reg [25:0] cnt1;
reg [25:0] cnt2;
wire clk1;
wire clk2;
always @ (posedge clk or negedge rst_n)
begin
if (!rst_n)
cnt1 <= 26'd0;
else
if (cnt1 < N - 1)
cnt1 <= cnt1 1'b1;
else
cnt1 <= 26'd0;
end
assign clk1 = (cnt1 <= (N - 1)/2) ? 1'b1 : 1'b0;
always @ (negedge clk or negedge rst_n)
begin
if (!rst_n)
cnt2 <= 26'd0;
else
if (cnt2 < N - 1)
cnt2 <= cnt2 1'b1;
else
cnt2 <= 26'd0;
end
assign clk2 = (cnt2 <= (N - 1)/2) ? 1'b1 : 1'b0;
assign clk_out = clk1 & clk2;
endmodule
解析:
parameter N = 3;N代表奇分频的几分频
clk1 = (cnt1 <= (N - 1)/2) ? 1'b1 : 1'b0; 如果进行N分频,那么应该先做出来高电平为(N-1)/2 1个周期,剩下的为低电平。假设为5分频,那么高电平应为(5-1)/2 1 = 3个周期。
激励代码如下:
代码语言:javascript复制/*
模块名称:div_freq_tb
模块功能:为div_freq模块提供激励信号
作者:郝旭帅
邮箱:746833924@qq.com
*/
`timescale 1ns/1ps
module div_freq_tb;
reg clk;
reg rst_n;
wire clk_out;
initial begin
clk = 1'b1;
rst_n = 1'b0;
# 200.1
rst_n = 1'b1;
# 2000
$stop;
end
always # 10 clk = ~clk;
div_freq #(
.N(5)//传递参数
)
div_freq_dut(
.clk(clk),
.rst_n(rst_n),
.clk_out(clk_out)
);
endmodule
仿真波形与上述设计时的波形一致。
如果设计要求与笔者的设计不同,请自行更改设计,以保证设计的正确性。如果还是有不明白的读者可以发邮件到我邮箱或者加群询问。
本次FPGA学习altera系列就更新到这里,后续更新其他内容,敬请关注。
END