您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > Verilog常用分频器的实现
Verilog常用分频器的实现 分频器是指使输出信号频率为输入信号频率整数分之一的电子电路。在许多电子设备中如电子钟、频率合成器等,需要各种不同频率的信号协同工作,常用的方法是以稳定度高的晶体振荡器为主振源,通过变换得到所需要的各种频率成分,分频器是一种主要变换手段。早期的分频器多为正弦分频器,随着数字集成电路的发展,脉冲分频器(又称数字分频器)逐渐取代了正弦分频器。下面以Verilog HDL语言为基础介绍占空比为50%的分频器。 1.偶分频 偶分频比较简单,假设为N分频,只需要计数到N/2‐1,然后时钟翻转、计数清零,如此循环就可以得到N(偶)分频。代码如下。 module fp_even(clk_out,clk_in,rst); input clk_in,rst; output clk_out; reg [7:0] cnt; reg clk_out; `define N 6 always@(posedge clk_in or negedge rst) begin if(!rst) begin cnt=0; clk_out=0; end else begin if(cnt==`N/2‐1) begin clk_out=~clk_out; cnt=0; end else cnt=cnt+1; end end endmodule 2.奇分频 实现奇数分频(N)分频,分别用上升沿到(N-1)/2,再计数到N-1;用下降沿计数到(N-1)/2,再计数到N-1。得到两个波形,然后把它们相或即可得到N分频。代码如下。 module fp_odd(clk_in,clk_out,rst,clk_neg,clk_pos); input clk_in,rst; output clk_out,clk_pos,clk_neg; reg [7:0] cnt_pos,cnt_neg; reg clk_pos,clk_neg; `define N 5 always@(posedge clk_in or negedge rst) //从零到N‐1不停地循环计数(上升沿) begin if(!rst) cnt_pos=0; else if(cnt_pos==`N‐1) cnt_pos=0; else cnt_pos=cnt_pos+1; end always@(posedge clk_in or negedge rst) begin if(!rst) clk_pos=0; else if( cnt_pos==(`N‐1)/2 ) clk_pos=~clk_pos; else if(cnt_pos==`N‐1) clk_pos=~clk_pos; end always@(negedge clk_in or negedge rst) //从零到N‐1不停地循环计数(下降沿) begin if(!rst) cnt_neg=0; else if(cnt_neg==`N‐1) cnt_neg=0; else cnt_neg=cnt_neg+1; end always@(negedge clk_in or negedge rst) begin if(!rst) clk_neg=0; else if( cnt_neg==(`N‐1)/2 ) clk_neg=~clk_neg; else if(cnt_neg==`N‐1) clk_neg=~clk_neg; end assign clk_out=clk_neg|clk_pos; endmodule 3.任意占空比的任意分频 在 verilog程序设计中,我们往往要对一个频率进行任意分频,而且占空比也有一定的要求。现在在前面两个实验的基础上做一个简单的总结,实现对一个频率的任意占空比的分频。 比如:FPGA系统时钟是50MHz,而我们要产生的频率是880Hz,那么我们而要对系统时钟进行分频。很容易想到用计数的方法来分频:50000000/800=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的时候为低,在32767到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%了呢?呵呵。 继续让我们来看如何实现任意占空比,比如还是由50 M 分频产生880 Hz,而分频得到的信号的占空比为30%。 56818×30%=17045 module 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; endmodule
本文标题:Verilog常用分频器的实现
链接地址:https://www.777doc.com/doc-1219984 .html