华为自助建站,自助网站制作,去掉自动升级wordpress失败提示,建设银行个人网站登陆软件版本#xff1a;无
操作系统#xff1a;WIN10 64bit
硬件平台#xff1a;适用所有系列FPGA
板卡获取平台#xff1a;https://milianke.tmall.com/
登录“米联客”FPGA社区 http://www.uisrc.com 视频课程、答疑解惑#xff01; 1概述
本小节讲解Verilog语法的时钟…软件版本无
操作系统WIN10 64bit
硬件平台适用所有系列FPGA
板卡获取平台https://milianke.tmall.com/
登录“米联客”FPGA社区 http://www.uisrc.com 视频课程、答疑解惑 1概述
本小节讲解Verilog语法的时钟分频设计需要掌握时钟的特性以及如何进行时钟分频设计。
2时钟分频
在FPGA的硬件电路设计中PCB板上需要有时钟产生源常见的外部时钟源有RC/LC 振荡电路无源/有源晶体振荡器利用石英晶体的压电效应产生谐振信号。此类时钟源频率精度高稳定性好噪声低温漂小。有源晶振中往往还加入了压控或温度补偿时钟的相位和频率都有较好的特性。
有时我们在时序电路设计中有些模块工作频率会低于外部时钟频率此时就需要对时钟进行一定的分频得到频率较低的时钟。在FPGA内部常常存在一定的PLL锁相环Phase Locked Loop资源它可以对时钟进行分频或者倍频的操作。
本小节主要介绍如何使用寄存器等资源实现时钟偶数分频、奇数分频和小数分频的。
2.1 偶数分频
偶数分频直接使用寄存器进行取反操作可以得到二分频、四分频、六分频、八分频等且占空比是50%。例
module even_div(input rst_n, //输入复位input clk, //输入时钟output clk_div //分频时钟);parameter DIV_NUM 6; //分频参数reg [15:0] clk_cnt;reg clk_out;always (posedge clk or negedge rst_n)beginif (!rst_n)beginclk_cnt b0 ;endelse if(clk_cnt ((DIV_NUM/2) -1)) beginclk_cnt b0;endelsebeginclk_cnt clk_cnt 1b1; //分频计数器end endalways (posedge clk or negedge rst_n)beginif (!rst_n)beginclk_out b0 ;endelse if(clk_cnt ((DIV_NUM/2) -1)) //计数到分频参数的一半beginclk_out ~clk_out; //产生翻转endelsebeginclk_out clk_out; //否则保持不变end endassign clk_div clk_out;endmodule 2.2 奇数分频
如果奇数分频不要求占空比是50%可以按照类似的偶数分频进行处理。如果奇数分频要求占空比是50%我们以三分频为例进行讲解如何进行奇数分频。
时序如图所示
例
module odd_div(input rst_n,input clk,output clk_div);parameter DIV_NUM 3;reg [15:0] clk_cnt;reg clk_out;reg clk_div_1;reg clk_div_2;always (posedge clk or negedge rst_n)beginif (!rst_n)beginclk_cnt b0;endelse if(clk_cnt (DIV_NUM - 1)) //产生计数beginclk_cnt b0; //clk_cnt清零复位endelsebeginclk_cnt clk_cnt 1b1; //clk_cnt为0、1、2end endalways (posedge clk or negedge rst_n) //clk上升沿触发beginif (!rst_n)beginclk_div_1 1b0;endelse if (clk_cnt (DIV_NUM 1)-1 ) //clk_cnt 为0时clk_div_1为0begin clk_div_1 1b0;endelse if (clk_cnt DIV_NUM-1) //clk_cnt 为2时clk_div_1为1begin clk_div_1 1b1;endelse begin clk_div_1 clk_div_1; //clk_cnt 为2时clk_div_1为0end endalways (negedge clk or negedge rst_n) //clk下降沿触发beginif (!rst_n)beginclk_div_2 1b0;endelse if (clk_cnt (DIV_NUM 1)-1 ) //clk_cnt 为0时clk_div_1为0begin clk_div_2 1b0;endelse if (clk_cnt DIV_NUM-1) //clk_cnt 为2时clk_div_1为1begin clk_div_2 1b1;endelse begin clk_div_2 clk_div_2;end endassign clk_div clk_div_1 | clk_div_2 ; //clk_div_1与clk_div_2产生三分频时钟endmodule 2.3 小数分频
使用Verilog不能进行精确的小数分频但是可以在长时间内达到的平均频率接近小数分频的频率。
举例说明使用平均频率求解小数分频的方法例如进行6.7倍分频需要保证源时钟67个周期的时间等于分频时钟10个周期的时间即可。此时需要在67个源时钟周期内进行3次6分频7次7分频。
具体的实现过程如下
当进行分频时考虑67个源时钟周期需要进行10次分频即需要3次每6个周期进行分频和7次每7个周期进行分频即完了6.7倍分频。我们进行分频时需要将两个分频进行穿插交替不能一直按照一种倍数频率进行分频否则会造成相位抖动过大。
如何决定分频的前后顺序呢我们根据差值进行比较来选择相应的分频倍数具体过程如下
第一次进行分频67 – 10*6 7 10 第一次进行6分频。第二次进行分频加上上次的77 14 10第二次进行7分频。第三次进行分频加上上次的74 11 10第三次进行7分频。第四次进行分频加上上次的71 8 10 , 第四次进行6分频。第五次进行分频加上上次的7815 10第五次进行7分频。第六次进行分频加上上次的75 12 10 , 第六次进行7分频。第七次进行分频加上上次的729 10第七次进行6分频。第八次进行分频加上上次的7916 10第八次进行7分频。第九次进行分频加上上次的7613 10第九次进行7分频。第十次进行分频加上上次的7310 10第十次进行7分频。
例
module frac_div(input rst_n ,input clk,output reg clk_div);parameter SOURCE_NUM 67;parameter DEST_NUM 10;parameter SOURCE_DIV SOURCE_NUM/DEST_NUM;parameter DEST_DIV SOURCE_DIV 1;parameter DIFF_ADD SOURCE_NUM - SOURCE_DIV*DEST_NUM;reg [7:0] cnt_end_num;reg [7:0] div_cnt; wire[7:0] diff_cnt;reg [7:0] diff_cnt_ff;wire diff_cnt_en;always (posedge clk or negedge rst_n)beginif (!rst_n)begindiv_cnt b0 ;clk_div 1b0 ;endelse if (div_cnt cnt_end_num)begindiv_cnt b0 ;clk_div 1b1 ;endelse begindiv_cnt div_cnt 1b1 ;clk_div 1b0 ;endendassign diff_cnt_en div_cnt cnt_end_num ;assign diff_cnt diff_cnt_ff DEST_NUM ?diff_cnt_ff -10 DIFF_ADD :diff_cnt_ff DIFF_ADD ; always (posedge clk or negedge rst_n)beginif (!rst_n)begindiff_cnt_ff 0 ;endelse if (diff_cnt_en)begindiff_cnt_ff diff_cnt ;endendalways (posedge clk or negedge rst_n)beginif (!rst_n)cnt_end_num SOURCE_DIV-1 ;else if (diff_cnt 10)cnt_end_num DEST_DIV-1 ;elsecnt_end_num SOURCE_DIV-1 ;endendmodule 如果对时钟精度等要求比较高建议使用PLL进行分频。