任意小数分频设计

对于任意小数分频,如果有PLL的话,直接倍频再分频即可;或常用的方法有双模前置小数分频和脉冲删除小数分频。前一种方法设计较为复杂,因此主要以第二种方式为主设计了一下。

 

任意小数均可以化为分数,例如要进行5.3分频即53/10分频,因此之后全部以分数来表示。

 

以13/4分频为例,我们首先要想明白什么是13/4分频。什么是2分频呢?就是每两个输入时钟得到一个输出时钟,4分频就是4/1即四个输入时钟得到一个输出时钟,因此13/4分频其实就是13个输入时钟得到4个输出时钟,想明白这一点很重要。

 

在双模前置小数分频设计中,虽然这个设计我还没完成不过也提一下,是通过分数值的前后两个正数数分频选择输出得到最终结果的。对于13/4而言:

 

M = 13/4 = 3 ... 1

这意味着13/4的分频可以通过3分频和4分频选择输出得到,继续计算:

 

 

a + b = 4
3a + 4b = 13

得到a=3,b=1。也就是说通过3个3分频和1个4分频可以得到13/4分频。

 

 

在不考虑其他情况仅仅做简单选择输出的话,可以画出这样的时序图:

可以看到通过3分频和4分频“凑”出了13/4分频,不过这样的时钟我觉得用处不大。当然了真正这样设计时不能这样简单的先3个3分频再1个4分频,还有一些处理,这里就先不提了。

 

还是回到刚刚话,13/4分频其实就是13个输入时钟得到4个输出时钟,因此脉冲删除小数分频相对比较简单。意思就是在13个输入时钟里我删掉9个时钟周期,这样不就书粗了4个时钟周期了么,就是这样。那应该怎么删呢,查了一些论文后得到结论:

1.设置寄存器cnt位宽自定,我用的[7:0],初始值为0;

2.在clk_in的上升沿+4,并判断是否大于13,若大于13在下一周期-13;

3.cnt小于13时候,删除脉冲信号delete=1,大于13时候delete=0;

说起来比较乱,画个表表示下,每12个周期我们作为一个循环来看:

 

时钟序号cnt值是否删除
04Y
18Y
212Y
3(16->)3N
47Y
511Y
6(15->)2N
76Y
810Y
9(14->)1N
105Y
119Y
12(13->)0N
04 

 

从表中可以看到每13个周期有4个周期没有被删除,刚好满足要求。

 

我们再来试一个,11/9吧:

时钟序号cnt值是否删除
09Y
118->7N
216->5N
314->3N
412->1N
510Y
619->8N
717->6N
815->4N
913->2N
1011->0N
09 

可以看到11个时钟里有删除了2个,输出了9个,完美。

 

下面以代码用进行测试设计,代码中fraction是分频的分子,denominator 是分母,以参数形式设置,testbench中进行传入。

module DIV(input clk_in			,input rst				,output clk_out);
parameter fraction = 1;
parameter denominator = 1;reg  [7:0]cnt;
reg delete;
always @(posedge clk_in or posedge rst) beginif (rst) begin// resetcnt <= 0;delete <= 0;endelse if (cnt > fraction) begincnt <= cnt + denominator - fraction;delete <= 0;endelse begincnt <= cnt + denominator;delete <= 1;end
endassign clk_out = delete ? 1 : clk_in;
endmodule

 

testbench文件,测试21/8分频。cnt_in和cnt_out仅仅是为了方便数输入时钟和输出时钟而设置的,没有实际意义:

module tb;// Inputsreg clk_in;reg rst;// Outputswire clk_out;parameter fraction = 21;parameter denominator = 8;// Instantiate the Unit Under Test (UUT)DIV #(.fraction(fraction),.denominator(denominator))uut (.clk_in(clk_in),.rst(rst),.clk_out(clk_out));initial beginclk_in = 0;forever #2 clk_in = ! clk_in;endinitial beginrst = 1;forever #50 rst = 0;endreg [7:0]cnt_in, cnt_out;
always @(posedge clk_in or posedge rst) beginif (rst) begin// resetcnt_in <= 0;endelse if (cnt_in == fraction) begin// resetcnt_in <= 1;endelse begincnt_in <= cnt_in + 1;end
endalways @(posedge clk_out or posedge rst) beginif (rst) begin// resetcnt_out <= 0;endelse if (cnt_out == denominator) begin// resetcnt_out <= 1;endelse begincnt_out <= cnt_out + 1;end
endendmodule


仿真波形图: 

从红框区域可以看得出,21个输入周期刚好输出8个输出周期,当然这计数可以不怎么看,我们自己会数嘛。

 

ps.

在网上还看到了另外一种方式,感觉思路有点相似,也是相加超过分子后就减去分子再相加,把实现的代码贴在这里:

module DIV(input clk_in			,input rst				,output reg clk_out);
parameter fraction = 1;
parameter denominator = 1;reg  [8:0]cnt;
wire vld;assign vld 	 = ((cnt >= fraction>>1) && (cnt < fraction)) ? 1 : 0;always @(posedge clk_in or posedge rst) beginif (rst) begin// resetcnt <= 0;endelse if(cnt > fraction) begincnt <= cnt + denominator - fraction;endelse begincnt <= cnt + denominator;end
endalways @(posedge clk_in or posedge rst) beginif (rst) begin// resetclk_out <= 0;endelse if (vld) beginclk_out <= 1;endelse beginclk_out <= 0;end
endendmodule

 

同样用之前的testbench做21/8的分频,看波形: 

的确是实现了目的,不过好乱的波形呀。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/253814.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Bootstrap--圆角图片`圆形图

转载于:https://www.cnblogs.com/qiyiyifan/p/6159823.html

逻辑综合——概述与基本概念

逻辑综合系列主要说明以下问题&#xff1a; 为什么要逻辑综合逻辑综合的基本原理逻辑综合需要提供哪些文件逻辑综合过程中施加约束逻辑综合能产生那些结果 综合是前端设计的重要步骤之一&#xff0c;其过程是将行为描述的电路、RTL级的电路转换到门级&#xff0c;其目的在于&a…

Swoole 源码分析——Server模块之初始化

前言 本节主要介绍 server 模块进行初始化的代码&#xff0c;关于初始化过程中&#xff0c;各个属性的意义&#xff0c;可以参考官方文档&#xff1a; SERVER 配置选项 关于初始化过程中&#xff0c;用于监听的 socket 绑定问题&#xff0c;可以参考&#xff1a; UNP 学习笔记—…

linux下搭建git服务器

安装 Git Linux 做为服务器端系统&#xff0c;Windows 作为客户端系统&#xff0c;分别安装 Git 服务器端&#xff1a; #yum install -y git 安装完后&#xff0c;查看 Git 版本 [rootlocalhost ~]# git --version git version 1.7.1 客户端&#xff1a; 下载 Git for Windows&…

mkcramfs 命令学习

mkcramfs :创建只读文件系统 语 法 mkcramfs[必要参数][选择参数][源目录][目标文件]功 能mkcramfs 命令&#xff1a;用来创建CRAMFS只读文件系统 类似命令: fdisk cramfsck mount 执行权限: 超级用户 普通用户 命令属性: 磁盘维护 参数必要参数 -e 设置文件系…

对于Eclipse的正确用法

有时候我们刚刚修改了工程里的文件 但是启动的时候它硬是说你有东西没有声明 而那个东西又明明在那里。。 这时候我们可以认为实际与它调用的工程关系文件&#xff08;我假想的&#xff09; 不同步。。 我们可以通过clean功能来同步实际情况和工程关系文件 所以说我们每次改了之…

逻辑综合——工艺库

一、库文件的设置 运行DC时需要用到的库文件有&#xff1a;目标库&#xff08;target library&#xff09;、链接库&#xff08;link library&#xff09;、符号库&#xff08;symbol library&#xff09;、算术运算库&#xff08;synthetic library&#xff09;。 1、目标库…

weka 初练之 文本分类

0.注意weka的中文编码RunWeka.ini-----》fileEncodingutf-81.首先对分词后的 无新词发现的分词文件&#xff0c;转换成arff文件 命令java weka.core.converters.TextDirectoryLoader -dir D:\weibo\catagory\data10W\nlpirSegment\noNI > D:\weibo\catagory\data10W\nlpirSe…

[COGS 0065][NOIP 2002] 字串变换

65. [NOIP2002] 字串变换 ★★ 输入文件&#xff1a;string.in 输出文件&#xff1a;string.out 简单对比时间限制&#xff1a;1 s 内存限制&#xff1a;128 MB [问题描述] 已知有两个字串A\$, B\$及一组字串变换的规则&#xff08;至多6个规则&#xff09;: A1\$ ->…

基与datatable的分页

在进行分页操作前&#xff0c;必须知道开启服务器模式后会向服务器发送的参数的含义&#xff1a; length:告诉服务器每页显示的数据条数 start&#xff1a;第一条数据的起始位置 draw:绘制计数器&#xff0c;&#xff08;特殊&#xff1a;服务器接收到参数后&#xff0c;需要返…

linux sock_raw原始套接字编程

sock_raw原始套接字编程可以接收到本机网卡上的数据帧或者数据包,对与监听网络的流量和分析是很有作用的.一共可以有3种方式创建这种socket1.socket(AF_INET, SOCK_RAW, IPPROTO_TCP|IPPROTO_UDP|IPPROTO_ICMP)发送接收ip数据包2.socket(PF_PACKET, SOCK_RAW, htons(ETH_P_IP|E…

逻辑综合——施加约束

Design Compiler时一个约束驱动&#xff08;constraint-driven&#xff09;的综合工具&#xff0c;它的结果与设计者施加的约束条件密切相关。 一、面积约束 进行面积的约束&#xff0c;也就是告诉DC综合的电路面积要在多少以内。在介绍约束命令之前&#xff0c;先了解一下面积…

[Codevs] 1004 四子连棋

1004 四子连棋 时间限制: 1 s空间限制: 128000 KB题目等级 : 黄金 Gold题目描述 Description在一个4*4的棋盘上摆放了14颗棋子&#xff0c;其中有7颗白色棋子&#xff0c;7颗黑色棋子&#xff0c;有两个空白地带&#xff0c;任何一颗黑白棋子都可以向上下左右四个方向移动到相邻…

链接中获取文件名

算得上是-test.pdf 获取文件名 var str http://aaa.com/s/ddd/算得上是-test.pdf; console.log(str.match(/([^/*.])\.\w$/)) console.log(str.match(/([^/*.])\.\w$/)[0]) // 转载于:https://www.cnblogs.com/cssfirefly/p/6163370.html

逻辑综合——优化电路

对进行时序路径、工作环境、设计规则等进行约束完成之后&#xff0c;DC就可以进行综合、优化时序了&#xff0c;DC在优化过程中主要的策略将在下面进行说明。然而&#xff0c;当普通模式下不能进行优化的&#xff0c;就需要我们进行编写脚本来改进DC的优化来达到时序要求。 DC…

DOM包裹wrap()方法

DOM包裹wrap()方法 如果要将元素用其他元素包裹起来&#xff0c;也就是给它增加一个父元素&#xff0c;针对这样的处理&#xff0c;JQuery提供了一个wrap方法 .wrap( wrappingElement )&#xff1a;在集合中匹配的每个元素周围包裹一个HTML结构 简单的看一段代码&#xff1a; &…

usleep函数

usleep功能把进程挂起一段时间&#xff0c; 单位是微秒&#xff08;百万分之一秒&#xff09;&#xff1b; 头文件&#xff1a; unistd.h 语法: void usleep(int micro_seconds); 返回值: 无 内容说明&#xff1a;本函数可暂时使程序停止执行。参数 micro_seconds 为要暂停的微…

限制Xamarin获取图片的大小

限制Xamarin获取图片的大小在App开发中&#xff0c;经常会使用网络图片。因为这样不仅可以减少App的大小&#xff0c;还可以动态更新图片。但是手机使用网络环境千差万别。当网络环境不是理想的情况下&#xff0c;加载网络图片就是一个棘手的问题了。为了避免长时间加载图片影响…

Linux应用开发自学之路

前言 在 「关于我 」那篇博文里&#xff0c;朋友们应该知道了我不是科班出身&#xff0c;是由机械强行转行到Linux应用开发方向。下面我就详细向大家介绍自己这一路上的转行历程&#xff0c;希望对大家有所启发。 我是学机械专业的&#xff0c;对于机械专业我还是很感兴趣&…

Verdi 基础教程

一、Verdi 功能 查看设计debugVerdi不能自己产生波形 二、Verdi使用流程 1、Verdi环境配置 .bashrc中配置 export Verdi_HOME$Synopsys_Dir/Verdi2015 #export NOVAS_HOME$Synopsys_Dir/Verdi2015 export PATH$Verdi_HOME/bin:$PATH export LD_LIBRARY_PATH"/opt/Syno…