任意整数分频Verilog(占空比50%)

程序实现任意整数分频的功能,已在modelsim中通过验证。

 1 //`define N 5
 2 module div_N (
 3      input CLK,  // 基准时钟
 4      output CLK_div_N, // N分频后得到的时钟
 5      input rst
 6     );
 7 wire [31:0] N=5; // ★ N为分频系数,N≥2即可,N的值为CLK除以CLK_div_N后取整(四舍五入)
 8
 9 /******************** 产生备用时钟1 ***************/
10 reg [31:0] cnt1;
11 reg   CLK_div_N_1;
12 always @ (posedge CLK or negedge rst)
13 begin
14 if(!rst)
15 begin
16 cnt1<=0;
17 CLK_div_N_1<=0;
18 end
19 else if(N[0]==0) // 如果N为偶数,比N%2==0这种判断方式更节省资源
20    begin
21    if(N==2) // 如果N为2
22     CLK_div_N_1 <= ~CLK_div_N_1;
23    else
24     if(cnt1==((N-2)>>1))   //比cnt1==(N-2)/2这种判断方式更节省资源
25       begin
26        cnt1 <= 0;
27        CLK_div_N_1 <= ~CLK_div_N_1;
28       end
29      else
30       cnt1 <= cnt1+1;
31     end
32   end
33 else // 如果N为奇数
34 if(cnt1==(N-1)/2)
35 begin
36 CLK_div_N_1 <= ~CLK_div_N_1;cnt1<=cnt1+1‘b1;
37 end
38 else if(cnt1==N-1) begin cnt1 <= 0;CLK_div_N_1 <= ~CLK_div_N_1;end
39 else
40 cnt1<=cnt1+1‘b1;
41
42 end
43
44 /*********************** 产生备用时钟2 *********************/
45 wire  CLK0=(N%2)? (~CLK):0; // 如果N为偶数,备用时钟2(CLK_div_N_2)恒为0,即不需要用到此备用时钟
46 reg [31:0] cnt2;
47 reg   CLK_div_N_2;
48 always @ (posedge CLK0 or negedge rst)
49 if(!rst)
50 begin
51 cnt2<=0;
52 CLK_div_N_2<=0;
53 end
54 else
55 if(cnt2==(N-1)/2)
56 begin
57 CLK_div_N_2 <= ~CLK_div_N_2;cnt2 <= cnt2+1;
58 end
59 else if(cnt2==N-1) begin cnt2 <= 0;CLK_div_N_2 <= ~CLK_div_N_2;end
60 else
61  cnt2 <= cnt2+1;
62
63
64 /******************** 产生最终分频时钟************************/
65 assign  CLK_div_N = CLK_div_N_1 | CLK_div_N_2;
66
67 endmodule 

verilog代码

`timescale 1ns/1ns
module div_N_tb;
reg CLK,rst;
wire CLK_div_N;
div_N U1(
.CLK(CLK),
.CLK_div_N(CLK_div_N),
.rst(rst)
);
initial
begin
CLK=0;
rst=0;
#5 rst=1;
forever
#5 CLK=~CLK;
end

endmodule

TB代码

图1:  9分频电路

图2:  8分频电路

解释:刚程序调好时发现,偶数分频时候,第一个分频后的时钟不是占用原时钟8clk,还以为程序有问题,细想之后,应该是偶数计数器是从0到(N/2)-1计数,每次到(N/2)-1时翻转,而第一次初始情况下cnt就是0,但新时钟却没有翻转,

时间: 2024-10-11 07:40:50

任意整数分频Verilog(占空比50%)的相关文章

任意整数分频与半整数分频

任意整数: http://www.cnblogs.com/qiweiwang/archive/2010/12/17/1909482.html 半整数: http://www.cnblogs.com/qiweiwang/archive/2010/11/30/1892169.html

基于Verilog的偶数、奇数、半整数分频以及任意分频器设计

在FPGA的学习过程中,最简单最基本的实验应该就是分频器了.由于FPGA的晶振频率都是固定值,只能产生固定频率的时序信号,但是实际工程中我们需要各种各样不同频率的信号,这时候就需要对晶振产生的频率进行分频.比如如果FPGA芯片晶振的频率为50MHz,而我们希望得到1MHz的方波信号,那么就需要对晶振产生的信号进行50分频. 分频器的设计虽然是FPGA学习过程中最简单的实验,但是真正想要把分频器的来龙去脉弄清楚,还是需要花费一番功夫的.下面先介绍一下最常见的几种分频器写法: 1.偶数分频器 相信大

基础项目(5)任意时钟分频程序设计讲解

写在前面的话 在数字逻辑电路设计中,分频器是一种基本的电路单元.通常用来对某个给定频率进行分频,以得到所需的频率.分频在FPGA的设计中一直都担任着很重要的角色,而说到分频,我相信很多人都已经想到了利用计数器计数来得到想要的时钟频率,但问题是仅仅利用计数器来分频,只可以实现偶数分频,而如果需要三分频.五分频.七分频等等奇数类分频,那应该怎么办呢?在这里,梦翼师兄为大家介绍一种可以实现任意整数分频的方法. 实现原理 这种方法同样也是利用了计数器来实现,当然我们是使用状态机来实现的.我们首先定义分频

[Verilog]任意整数(奇数,整数)分频器设计, 50%占空比

module div_clk(clk_in, divisor, clk_out); input clk_in; input divisor; output clk_out; reg clk_out = 0; wire clk_in; reg [7 : 0] count = 0; wire [7 : 0] divisor; wire odd; assign odd = divisor & 1; always @(clk_in) begin if (count == 0 && clk_

Verilog实现任意分频和占空比

任意分频模板和技巧 (一)   偶数的分频技巧 (1)       任意偶数分频(占空比为50%)的模板 /******************** N  dividen clk   (1:1) duty  Template ***************/ module clk_div( inputclk_100, output clk_out ); /********* 10 dividen clk 1:1 duty   success *********/ //  1--2--3--4--

【编程题目】有两个序列 a,b,大小都为 n,序列元素的值任意整数,无序;(需要回头仔细研究)

32.(数组.规划)有两个序列 a,b,大小都为 n,序列元素的值任意整数,无序:要求:通过交换 a,b 中的元素,使[序列 a 元素的和]与[序列 b 元素的和]之间的差最小.例如: var a=[100,99,98,1,2,3];var b=[1,2,3,4,5,40]; 首先,目标一定是先找到n个数字,使得数字和比总和的一半小,但是最接近. 思路一:开始看这道题跟之前学的动态规划很像,就想用动态规划来解.但是....做不出来........... 必须要选一半的数字让我头都大了. 思路二:

[微软]有两个序列a,b,大小都为n,序列元素的值任意整数,无序; 要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小_利用排列组合思路解决_python版

(原题出自微软公司面试题)问题如下:有两个序列a,b,大小都为n,序列元素的值任意整数,无序:要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小.例如:a=[100,99,98,1,2, 3]b=[1, 2, 3, 4,5,40] 题目是看到QQ群友发的,网上也百度了下目前已经有好几种解法了.写了半天有点晕,后面忽然想到中学时候数学里面的排列组合的方法.方法对于较短的list可行,长list组合情况太多,可能耗时太长或溢出. 1 from itertools im

判断有序整型数组中是否存在两数,相加之和等于给定的任意整数

前几天参加C++的一个面试,面试官问到这样一个问题,当时给出的第一答案是1. 遍历数组中的元素,两数相加与给定的整数进行比较,此种方法在数组个数和整数个数较小时可用. 两数之和等于任意整数,肯定有一个数小于等于任意整数的1/2,另一个数大于等于任意整数的1/2,那么只需要判断整数的一半,由于数组是排序的,可通过二分查找的方式 直接遍历数组中小于等于任意整数一半的元素,通过二分查找的方式,在数组中的有序元素不连续时,相比方法2更节省许多运算

训练三:求任意整数的降序数

题目要求: 对一个五位的任意整数,求出琦降序数 算法提示:将整数的每一位分离到一维整形数组中,再将数组a的元素按照降序排列,最后输出数组元素值, 试建立一个NUM类,完成上述操作 #include<iostream> using namespace std; class NUM { public: NUM(int x);//定义一个带参数的构造函数 void NUM_fengjie(); void NUM_paixu(); void NUM_display(); private: int a[