1、偶分频

偶分频比较简单,假设为N分频,只需计数到N/2-1,然后时钟翻转、计数清零,如此循环就可以得到N(偶)分频。代码如下。

module fp_even(clk_in,rst_n,clk_out);
    input clk_in;
    input rst_n;
    output clk_out;

reg [1:0] cnt;
    reg clk_out;
    parameter N=6;

always @ (posedge clk_in or negedge rst_n) begin
        if(!rst_n)    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,rst_n,clk_out);

input  clk_in,rst_n;
    output clk_out;
 
    reg [2:0] cnt_p,cnt_n;
    reg clk_p,clk_n;
    parameter N=7;
 
    always @ (posedge clk_in or negedge rst_n) begin
        if(!rst_n)     
            cnt_p <= 0;
      else if(cnt_p==N-1)    
            cnt_p <=0;
        else 
            cnt_p <= cnt_p + 1;
    end
    
    always @ (posedge clk_in or negedge rst_n) begin
        if(!rst_n) 
            clk_p <= 0;
        else if(cnt_p==(N-1)/2)
            clk_p <= !clk_p;
        else if(cnt_p==N-1)
            clk_p <= !clk_p;
    end

always @ (negedge clk_in or negedge rst_n) begin
        if(!rst_n)     
            cnt_n <= 0;
        else if(cnt_n==N-1)    
            cnt_n <=0;
        else 
            cnt_n <= cnt_n + 1;
    end

always @ (negedge clk_in or negedge rst_n) begin
        if(!rst_n) 
            clk_n <= 0;
        else if(cnt_n==(N-1)/2)
            clk_n <= !clk_n;
        else if(cnt_n==N-1)
            clk_n <= !clk_n;
    end

assign clk_out = clk_p | clk_n;

endmodule

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%=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(counter<17045) clk_div <= 1;

else clk_div <= 0;

endmodule

verilog 语言实现任意分频相关推荐

  1. Verilog实现之任意分频电路

    一.行波时钟 任意分频电路,相信很多人都听说过这个专业名词,好多视频上都说不建议使用计数器产生的分频时钟.其实在FPGA领域当中,由寄存器分频产生的时钟还有一个学名叫做,行波时钟.是由时序逻辑产生比如 ...

  2. 对于Verilog语言的一些总结

    1.不使用初始化语句: 2.不使用延时语句: 3.不使用循环次数不确定的语句,如:forever,while等: 4.尽量采用同步方式设计电路: 5.尽量采用行为语句完成设计: 6.always过程块 ...

  3. 为所欲为——教你什么才是真正的任意分频

    转自http://www.cnblogs.com/crazybingo/archive/2011/07/26/2117162.html 一.为啥要说任意分频 也许FPGA中的第一个实验应该是分频实验, ...

  4. 怎么运行verilog语言_(六) Verilog入门之有限状态机

    现在让我们回到主线,继续FPGA编程的学习.之前我们我们在测试FPGA是否工作时所用到的代码里面有组合逻辑,如加法器:也有时序逻辑,如将时钟信号分频而得到的闪烁灯. 但如何组合这两种逻辑实现我们所需的 ...

  5. Verilog语言实现并行(循环冗余码)CRC校验

    1 前言 (1)    什么是CRC校验? CRC即循环冗余校验码:是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定.循环冗余检查(CRC)是一种数据传输检错功能, ...

  6. Verilog语言与数字系统设计

    学习Verilog语言必要的基础知识 计算机导论 数字逻辑或数字电路与逻辑设计 计算机科学概论 拓展学习: 计算机组成原理 计算机体系结构 学习视频链接: 基于FPGA的Verilog语法基础课程(至 ...

  7. FPGA分频电路实现(奇数,偶数,小数半分频,任意分频)

    https://blog.csdn.net/weixin_43950612/article/details/104687942(简介明了,奇数,偶数,小数,任意分频) http://www.myexc ...

  8. Verilog语言要素(二)

    1 Verilog语言要素 1.2 标识符-关键字-属性 1.2.1 标识符(Identifier) 规范原文如下: An identifier is used to give an object a ...

  9. Verilog语言- 和c语言的区别

    1.Verilog基础 1.1 特别的数值种类 x 或 X:未知 z 或 Z:高阻 (Z 常见于信号(input, reg)没有驱动时的逻辑结果.例如一个 pad 的 input 呈现高阻状态时,其逻 ...

最新文章

  1. 因为WMI配置,无法执行Sql Server 系统配置检查器的解决办法
  2. Win64 驱动内核编程-16.WFP网络监控驱动(防火墙)
  3. .NET Core 2.1中改进的堆栈信息
  4. dotween曲线运动 unity_Unity3D DOTween动画插件详解
  5. MySQL 之 query cache
  6. ros 三线负载均衡
  7. HFSS天线设计过程学习笔记
  8. lammps教程:EAM势函数设置详解
  9. dede-采集替换关键词为空
  10. id导出pdf失败_indesign导出pdf失败怎么办
  11. 支付宝当面付(统一收单线下交易预创建,二维码扫码支付)
  12. win10中安装centos7双系统
  13. 青苹果linux版本客户端,青苹果影院新版本
  14. Xcode 8.0 Beta发布,详解Swift语言的重大变化
  15. 蓝湖--UI切图软件,适用于ios,安卓,Web
  16. MINI-UI V3.0 开发框架 非常容易上手
  17. 利用R语言对贷款客户作风险评估
  18. android控制创维电视,创维电视怎么连接手机 创维电视连接手机的方法【详细介绍】...
  19. 头脑风暴法利用计算机让大家进行思想交流,个人与团队管理期末复习
  20. 02 创建一个简单的Python Web程序应用

热门文章

  1. 中国视频点播vod系统 v4.2 build 2002.09.21 是什么
  2. 不能将类型“Ref.......“分配给类型“(...args: any) => void”。
  3. java.lang.IllegalStateException: Error processing condition on com.alibaba.cloud.nacos.discovery.rea
  4. 机器学习实战三: 预测汽车油耗效率 MPG
  5. Live预告 | 地平线李星宇:智能汽车电子构架如何变革迎接数字化重塑?
  6. C语言实现选择排序——简单选择排序算法
  7. 生态农业示范园区物联网平台建设方案
  8. 快速构建智慧社区场景的一种技术方案
  9. RN终止所有节点进程并启动npm服务器命令
  10. 基于TC358870XBG的头戴式显示方案