您的位置 首页 系统

verilog言语完成恣意分频

verilog语言实现任意分频-原文出自:分频器是指使输出信号频率为输入信号频率整数分之一的电子电路。在许多电子设备中如电子钟、频率合成器等,需要各种不同频率的信号协同工作,常用的方法是以稳定度高的晶

原文出自:分频器是指派输出信号频率为输入信号频率整数分之一的电子电路。在许多电子设备中如电子钟、频率合成器等,需求各种不同频率的信号协同作业,常用的办法是以安稳度高的晶体振荡器为主振源,经过改换得到所需求的各种频率成分,分频器是一种首要改换手法。前期的分频器多为正弦分频器,跟着数字集成电路的开展,脉冲分频器(又称数字分频器)逐步替代了正弦分频器。下面以Verilog HDL 言语为根底介绍占空比为50%的分频器。1偶分频偶分频比较简略,假设为N分频,只需计数到N/2-1,然后时钟翻转、计数清零,如此循环就能够得到N(偶)分频。代码如下。module fp_even(clk_out,clk_in,rst);output clk_out;input clk_in;input rst;reg [1:0] cnt;reg clk_out;parameter N=6;always @ (posedge clk_in or negedge rst)beginif(!rst) begin cnt = 0; clk_out = 0; endelse begin if(cnt==N/2-1) begin clk_out = !clk_out; cnt=0; end else cnt = cnt + 1; endendendmodule能够经过改动参量N的值和计数变量cnt的位宽完成恣意偶分频。偶分频(N=6)的RTL原理图:

偶分频(N=6)的行为仿真成果:

2奇分频完成奇数(N)分频,别离用上升沿计数到(N-1)/2,再计数到N-1;用下降沿计数到(N-1)/2,再计数到N-1,得到两个波形,然后把它们相或即可得到N分频。代码如下:module fp_odd(clk_out,clk_p,clk_n,clk_in,rst);output clk_out;output clk_p,clk_n;input clk_in,rst;reg [2:0] cnt_p,cnt_n;reg clk_p,clk_n;parameter N=5;always @ (posedge clk_in or negedge rst)begin if(!rst) cnt_p = 0; else if(cnt_p==N-1) cnt_p =0; else cnt_p = cnt_p + 1;endalways @ (posedge clk_in or negedge rst)begin if(!rst) clk_p = 0; else if(cnt_p==(N-1)/2) clk_p = !clk_p; else if(cnt_p==N-1) clk_p = !clk_p;endalways @ (negedge clk_in or negedge rst)begin if(!rst) cnt_n = 0; else if(cnt_n==N-1) cnt_n =0; else cnt_n = cnt_n + 1;endalways @ (negedge clk_in or negedge rst)begin if(!rst) clk_n = 0; else if(cnt_n==(N-1)/2) clk_n = !clk_n; else if(cnt_n==N-1) clk_n = !clk_n;endassign clk_out = clk_p | clk_n;endmoduleRTL SchemaTIc:

Simulate Behavioral Model:

同理,能够经过改动参量N的值和计数变量cnt_p和cnt_n的位宽完成恣意奇分频。3恣意占空比的恣意分频在verilog程序设计中,咱们往往要对一个频率进行恣意分频,并且占空比也有必定的要求这样的话,关于程序有必定的要求,现在在前面两个试验的根底上做一个简略的总结,完成对一个频率的恣意占空比的恣意分频。比方: FPGA体系时钟是50M Hz,而咱们要发生的频率是880Hz,那么,咱们需求对体系时钟进行分频。很简略想到用计数的办法来分频:50000000/880 = 56818。明显这个数字不是2的整幂次方,那么咱们能够设定一个参数,让它到56818的时分从头计数就能够完成了。程序如下:module div(clk, clk_div);input clk;output clk_div;reg [15:0] counter;always @(posedge clk)if(counter==56817) counter = 0;else counter = counter+1;assign clk_div = counter[15];endmodule分频的运用很广泛,一般的做法是先用高频时钟计数,然后运用计数器的某一位输出作为作业时钟进行其他的逻辑设计,上面的程序便是一个表现。下面咱们来算一下它的占空比:咱们清楚地知道,这个输出波形在counter为0到32767的时分为低,在32768到56817的时分为高,占空比为40%多一些,假如咱们需求占空比为50%,那么咱们需求再设定一个参数,使它为56817的一半,使到达它的时分波形翻转,就能够完成成果了。程序如下:module div(clk, clk_div);input clk;output clk_div;reg [14:0] counter;always @(posedge clk)if(counter==28408) counter = 0;else counter = counter+1;reg clk_div;always @(posedge clk) if(counter==28408) clk_div = ~clk_div;endmodule持续让咱们来看怎么完成恣意占空比,比方仍是由50 M分频发生880Hz,而分频得到的信号的占空比为30%。56818&TImes;30%=17045module div(clk,reset,clk_div,counter);input clk,reset;output clk_div;output [15:0] counter;reg [15:0] counter;reg clk_div;always @(posedge clk)if(!reset) counter = 0;else if(counter==56817) counter = 0;else counter = counter+1;always @(posedge clk)if(!reset) clk_div = 0;else if(counter17045) clk_div = 1;else clk_div = 0;endmoduleRTL级描绘:

仿真成果:

4小结经过以上几个比如比照不难发现,凭借计数器来完成恣意点空比的恣意分频的办法简略,且用verilog言语进行行为描绘时,代码简练、易懂、通用。经过以上的学习,对分频器有了比较深入的知道,将在今后的学习中会有广泛的运用。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qianrushi/xitong/179643.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部