当前位置: 首页 > ops >正文

Verilog任意分频器设计

Verilog任意分频器设计

  • 有关奇分频的思考
      • 占空比小于50%的两个clk信号
      • 占空比大于50%的两个clk信号
      • 对比
  • Verilog任意分频器设计
      • Testbench

有关奇分频的思考

(这篇文章的一些写法比较简洁)Verilog 分频器设计

占空比小于50%的两个clk信号

在这里插入图片描述

占空比大于50%的两个clk信号

在这里插入图片描述

对比

所以不要死板的记,以上面的2,3电平为例:如果高电平多,就需要交错半个clk周期进行与运算,正好去掉半个周期的,高低电平就相同了。
如果是低电平多,就是交错之后或运算,高低电平就相同。

Verilog任意分频器设计

把所有的分频模块并行同时进行,只是依据参数选择性的输出。


// parameter 参数化的方法将偶数分频和奇数分频都做成通用的任意分频模块,方便以后的调用module divider_api
#(parameter	CLK_DIV 	=  12'd5,	//	分频数CNT_WIDTH 	=  12'd5	//	分频器位宽
)
(input   wire    sys_clk     ,   //系统时钟50Mhzinput   wire    sys_rst_n   ,   //全局复位output  wire    clk_out         //对系统时钟分频后的信号
);//偶分频信号
reg						clk_even		;	
reg	[CNT_WIDTH-1 : 0]	clk_even_cnt	;
//奇分频信号
wire					clk_odd			;
reg						clk_1			;
reg						clk_2			;		
reg	[CNT_WIDTH-1 : 0]	clk_1_cnt		;
reg	[CNT_WIDTH-1 : 0]	clk_2_cnt		;//所有的分频模块时同时进行的,只是依据参数选择性的输出
assign clk_out = (CLK_DIV == 1) ? sys_clk : (CLK_DIV[0] ? clk_odd : clk_even); //只需判断最后一位是0还是1即可
assign clk_odd = clk_1 & clk_2; //偶分频
always @(posedge sys_clk or negedge sys_rst_n) beginif(!sys_rst_n)beginclk_even_cnt	<= 0	;clk_even		<= 1'b0	;endelse if(clk_even_cnt == CLK_DIV / 2 - 1)	//计数到一半时翻转,计数器继续加beginclk_even_cnt	<= clk_even_cnt + 1'b1;clk_even		<= ~clk_even;endelse if(clk_even_cnt == CLK_DIV - 1		)	//计数满时翻转,计数器清零beginclk_even_cnt	<= 0		;clk_even		<= ~clk_even;endelse										//其他情况计数器加一,clkeven保持不变即可beginclk_even_cnt	<= clk_even_cnt + 1'b1;clk_even		<= clk_even;end
end//奇分频——clk1:上升沿触发
always @(posedge sys_clk or negedge sys_rst_n) beginif(!sys_rst_n)beginclk_1_cnt	<= 0	;clk_1		<= 1'b0	;endelse if(clk_1_cnt == (CLK_DIV - 1) / 2)		//计数到一半时翻转,计数器继续加beginclk_1_cnt	<= clk_1_cnt + 1'b1	;	clk_1		<= ~clk_1			;end	else if(clk_1_cnt == CLK_DIV - 1)			//计数满时翻转,计数器清零beginclk_1_cnt	<= 0		;clk_1		<= ~clk_1	;end		elsebeginclk_1_cnt	<= clk_1_cnt + 1'b1	;	clk_1		<= clk_1			;end
end//奇分频——clk2:下降沿触发
always @(negedge sys_clk or negedge sys_rst_n) beginif(!sys_rst_n)beginclk_2_cnt	<= 0	;clk_2		<= 1'b0	;endelse if(clk_2_cnt == (CLK_DIV - 1) / 2)		//计数到一半时翻转,计数器继续加beginclk_2_cnt	<= clk_2_cnt + 1'b1	;	clk_2		<= ~clk_2			;end	else if(clk_2_cnt == CLK_DIV - 1)			//计数满时翻转,计数器清零beginclk_2_cnt	<= 0		;clk_2		<= ~clk_2	;end		elsebeginclk_2_cnt	<= clk_2_cnt + 1'b1	;	clk_2		<= clk_2			;end
endendmodule

Testbench

`timescale  1ns/1nsmodule divider_api_tb();//wire  define
wire    clk_out;//reg   define
reg     sys_clk;
reg     sys_rst_n;//初始化系统时钟、全局复位
initial beginsys_clk    = 1'b1;sys_rst_n <= 1'b0;#20sys_rst_n <= 1'b1;end//sys_clk:模拟系统时钟,每10ns电平翻转一次,周期为20ns,频率为50Mhz
always #10 sys_clk = ~sys_clk;divider_api	
#(.CLK_DIV	(12'd10),.CNT_WIDTH	(12'd5)
)
divider_api_inst
(.sys_clk    (sys_clk    ),  //input     sys_clk.sys_rst_n  (sys_rst_n  ),  //input     sys_rst_n.clk_out    (clk_out    )   //output    clk_out
);endmodule

10分频
在这里插入图片描述
25分频
在这里插入图片描述

http://www.xdnf.cn/news/11278.html

相关文章:

  • 史蒂夫·乔布斯 - 简介
  • 个人博客搭建流程(域名、主机、解析、源码、搭建)全程详解
  • Template、ItemsPanel、ItemContainerStyle、ItemTemplate区别和联系
  • JSP基于Java的网咖计费管理系统91y3v程序+源码+数据库+调试部署+开发环境
  • 修改服务器网卡设置,网络适配器怎么设置网络好 完美的三种网络适配器设置方法...
  • linux虚拟机 Ubuntu 安装方法
  • iOS 7新功能汇总!
  • 《你不可不知的人性》刘墉 读书笔记(五)
  • 背单词软件 单词风暴 分享id_周一考研高效背单词系列(一):利用单词软件如何背好单词...
  • 中国最好的一些源码下载站点排名!
  • eclipse3.3.X版本中文语言包下载及安装
  • 基于单片机智能温度控制器系统设计
  • [Unity3D] 3D贪吃蛇
  • Lotus Notes 的新用户最需知道的十件事
  • 网站推广
  • ***常用工具下载大全
  • C语言多线程
  • iPhone1.1.1版简体中文汉化完全教程
  • 港台术语与内地术语之对照
  • 2024亲测可用最新PHP仿猪八戒任务威客网整站源码/在线接任务网站源码
  • Word技能-更改 Normal 模板 (Normal.dotm)
  • termux从入门到入坑
  • ORA-01157 cannot identify/lock data file n 故障一例
  • 2021年,用更现代的方法使用PGP(下)
  • 日志格式规范
  • Web服务器群集:LVS负载均衡群集
  • 层次分析法原理及实例(AHP)
  • 微信接入AI 机器人方法大全,全网最细教程
  • visual studio-wdk8.1+vs2013中使用winusb模版开发usb设备驱动
  • linux:services服务器配置