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 

1 / 3
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功