FPGA利用待分频时钟实现任意分频
2017-07-24 14:29
309 查看
更新,更新一下25分频的奇数分频代码,待分频时钟频率50M。
modelsim仿真
——————————————————————————————————————————————————————————————————
之前转载的一篇博客,今天晚上仔细阅读,发现写的很乱,不具备可读性和实验性。又在网上找了些资料,自己来写这个FPGA实现任意分频,看到一篇博客是利用DDS做到真正的任意分频。在误差允许的情况下对50Mclk进行任意分频也是可以的,而且开发时间短。
——————————————————————————————————————————————————————————
(一)、第一种方案是我们可以通过Quartus的PLL Ip core实现倍频和分频。
(二)、偶数倍分频很简单,大家很熟悉,通过计数器实现。若想进行N倍偶数分频,那么可以通过50Mclk触发计数器计数,当计数到(N/2 - 1)时,分频时钟翻转一次,并计数器复位。循环往复就可实现任意的偶数分频。
(三)、奇数倍分频是本篇博客的一个重点。可以分为50%占空比和非50%占空比。非50%占空比简单很多,和偶数倍分频一样,一个计数器就可以做到。
先写一下非50%占空比,以三分频为例。
50%占空比的奇数分频可以利用上面写的利用待分频时钟上升沿触 产生占空比不为50%的奇数分频和下降沿产生占空比不为50%的奇数分频,然后二者或运算就能够得到占空比50%的奇数分频。既先根据待分频时钟的上升沿和下降沿产生(N - 1)/2N分频,再将二者作或运算。以三分频为例。首先根据待分频时钟产生占空比为1/3的两个时钟信号。最后做一个或运算。
—————————————————————————————————————————————————————————————————————————————
关于小数倍的分频,等时间足够的时候,我再研究下,更上来。
module FretoFre( input clk, input rst_n, output clk_2M, output reg [4:0] Count ); //——————————————————————————————————————————————————————————————————-———————————————— // 分频时钟计数器 //reg [4:0] Count; always @ (posedge clk or negedge rst_n) begin if(!rst_n) Count <= 'd0; else if(Count >= 5'd24) Count <= 'd0; else Count <= Count + 1'b1; end //——————————————————————————————————————————————————————————————————————————————————— // 根据带分频时钟上升沿触发产生12/25占空比的时钟 reg Pos_clk; always @ (posedge clk or negedge rst_n) begin if(!rst_n) Pos_clk <= 'd0; else if(Count >= 5'd13) Pos_clk <= 1'b1; else Pos_clk <= 'd0; end //——————————————————————————————————————————————————————————————————————————————————— //根据待分频时钟下降沿触发产生12/25占空比的时钟 reg Neg_clk; always @ (negedge clk or negedge rst_n) begin if(!rst_n) Neg_clk <= 'd0; else if(Count >= 5'd13) Neg_clk <= 1'b1; else Neg_clk <= 'd0; end //——————————————————————————————————————————————————————————————————————————————————— // 或运算 assign clk_2M = Pos_clk | Neg_clk; endmodule
modelsim仿真
——————————————————————————————————————————————————————————————————
之前转载的一篇博客,今天晚上仔细阅读,发现写的很乱,不具备可读性和实验性。又在网上找了些资料,自己来写这个FPGA实现任意分频,看到一篇博客是利用DDS做到真正的任意分频。在误差允许的情况下对50Mclk进行任意分频也是可以的,而且开发时间短。
——————————————————————————————————————————————————————————
(一)、第一种方案是我们可以通过Quartus的PLL Ip core实现倍频和分频。
(二)、偶数倍分频很简单,大家很熟悉,通过计数器实现。若想进行N倍偶数分频,那么可以通过50Mclk触发计数器计数,当计数到(N/2 - 1)时,分频时钟翻转一次,并计数器复位。循环往复就可实现任意的偶数分频。
(三)、奇数倍分频是本篇博客的一个重点。可以分为50%占空比和非50%占空比。非50%占空比简单很多,和偶数倍分频一样,一个计数器就可以做到。
先写一下非50%占空比,以三分频为例。
module ArbitraryFre( input clk, input rst_n, output [1:0] Count_3, output clk_Arb3 ); reg [1:0] Count;//计数器 always @ (posedge clk or negedge rst_n) if(!rst_n) Count <= 'd0; else if(Count >= 2'd2) Count <= 'd0; else Count <= Count + 1'b1; reg clk_div3; always @ (posedge clk or negedge rst_n) if(!rst_n) clk_div3 <= 'd0; else if(Count == 2'd0) clk_div3 <= 'd0; else if(Count == 2'd2) clk_div3 <= 1'b1; else clk_div3 <= clk_div3; assign clk_Arb3 = clk_div3; assign Count_3 = Count; endmodule
50%占空比的奇数分频可以利用上面写的利用待分频时钟上升沿触 产生占空比不为50%的奇数分频和下降沿产生占空比不为50%的奇数分频,然后二者或运算就能够得到占空比50%的奇数分频。既先根据待分频时钟的上升沿和下降沿产生(N - 1)/2N分频,再将二者作或运算。以三分频为例。首先根据待分频时钟产生占空比为1/3的两个时钟信号。最后做一个或运算。
module ArbitraryFre( input clk, input rst_n, output [1:0] Count_3, output clk_Arb3 ); reg [1:0] Count;//计数器 always @ (posedge clk or negedge rst_n) if(!rst_n) Count <= 'd0; else if(Count >= 2'd2) Count <= 'd0; else Count <= Count + 1'b1; reg Posclk; always @ (posedge clk or negedge rst_n) if(!rst_n) Posclk <= 'd0; else if(Count == 2'd0) Posclk <= 'd0; else if(Count == 2'd2) Posclk <= 1'b1; else Posclk <= Posclk; reg Negclk; always @ (negedge clk or negedge rst_n) if(!rst_n) Negclk <= 'd0; else if(Count == 'd0) Negclk <= 'd0; else if(Count == 2'd2) Negclk <= 1'b1; else Negclk <= Negclk; assign Count_3 = Count; assign clk_Arb3 = Posclk | Negclk; endmodule
—————————————————————————————————————————————————————————————————————————————
关于小数倍的分频,等时间足够的时候,我再研究下,更上来。
相关文章推荐
- 如何在FPGA中利用Verilog实现任意倍的奇数分频
- FPGA实现任意分频 为所欲为——教你什么才是真正的任意分频
- 【马春杰杰】使用FPGA实现任意分频、二分频
- 利用FPGA实现PCI总线接口及Windows驱动实现
- [原创]利用php和javascript实现服务器时间电子时钟
- 利用硬件描述语言实现交通灯控制模型5,分频
- [原创][FPGA]时钟分频之奇分频(5分频)
- FPGA verilog 实现的1602 时钟计数器
- 利用Freeze技术的FPGA实现低功耗设计
- 利用FPGA实现摄像机传感器接口
- FPGA 时钟分频
- 利用widget实现一个时钟功能小插件
- 利用多线程实现电子时钟
- 利用INT 1Ah时钟中断来实现任意时间的自动开机功能
- Arduino入门笔记(7):利用1602、1302实现时钟和定时器
- FPGA——时钟分频和时钟使能的思考
- 8c 利用定时器实现时钟
- FPGA中用verilog分频实现方法
- 利用条件语句实现不同占空比的分频时钟电路
- Swift利用纯代码实现时钟效果实例代码