FPGA学习日志——分频与降频divider
文章目录
- 分频与降频
- 偶分频——六分频器divider_six
- 实验原理
- 实验代码
- 奇分频——五分频器divider_fie
- 实验原理
- 解决方案
- 实验代码
- 降频
- 实验原理
- 降频后的波形图
- 使用降频的五/六降频代码
- 两种方式的调用
- 总结
分频与降频
偶分频——六分频器divider_six
实验框图与波形图
实验原理
当实现一个N分频的模块(N为偶数),当复位信号无效时,每个时钟上升沿到来时,计数器cnt便开始计数(注意,计数器0也占用一个时钟周期),数值依次累加1,直到计数器cnt等于N/2-1时,对输出信号取反,便实现了一个基础的偶分频模块功能。
实验代码
module divider_six
(input wire sys_clk,input wire sys_rst_n,output reg clk_out
);
reg [2:0] cnt;always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n==1'b0)cnt<=2'd0;else if (cnt==2'd2)cnt<=2'd0;else cnt<=cnt+2'd1;always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n==1'b0)clk_out<=1'd0;else if(cnt==2'd2)clk_out<=~clk_out;else clk_out<=clk_out;
endmodule
奇分频——五分频器divider_fie
实验原理
按照偶分频的思想,当计数器到一半取反时,会发现计数器为2.5并且向下取整为2,这将导致分频后的时钟不能保持50%的占空比。
实验框图与波形图
解决方案
步骤1:
增加两个变量clk_out1与clk_out2,当sys_clk上升沿并且cnt为2的时候,拉高clk_out1,当cnt为4时拉低信号clk_out1,其余时刻保持不变。同时当sys_clk下降沿时重复操作,得到clk_out2。
步骤2:
对采集到的clk_out1与clk_out2进行或操作,便可以得到占空比为50%的clk_out3,实现实验目标。
实验代码
module divider_five
(input wire sys_clk,input wire sys_rst_n,output wire clk_out
);
reg [3:0] cnt;
reg clk_out1;
reg clk_out2;
always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n==1'b0)clk_out1<=1'd0;else if(cnt==3'd2)clk_out1<=~clk_out1;else if(cnt==3'd4)clk_out1<=~clk_out1;else clk_out1<=clk_out1;
always@(negedge sys_clk or negedge sys_rst_n)if(sys_rst_n==1'b0)clk_out2<=1'd0;else if(cnt==3'd2)clk_out2<=~clk_out2;else if(cnt==3'd4)clk_out2<=~clk_out2;else clk_out2<=clk_out2;
assign clk_out=(clk_out1|clk_out2);//这里的输出信号采用组合逻辑赋值,就不会延迟一个时钟周期
endmodule
降频
实验原理
当要实现一个N分频的模块,我们可以直接让计数器cnt计数到N-1,在系统时钟上升沿拉高一个周期的高电平,此时得到的就算降频后的信号。
降频后的波形图
使用降频的五/六降频代码
//divider_six
module divider_six
(input wire sys_clk,input wire sys_rst_n,output reg clk_flag
);
reg [2:0] cnt;
always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n==1'b0)cnt<=3'd0;else if (cnt==3'd5)cnt<=3'd0;else cnt<=cnt+3'd1;
always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n==1'b0) clk_flag<=1'b0;else if(cnt==3'd4)clk_flag<=1'b1;else clk_flag<=1'b0;endmodule
//divider_five
module divider_five
(input wire sys_clk,input wire sys_rst_n,output reg clk_flag
);
reg [3:0] cnt;
always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n==1'b0)cnt<=3'd0;else if(cnt==3'd4)cnt<=3'd0;else cnt<=cnt+3'd1;
always@(posedge sys_clk or negedge sys_rst_n) if(sys_rst_n==1'b0)clk_flag<=1'b0;else if(cnt==3'd3)clk_flag<=1'b1;else clk_flag<=1'b0;endmodule
可以看到无论是奇分频还是偶分频此时输出都是一个标志信号,而且编写格式相同并且不用考虑占空比的问题。
两种方式的调用
分频调用,直接使用输出信号作为后续模块时钟
//分频调用
always@(posedge clk_out or negedge sys_rst_n) if(sys_rst_n==1'b0)a<=1'b0;else a<=a+1'b1;
降频调用,使用系统时钟,当标志信号来临时后续信号才产生变化
always@(posedge sys_clk or negedge sys_rst_n) if(sys_rst_n==1'b0)a<=1'b0;else if(clk_flag==1'b1) a<=a+1'b1;
第二种方式的信号是在系统时候的控制下,相对于第一种对时钟控制更为严格。
总结
在高速系统设计中,尽量采用降频方式,其中涉及到了全局时钟树的概念,简单来说,降频可以保证更低的时钟偏移skew和抖动jitter。其中所谓的时钟偏移,指的是从同一时钟源发出的时钟脉冲,通过不同的路径到达每个触发器的时间不同而产生的偏差称为时钟偏移。
总之:降频优于分频方式。
FPGA学习日志——分频与降频divider相关推荐
- FPGA学习日志——OV7670寄存器配置
FPGA学习日志 鼓励自己每天进行学习总结:2021.2.6 找到了ov7670寄存器的配置具体介绍 转载自: OV7670配置和调试总结--浩爹 SCCB协议介绍与应用和OV7670摄像头的寄存器配 ...
- FPGA学习日志——Risc-V架构的cpu设计
FPGA学习日志 坚持每天写总结 2021.2.18 Risc-V学习 FPGA学习日志 前言 一.RISC-V是什么? 二.学习RISC-V的探索过程 1.<手把手教你设计CPU--RISC- ...
- FPGA学习笔记——分频电路设计
FPGA学习笔记--分频电路设计 发布时间:2015-10-3023:29:52 分频就是用一个时钟信号通过一定的电路结构变成不同频率的时钟信号,这里介绍一下整数分频电路的设计方法.整数分频电路有偶数 ...
- FPGA学习日志——74hc595驱动的数码管静态显示seg_595_static
文章目录 数码管静态显示seg_595_static 实验原理 74HC595 实验框图.波形图与代码原理 数码管静态显示seg_595_static 数码管是一种半导体发光器件,其基本单元是发光二极 ...
- FPGA学习日志——半加器half_adder
半加器half_adder 半加器:用于计算两个一位二进制相加,且不考虑低位进位. 控制框图.真值表和波形: 其中count表示进位,sum表示和数. 根据真值表可以得到输入输出关系 异或符号 cou ...
- FPGA学习日志——一位全加器full_adder
全加器 全加器能进行被加数.加数和来自低位的进位信号相加,并根据求和结果给出该位的进位信号. 在电路上可以由两个半加器和一个或门构成全加器. 值得注意的是:一位全加器实现完成后,可以根据多个1位全加器 ...
- FPGA学习日志——三八译码器Decoder
三八译码器 译码器:译码是编码的逆过程,其功能是将具有特定含义的二进制码进行辨别,并转换成控制信号,具有译码功能的逻辑电路称为译码器.如果有n个二进制选择线,则最多可译码转换成2n个数据 实验框图.真 ...
- FPGA学习日志——无源蜂鸣器beep
文章目录 无源蜂鸣器beep 有源/无源蜂鸣器 无源蜂鸣器的驱动原理 实验原理 实验框图与波形 实验代码 仿真代码 无源蜂鸣器beep 有源/无源蜂鸣器 无源这里的"源"不是指电源 ...
- FPGA学习日志——触发器filp_flop
触发器flip_flop 实验框图与波形图 触发器 对时钟脉冲边沿敏感的状态更新称为触发,具有触发工作特性的储存单元称为触发器. 在实际的数字系统中往往包含大量的存储单元,并且经常要求他们在同一时刻同 ...
最新文章
- 阿里巴巴连任 Java 全球管理组织席位
- DNA甲基化与表观遗传学数据挖掘与分析学习会 (10月26-27 上海)
- LeetCode Contains Duplicate III(滑动窗口)
- 【Android Developers Training】 93. 创建一个空验证器
- 使用Eclipse PDT + Xampp搭建Php开发环境
- python property方法_Python——property(使一个方法看起来就像类属性一样)
- 14个JavaScript代码优化技巧
- 创建list集合_Java 9新增的不可变集合
- OpenShift 4 Hands-on Lab (3) - 应用部署和切换策略(蓝绿、金丝雀和A/B、回滚)
- 单表的更新UPDATE和删除记录DELETE(二十六)
- 软件项目管理 1.3.敏捷项目管理概念
- 安卓利用谷歌文字转语音引擎实现离线文字播报语音
- Mand Mobile
- Docker容器学习笔记(看了狂神视频)
- 用微信远程控制电脑?这个新玩法一定爽到你
- Android 4.4 Kit Kat 源码下载
- 以 gensim 訓練中文詞向量
- 现代人的困扰,“高刺激”的诱惑
- 警惕感冒不仅会头痛脑热,还可能引发致盲性眼病
- 自动化来袭,程序员是否正在走向另一个泡沫?
热门文章
- perl6中的q/qq/qx/qqx
- 有运气摇号来不及挑选?网易有数帮你科学选房
- 宝塔面板如何添加免费的waf防火墙?
- 暗影精灵开机只亮电源灯_为什么只有惠普暗影精灵看到了电竞人群细分诉求
- Xmind教程:思维导图原来这么简单实用!
- 直播带货这么火,如何在小程序中实现视频通话及直播互动功能?
- Android性能优化系列之Bitmap图片优化
- 线段树维护(最大区间和,最大子段和,最长连续上升子序列)
- win10键锁定计算机,Win10中最强大的键!你所不知道的Win键
- c语言 fgetc函数,C 库函数 – fgetc()