FPGA学习笔记 -- 分频器
偶分频——六分频
可以看到输出的频率对应六个系统时钟周期,即完成了六分频的任务,这里使计数器计数为2将输出波形进行反转,所以0,1,2半个周期就有了三个系统时钟周期。
此方法在低频信号中可以使用,但是在高频时钟下会出现失误, 在FPGA中所有的时钟都要连接到全局时钟网络中去,又叫全局时钟数,其目的是为了保证时钟信号到达每一个器件的时间都尽可能相同,而这种方法并没有连接到全局时钟网络中
module divider_six (input wire sys_clk,input wire rst_n,output reg out_clk ); reg [1:0] cnt; //两位宽的计数器,使用寄存器类型数据always@(posedge sys_clk or negedge rst_n) //对计数器进行判断赋值if(rst_n == 1'b0)cnt <= 2'b0;else if(cnt == 2'd2)cnt <= 2'b0;else cnt <= cnt + 2'b1;always@(posedge sys_clk or negedge rst_n) //对输出进行判断赋值,由于输出中使用了always语句所以为reg类型变量if(rst_n == 1'b0)out_clk <= 1'b0;else if(cnt == 2'd2)out_clk <= ~out_clk;else out_clk <= out_clk;endmodule
`timescale 1ns/1nsmodule tb_divider_six();reg sys_clk; reg rst_n;wire out_clk;initialbeginsys_clk = 1'b1;rst_n <= 1'b0;#20rst_n <= 1'b1;endalways #10 sys_clk = ~sys_clk;divider_six divider_six_1 (.sys_clk(sys_clk),.rst_n(rst_n),.out_clk(out_clk) );endmodule
对于上述方法的改进,可以使用脉冲标志信号
其中的clk_flag即为六分频输出,在两个clk_flag的上升沿即可视为一个周期
改进代码:
/* 通过时钟标志位的方法与直接进行波形翻转的六分频看上去效果差距不大但若是在接下来对频率进行计数时:翻转产生的六分频:always always@(posedge out_clk or negedge rst_n) 利用标志位的六分频:always always@(posedge sys_clk or negedge rst_n) 加上对标志位的判断if(clk_flag = 1'b1) 可见标志位中使用的仍然是系统的时钟周期,这在高频时钟下可以保持系统的稳定,避免了时钟网络原因`带来的偏差*/module divider_six (input wire sys_clk,input wire rst_n,// output reg out_clkoutput reg clk_flag );// reg [1:0] cnt; //两位宽的计数器,使用寄存器类型数据reg [2:0] cnt; //三位宽的计数器,使用寄存器类型数据/* always@(posedge sys_clk or negedge rst_n) //对计数器进行判断赋值if(rst_n == 1'b0)cnt <= 2'b0;else if(cnt == 2'd2)cnt <= 2'b0;else cnt <= cnt + 2'b1;always@(posedge sys_clk or negedge rst_n) //对输出进行判断赋值,由于输出中使用了always语句所以为reg类型变量if(rst_n == 1'b0)out_clk <= 1'b0;else if(cnt == 2'd2)out_clk <= ~out_clk;else out_clk <= out_clk; */always@(posedge sys_clk or negedge rst_n)if(rst_n == 1'b0)cnt <= 3'b0;else if(cnt == 3'd5)cnt <= 3'b0;else cnt <= cnt + 3'b1;always@(posedge sys_clk or negedge rst_n)if(rst_n == 1'b0)clk_flag <= 1'b0;else if(cnt == 3'd4) // 在计数终止的前一个时钟产生高电平,为在后边对标志位进行利用时会额外占用一个时钟周期clk_flag <= 1'b1;else clk_flag <= 1'b0;endmodule
奇分频——五分频——比偶分频稍难
分频法:
分别利用上升沿和下降沿作为触发,但是显然其占空比并不为50%,但是如果利用或运算可以发现其刚好可以合成最终的50%占空比的分频
module divider_five (input wire sys_clk,input wire res_n,output wire out_clk );reg [2:0] cnt; reg clk_1; reg clk_2;always@(posedge sys_clk or negedge res_n)if(res_n == 1'b0)cnt <= 3'd0;else if(cnt == 3'd4)cnt <= 3'd0;else cnt <= cnt + 1'b1;always@(posedge sys_clk or negedge res_n) //时钟上升沿时访问函数if(res_n == 1'b0)clk_1 <= 1'b0;else if(cnt == 3'd2)clk_1 <= 1'b1;else if(cnt == 3'd4)clk_1 <= 1'b0;else clk_1 <= clk_1;always@(negedge sys_clk or negedge res_n) //时钟下降沿时访问函数if(res_n == 1'b0)clk_2 <= 1'b0;else if(cnt == 3'd2)clk_2 <= 1'b1;else if(cnt == 3'd4)clk_2 <= 1'b0;else clk_2 <= clk_2; assign out_clk = (clk_1 | clk_2); //使用连续赋值语句取clk_1和clk_2的或运算endmodule
`timescale 1ns/1nsmodule tb_divider_five();reg sys_clk; reg rst_n;wire out_clk;initialbeginsys_clk = 1'b1;rst_n <= 1'b0;#20rst_n <= 1'b1;endalways #10 sys_clk = ~sys_clk;divider_five divider_five_1 (.sys_clk(sys_clk),.res_n(rst_n),.out_clk(out_clk) );endmodule
降频法:
module divider_five (input wire sys_clk,input wire res_n,//output wire out_clkoutput reg clk_flag );reg [2:0] cnt;//分频法部分 /* reg clk_1; reg clk_2;always@(posedge sys_clk or negedge res_n)if(res_n == 1'b0)cnt <= 3'd0;else if(cnt == 3'd4)cnt <= 3'd0;else cnt <= cnt + 1'b1;always@(posedge sys_clk or negedge res_n) //时钟上升沿时访问函数if(res_n == 1'b0)clk_1 <= 1'b0;else if(cnt == 3'd2)clk_1 <= 1'b1;else if(cnt == 3'd4)clk_1 <= 1'b0;else clk_1 <= clk_1;always@(negedge sys_clk or negedge res_n) //时钟下降沿时访问函数if(res_n == 1'b0)clk_2 <= 1'b0;else if(cnt == 3'd2)clk_2 <= 1'b1;else if(cnt == 3'd4)clk_2 <= 1'b0;else clk_2 <= clk_2; assign out_clk = (clk_1 | clk_2); //使用连续赋值语句取clk_1和clk_2的或运算 *///降频法 always@(posedge sys_clk or negedge res_n)if(res_n == 1'b0)cnt <= 3'd0;else if(cnt == 3'd4)cnt <= 3'd0;else cnt <= cnt + 1'b1;always@(posedge sys_clk or negedge res_n)if(res_n == 1'b0)clk_flag <= 1'b0;else if(cnt == 3'd3)clk_flag <= 1'b1;else clk_flag <= 1'b0; endmodule
`timescale 1ns/1nsmodule tb_divider_five();reg sys_clk; reg rst_n;wire clk_flag;initialbeginsys_clk = 1'b1;rst_n <= 1'b0;#20rst_n <= 1'b1;endalways #10 sys_clk = ~sys_clk;divider_five divider_five_1 (.sys_clk(sys_clk),.res_n(rst_n),.clk_flag(clk_flag) );endmodule
FPGA学习笔记 -- 分频器相关推荐
- FPGA学习笔记之Altera FPGA使用JIC文件配置固化教程
FPGA学习笔记之Altera FPGA使用JIC文件配置固化教程 很多做过单片机的朋友都知 道,我们在对MCU烧写完程序固件后,那么该程序固件就存储在了该MCU内部.即使MCU断电了再重新上电,程序 ...
- FPGA学习笔记(七): DSB调制解调的仿真
笔记七是DSB调制解调的仿真实现. DSB调制解调的实现原理:首先使用DDS产生低频正弦波信号作为调制信号,再用DDS产生高频信号作为载波信号,然后使用乘法器将两者相乘产生DSB信号,DSB信号与载波 ...
- FPGA学习笔记(1)简单的时序逻辑电路——流水灯
FPGA学习笔记(1)简单的时序逻辑电路--流水灯 编程语言为Verilog HDL 原理 (1)设计一个计数器,使开发板上的4个LED状态每500ms翻转一次.开发板上的晶振输出时钟频率为50MHz ...
- FPGA学习笔记(八)同步/异步信号的打拍分析处理及亚稳态分析
系列文章目录 一.FPGA学习笔记(一)入门背景.软件及时钟约束 二.FPGA学习笔记(二)Verilog语法初步学习(语法篇1) 三.FPGA学习笔记(三) 流水灯入门FPGA设计流程 四.FPGA ...
- FPGA学习笔记_ROM核调用与调试
FPGA学习笔记 ROM核调用与调试 1. ROM存储器IP核的使用 2. 创建.mif文件 3. In system memory content editor内存查看工具的使用 4. Signal ...
- FPGA 学习笔记:Vivado 2020.2 MicroBlaze MIG 测试 DDR3 篇尾
FPGA 学习笔记:Vivado 2020.2 MicroBlaze MIG 测试 DDR3 篇一 FPGA 学习笔记:Vivado 2020.2 MicroBlaze MIG 测试 DDR3 篇二 ...
- FPGA学习笔记(十二)IP核之FIFO的学习总结
系列文章目录 一.FPGA学习笔记(一)入门背景.软件及时钟约束 二.FPGA学习笔记(二)Verilog语法初步学习(语法篇1) 三.FPGA学习笔记(三) 流水灯入门FPGA设计流程 四.FPGA ...
- FPGA学习笔记——分频电路设计
FPGA学习笔记--分频电路设计 发布时间:2015-10-3023:29:52 分频就是用一个时钟信号通过一定的电路结构变成不同频率的时钟信号,这里介绍一下整数分频电路的设计方法.整数分频电路有偶数 ...
- 小梅哥FPGA学习笔记
小梅哥FPGA学习笔记 一.38译码器 功能: 译码器其任一时刻的稳态输出,仅仅与该时刻的输入变量的取值有关,它是一种多输入多输出的组合逻辑电路,负责将二进制代码翻译为特定的对象(如逻辑电平等).38 ...
最新文章
- mysql-5.5.59安装_MySQL-5.5 安装
- java 原生sql排序 gbk_04-SQLServer的排序规则(字符集编码)
- python小项目案例-python_flask小项目实例-编一个小网站
- jvm性能调优实战 -60 线上系统的JVM参数优化、GC问题定位排查、OOM分析解决
- mysql5.7 solo web服务器
- c++ 随机字符串_关于Python的随机数模块,你必须要掌握!
- Web框架——Flask系列之宏、继承、包含(十八)
- 移动硬盘提示无法访问使用驱动器中的光盘之前需要格式化,里面的数据怎么恢复...
- Mybatis-SpringBoot集成/配置
- viewport就是这回事
- Javascript位置 body之前、后执行顺序
- H3C OSPF综合实验
- php如何获取当前几号,PHP如何获取当前时间
- 论文中的i.e.等简写
- 学会善于总结,善于表达
- vue-cli2.x旧版本卸载不掉的问题解决方案(亲测+踩坑)附Vue脚手架安装教程
- iPhone的2D/3D游戏引擎
- Kali实现ARP欺骗
- 【图像增强】基于matlab萤火虫算法图像对比度增强【含Matlab源码 2142期】
- 各电脑恢复出厂设置总结