数字电路中有关奇数偶数分频心得

2023-10-11 13:50

本文主要是介绍数字电路中有关奇数偶数分频心得,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.1偶数分频简介

实现分频一般有两个方法,一个方法是直接使用 PLL 进行分频,比如 FPGA 或者 ASIC 设计中,都可
以直接使用 PLL 进行分频,但是这种分频倍数有时候受限于 PLL 本身的特性,比如输入 100Mhz 时钟,很
多 PLL 都实现不了分频到 1Mhz 的时钟,这个就是 PLL 本身特性限制的。还有一种实现方法就是直接使用
逻辑实现,即使用代码实现分频设计。我们本节介绍的是使用代码进行设计分频器。 本节我们先看下偶数分
频设计。
偶数分频,顾名思义,是说分频后的频率和分频前的频率比例是偶数,比如 100Mhz 时钟,进行二分频
后,就是 50Mhz。
实现偶数分频可通过一个简单计数器实现,而如果需要三分频,五分频,七分频等奇数分频,一个计数
器是不够的。
偶数分频实现比较简单,假设为 N(偶数)分频,只需计数到 N/2-1,然后时钟翻转、计数器清零,如
此循环就可以得到 N(偶)分频。 举个例子,比如晶振时钟是 100Mhz 时钟,想得到一个 25Mhz 的时钟,
那么这个是一个 100/25=4 的四分频设计, 那么按照我们刚说的计数到 4/2-1=1,然后时钟翻转、计数器清零,
就可以得到一个 24Mhz 的时钟。
2.1Verilog程序设计

//file name : even_divide_8.v
//file funciton :设计一个偶数分频器实现8分频的操作
//file date     :2023/4/6 
//file version  : 1.0version 
//author : ZihangNie//***************************************************module even_divide_8(//input signal input              sys_clk ,   //输入系统时钟input              sys_rst_n , //输入复位信号//output signal output  reg        clk_8 //输出8分频的时钟信号) ;//常量定义
parameter    WIDTH =  8 ;//寄存器定义reg  [2:0]   cnt ; //定义一个分频计数器//****************************************************
//*******************main code************************
//****************************************************//计数模块
always @(posedge sys_clk or negedge sys_rst_n) begin if (!sys_rst_n) begin cnt <= 3'b0 ; endelse if ( cnt == WIDTH/2-1) begin cnt <= 0 ; // 计数器满了测清零end else begin cnt <= cnt + 1'b1 ; //计数器没有计数满了则加一end
end	//分频模块always @(posedge sys_clk or negedge sys_rst_n) begin if (!sys_rst_n) beginclk_8 <= 1'b0 ; endelse if(cnt == WIDTH/2 - 1) beginclk_8 <=  ~clk_8 ;endelse beginclk_8 <= clk_8 ;end
end
endmodule 

2.testbench 仿真

//file name :  tb_even_divide_8.v
//file function : 实现八分频偶数计数器的仿真
//file version :1.0version
//file date : 2023/4/6 
//Author : ZihangNie//******************************************************************`timescale  1ns/1ps //f仿真时间单位1ns,仿真精度单位1psmodule tb_even_divide_8(); // 定义仿真模块//input signal 
reg                  sys_clk ; // 输入全局时钟
reg                  sys_rst_n ; //输入系统复位  //output signalwire                 clk_8 ; //输出八分频计数时钟//对模块进行初始化操作initial begin sys_clk = 1'b0 ;sys_rst_n = 1'b0 ;
#200sys_rst_n = 1'b1 ;endalways #10 sys_clk = ~sys_clk ;  //对八分频电路模块进行例化even_divide_8  u_even_divide_8(.sys_clk(sys_clk),.sys_rst_n(sys_rst_n),.clk_8(clk_8));
endmodule 

3 modlesim仿真

 从仿真结果上看实现了8分频操作

4 奇数分频器操作

//file name : odd_divide_15.v
//file function : 设计一个奇数分频器,分成15份
//file version : 1.0version
//file date  : 2023/4/6
//Author :ZihangNie
//****************************************************************
//function description : 
/*为 N分频,需从0计数到 N-1(一共N/2个基准时钟),一直循环
设计一个对基准时钟上升沿敏感的信号,每当计数到(N-1)/2-1时,时钟翻转;计数到计数器最大值时再反转
设计一个对基准时钟下降沿敏感的信号,每当计数到(N-1)/2-1时,时钟翻转;计数到计数器最大值时再反转
将 上升沿敏感的信号和 下降沿敏感的信号相与(&&)即N分频电路*/module odd_divide_15(// input signal input       sys_clk , //输入全局时钟input       sys_rst_n ,// 输入复位信号// output signal output      clk_15   //输出15分频时钟
) ;
//parameter 参数定义parameter      N = 15 ; //定义15分频参数//register 参数定义reg      [3:0]   cnt ; 
reg              pos_clk_cnt ;
reg              neg_clk_cnt ;assign     clk_15 = pos_clk_cnt && neg_clk_cnt ; //******************************************main code***************************************
//******************************************************************************************
//******************************************************************************************//计数模块
always @(posedge sys_clk or negedge sys_rst_n) beginif (!sys_rst_n) begin cnt <= 4'b0;end else if ( cnt == N - 1'b1) begincnt <= 4'b0 ; // 如果计数满了则清零endelse  begincnt <= cnt + 1'b1 ;  // 如果计数没有满则加一操作end
end//上升沿敏感触发信号
always @ (negedge sys_clk or negedge sys_rst_n) begin if(!sys_rst_n) begin pos_clk_cnt <= 1'b0 ;endelse if ( cnt == N/2- 1) begin pos_clk_cnt <= 1'b1;endelse if ( cnt == N-1 ) beginpos_clk_cnt <= 1'b0 ;endelse begin pos_clk_cnt <= pos_clk_cnt ;end 
end//下降沿敏感触发信号always @ (posedge sys_clk or negedge sys_rst_n) begin if (!sys_rst_n ) begin neg_clk_cnt <= 1'b0 ;end else if ( cnt == N/2 -1 ) beginneg_clk_cnt <= 1'b1 ;end else if (cnt ==  N/2 -1 ) begin neg_clk_cnt <= 1'b0 ;end else if (cnt == N-1 ) beginneg_clk_cnt <= 1'b0;end else beginneg_clk_cnt <= neg_clk_cnt;end
endendmodule 

这篇关于数字电路中有关奇数偶数分频心得的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/188491

相关文章

使用C语言实现交换整数的奇数位和偶数位

《使用C语言实现交换整数的奇数位和偶数位》在C语言中,要交换一个整数的二进制位中的奇数位和偶数位,重点需要理解位操作,当我们谈论二进制位的奇数位和偶数位时,我们是指从右到左数的位置,本文给大家介绍了使... 目录一、问题描述二、解决思路三、函数实现四、宏实现五、总结一、问题描述使用C语言代码实现:将一个整

数字电路专题:verilog 阻塞赋值和非阻塞赋值

verilog 阻塞赋值 和 非阻塞赋值 “=”阻塞赋值, ”<=”非阻塞赋值。阻塞赋值为执行完一条赋值语句,再执行下一条,可理解为顺序执行,而且赋值是立即执行; 非阻塞赋值可理解为并行执行,不考虑顺序,在 always 块语句执行完成后,才进行赋值。 如下面的阻塞赋值: //代码如下:module top(din,a,b,c,clk);input din;input clk;out

js算法题,给任意一个偶数,找出他的所有的质数因子

/*给任意一个偶数,找出他的所有的质数因子*/ function primeFactor(n){     var factors=[],            divistor=2;     if(typeof n !=='number'||!Number.isInteger(n)){          return 0;     }; //如果不是偶数返回0,如果是0,返回0

【时时三省】c语言例题----华为机试题< 查找组成一个偶数最接近的两个素数>

山不在高,有仙则名。水不在深,有龙则灵。                                                                         ----CSDN 时时三省 1,题目 HJ60 查找组成一个偶数最接近的两个素数 描述 任意一个偶数(大于2)都可以由2个素数组成,组成偶数的2个素数有很多种情况,本题目要求输出组成指定偶数的两个

招聘面试程序员的一些心得

         最近雅虎北研解散的消息触动了各大互联网公司 HR 的神经。公司里一下子面试的任务多了起来。正好借机会总结一下自己毕业后作面试官以来参与若干场技术面试的一点心得,分享一下。        当好一个面试官其实也很不容易,不但要练就一双火眼金睛,把优秀的人才和水货在短短的面试的几十分钟里分辨出来,同时面试官本身就是候选人观察公司的一个窗口。在面试中,面试官还要注意很多接人待

javascript如何利用for循环计算0-100的偶数和

for循环计算0-100的偶数和,首先定义一个变量等于0 for(var i=0;i<=100;i++) 利用if语句选出偶数 代码如下 <script>   var sum=0   for( var i=0;i<=100;i++)     {       if(i%2===0)         {           sum=sum+i           }

Golang-指定文本,求奇数行正数平方和

在stack看到HENNGE公司的招聘信息,于是去参加了一次线上笔试。对方法发了三道题,此为第一道题——使用Golang处理文本。 下为要求: 仔细思考后,发现一个规律: 第1行指定总行数;偶数行n指定下一行奇数行n+1行的个数;全部数据喂完后出结果,意味着最后是扔进数组,放到最后遍历。 提示: 要求不能使用for;只能使用基本库。 因为Golang的循环语句出来了for,只剩下g

android4.4的Keyguard心得

在总结锁屏代码之前,有两个中心思想要铭记于心 A) KeyguardHostView就是我们最终所要展示的界面,所以不论用什么方法手段,都要将这个KeyguardHostView添加到窗口中,后续填充它,都是细节问题 B) 那么问题来了,通常我们将一个view添加到窗口中会用什么方法呢?          答案有两种 1 WindowManager.addView()  2 Lay

qt和VS动态库调用心得

1 动态库调用 1.1 QT动态库调用 1.1.1 创建一个动态链接库步骤 1)create C++类库 2).pro文件里增加路径DESTDIR= ..\MyDebug 3)编译 注:主要的不同,两点:增加了一个***_global.h和class***SHARED_EXPORT   1.1.2 调用动态链接库 1).pro文件里增加DESTDIR= ..\MyDebug,也可

系统开发心得感想

系统总结 到现在也是写了几个小系统了图书管理,通讯录,atm。也有着不小的收获,对系统开发多少是有了点认识。 1.首先需要将大体的类和每个类所要实现的功能构思一下然后将其以用大体的代码写出来不需要实现只要把函数名写出来明白每个函数之间的功能,用什么容器来存储操作数据如何才能使代码更加简洁,以及做好类之间的联系(数据文件的存写保证数据的准确性)。 然后整理思路按顺序将具体的代码写出来每个函数功能怎样