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×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(counter<17045) clk_div <= 1;else clk_div <= 0;endmodulertl级描述:
仿真结果:
4小结通过以上几个例子对比不难发现,借助计数器来实现任意点空比的任意分频的方法简单,且用verilog语言进行行为描述时,代码简洁、易懂、通用。通过以上的学习,对分频器有了比较深刻的认识,将在以后的学习中会有广泛的应用。

米家便携榨汁机高清图赏
简谈汉斯•彼得•卢恩与哈希算法的诞生
新型电流钳表CP系列的优点及应用
人工智能以后会取代同传吗
360宣布推出汽车安全大脑
verilog语言实现任意分频
差异数据传输有什么区别?
学术圈又出糟心新闻!NLP领域众专家谴责匿名攻击者
风电、太阳能和储能技术成本大幅度下降,储能将成为实用替代方案
冀雅电子为客户研发电加热功率分配与温度控制系统
物联网RFID技术及应用场景
iphone8什么时候上市?iphone8最新消息汇总:iphone8原型机曝光,无实体实体Home键,指纹识别会放侧面?
三星Galaxy Tab S6 5G平板今年第一季度在韩国市场推出
浅谈线对板连接器中的贴片连接器
兆易创新GD-xD-W515-EVAL板卡应用介绍
菲林底板在PCB生产中的用途
什么是pcb打样 pcb打样的重要性
预约时间确定,清新风oppo r9s绿色开卖
美国对众多俄罗斯科技公司实施了制裁,发展微芯片和其他高科技产品的计划备受阻挠
爱博精电——从电力仪表起源的电气行业长青树