奇分频电路如何实现? 负沿触发&非负沿触发
请设计一个奇分频电路,占空比为50%?
以下给出解答:
1、带负沿触发
module div //带负沿触发
#(parameter N = 5) //定义分频参数
(
input sys_clk ,
input sys_rst_n ,
output div_clk
); // 核心:在上下边沿的计数器 计数至 N/2 翻转 计数至 N-1 再翻转
// 上下边沿脉冲信号 或运算 即可得到最终的 奇分频结果 占空比50%
reg clk_pose ; //上升沿
reg clk_nege ; //下降沿
reg [N:0] cnt_pose ; //上升沿计数
reg [N:0] cnt_nege ; //下降沿计数 always@(posedge sys_clk or negedge sys_rst_n) begin //在上升沿计数
if(!sys_rst_n)
cnt_pose<='d0;
else if(cnt_pose==N-1)
cnt_pose<='d0;
else
cnt_pose<=cnt_pose+'d1;
end
always@(negedge sys_clk or negedge sys_rst_n) begin //在下升沿计数
if(!sys_rst_n)
cnt_nege<=1'b0;
else if(cnt_nege==N-1)
cnt_nege<='d0;
else
cnt_nege<=cnt_nege+'d1;
end always@(posedge sys_clk or negedge sys_rst_n) begin
if(!sys_rst_n)
clk_pose<=1'b0;
else if(cnt_pose==N/2)
clk_pose<=~clk_pose;
else if(cnt_pose==N-1)
clk_pose<=~clk_pose;
else
clk_pose<=clk_pose;
end
always@(negedge sys_clk or negedge sys_rst_n) begin
if(!sys_rst_n)
clk_nege<=1'b0;
else if(cnt_nege==N/2)
clk_nege<=~clk_nege;
else if(cnt_nege==N-1)
clk_nege<=~clk_nege;
else
clk_nege<=clk_nege;
end assign div_clk= clk_nege |clk_pose ; //上升沿 和下降沿 或运算 得到 奇分频 endmodule
`timescale 1ns/1ns
module tb_div();
reg sys_clk ;
reg sys_rst_n ;
wire div_clk ; initial begin
sys_clk<=1'b0;
sys_rst_n<=1'b0;
#20
sys_rst_n<=1'b1;
end always #10 sys_clk<=~sys_clk; div #(.N()) //可自己定义想要的分频参数
div_inst(
.sys_clk (sys_clk) ,
.sys_rst_n (sys_rst_n) ,
.div_clk (div_clk)
); endmodule
波形图如下



2、不带负沿触发
module div //不带负边沿触发
#(parameter N = 5) //定义分频参数
(
input sys_clk ,
input sys_rst_n ,
output div_clk
); // 核心:构造一个与时钟相反的新时钟 在原时钟域下 在前N/2 时钟周期保持0 后面 N/2+1 ~N-1 翻转
// 在新时钟域下 在原时钟域下 在前N/2 时钟周期保持0 后面 N/2+1 ~N-1 翻转
//在新时钟域下 对分频寄存器打拍一拍
//对两个时钟域下的分频时钟寄存器想或 得到 奇分频结果 占空比50%
reg clk_0 ; //原时钟域
reg clk_1 ; //新时钟域下
reg clk_2 ; //新时钟域下
reg [N:0] cnt ; //原时钟域上升沿计数
wire sys_clk_0 ; //构造的新时钟域 assign sys_clk_0=~sys_clk ; always@(posedge sys_clk or negedge sys_rst_n) begin //在上升沿计数
if(!sys_rst_n)
cnt<='d0;
else if(cnt==N-1)
cnt<='d0;
else
cnt<=cnt+'d1;
end always@(posedge sys_clk or negedge sys_rst_n) begin
if(!sys_rst_n)
clk_0<=1'b0;
else if(cnt<=N/2)
clk_0<=1'b0;
else
clk_0<=1'b1;
end always@(posedge sys_clk_0 or negedge sys_rst_n) begin
if(!sys_rst_n) begin
clk_1<=1'b0;
clk_2<=1'b0;
end
else if(cnt<=N/2) begin
clk_1<=1'b0;
clk_2<=clk_1;
end
else begin
clk_1<=1'b1;
clk_2<=clk_1;
end
end assign div_clk= clk_0 |clk_2 ; //对两个时钟域下的分频时钟寄存器想或 得到 奇分频结果占空比50% endmodule
`timescale 1ns/1ns
module tb_div();
reg sys_clk ;
reg sys_rst_n ;
wire div_clk ; initial begin
sys_clk<=1'b0;
sys_rst_n<=1'b0;
#20
sys_rst_n<=1'b1;
end always #10 sys_clk<=~sys_clk; div #(.N()) //可自己定义想要的分频参数
div_inst(
.sys_clk (sys_clk) ,
.sys_rst_n (sys_rst_n) ,
.div_clk (div_clk)
); endmodule
波形图如下:



以上是本人对奇分频电路的总结,若有不对的地方,敬请指正,万分感谢。
参考资料:
1、奇数分频--不使用负边沿触发verilog实现(占空比50%) - 影-fish - 博客园 (cnblogs.com)
奇分频电路如何实现? 负沿触发&非负沿触发的更多相关文章
- Verilog学习笔记简单功能实现(六)...............计数分频电路
在分频器电路中最重要的概念有两个:1)奇分频/偶分频:2)占空比. A)其中最简单的就是二分频电路,占空比为50%,其Verilog程序为 module half_clk(clr,clk_in,clk ...
- 背水一战 Windows 10 (24) - MVVM: 通过 Binding 或 x:Bind 结合 Command 实现,通过非 ButtonBase 触发命令
[源码下载] 背水一战 Windows 10 (24) - MVVM: 通过 Binding 或 x:Bind 结合 Command 实现,通过非 ButtonBase 触发命令 作者:webabcd ...
- 实例浅析epoll的水平触发和边缘触发,以及边缘触发为什么要使用非阻塞IO
一.基本概念 我们通俗一点讲: Level_triggered(水平触发):当被监控的 ...
- MVVM: 通过 Binding 或 x:Bind 结合 Command 实现,通过非 ButtonBase 触发命令
介绍背水一战 Windows 10 之 MVVM(Model-View-ViewModel) 通过 Binding 或 x:Bind 结合 Command 实现,通过非 ButtonBase 触发命令 ...
- epoll的水平触发和边缘触发,以及边缘触发为什么要使用非阻塞IO
转自:http://www.cnblogs.com/yuuyuu/p/5103744.html 一.基本概念 ...
- [原创][FPGA]时钟分频之奇分频(5分频)
0. 简介 有时在基本模块的设计中常常会使用到时钟分频,时钟的偶分频相对与奇分频比较简单,但是奇分频的理念想透彻后也是十分简单的,这里就把奇分频做一个记录. 1. 奇分频 其实现很简单,主要为使用两个 ...
- 条件触发和边缘触发 及 epoll 的长处
条件触发: 仅仅要输入缓冲有数据就会一直通知该事件 边缘触发: 输入缓冲收到数据时仅注冊1次该事件.即使输入缓冲中还留有数据,也不会再进行注冊 水平触发(level-triggered.也被称为条件触 ...
- jenkins 判断是手动触发还是定时器触发
根据变量BUILD_CAUSE的值可以判断本次触发是手动触发还是定时器触发 手动触发:MANUALTRIGGER 定时器触发:TIMERTRIGGER
- epoll的边缘触发与水平触发
epoll的边缘触发与水平触发 Tcp连接是双向的,内核为每个socket维护两个缓冲区,读缓冲区与写缓冲区,内核会一个关注这两个缓冲区,当采用水平触发时,对于写缓冲区而言,如果有多余空间可写,对于读 ...
- 如何用代码而非事件触发PBO
通常我们通过抛出事件触发PBO,但若没有事件发生时,我们其实也可以用代码强制发出命令. 写法如下: CL_GUI_CFW=>SET_NEW_OK_CODE( NEW_CODE = <uco ...
随机推荐
- 第三方接口调用httpUtils
1.GET 请求 public static JSONObject getHttpGetResp(String url, String authorization, String title) { H ...
- VUE的路由懒加载及组件懒加载
一,为什么要使用路由懒加载 为给客户更好的客户体验,首屏组件加载速度更快一些,解决白屏问题 二,懒加载简单来说就是延迟加载或按需加载,即在需要的时候的时候进行加载 三,常用的懒加载方式有两种:即使用v ...
- 【机器学习与深度学习理论要点】26.请列举AlexNet的特点
请列举AlexNet的特点 使用ReLU作为激活函数,并验证其效果在较深的网络超过了Sigmoid,成功解决了sigmoid在网络较深时梯度消失问题 使用dropout(丢弃学习)随机忽略一部分神经元 ...
- JUC并发常用工具学习
今天主要来和大家分享一下JUC相关的一些简单知识,线程池文章就不介绍了,前面的文章有介绍,本文主要介绍Lock和认识synchronized和并发的一些工具类的使用. Lock 传统的锁有synchr ...
- SpringBoot如何自定义一个starter
SpringBoot starter,大家应该在平常写项目中应该非常熟悉,很多依赖都会提供集成SpringBoot的依赖,这样我们用起来就非常顺手,开箱就能用,那如何自定义一个starter呢? Sp ...
- java封装和关键字
一.封装 封装:告诉我们如何正确设计对象的属性和方法 对象代表什么,就得封装对应的数据,并提供数据对应的行为 封装的好处: 让编程变得很简单,有什么事,找对象,调方法 降低学习成本,可以少学,少记,或 ...
- vue中让嵌入的iframe完美自适应宽度、高度
涉及到系统集成的时候,前端我们经常会用到iframe嵌入,但是嵌入的时候经常有不适应的情况,太长或太宽.滚动条... 下面的方法可以做到使嵌入的iframe自适应宽度.高度, 1.嵌入iframe,加 ...
- 2023-04-05:做甜点需要购买配料,目前共有n种基料和m种配料可供选购。 制作甜点需要遵循以下几条规则: 必须选择1种基料;可以添加0种、1种或多种配料,每种类型的配料最多添加2份, 给定长度为
2023-04-05:做甜点需要购买配料,目前共有n种基料和m种配料可供选购. 制作甜点需要遵循以下几条规则: 必须选择1种基料:可以添加0种.1种或多种配料,每种类型的配料最多添加2份, 给定长度为 ...
- MYSQL数据库的创建和删除
打开Windows命令行,输入登录用户和密码 mysql -h localhost -u root -p 创建新数据 CREATE DATABASE zoo; 查看系统中的数据库 SHOW DATAB ...
- es mysql 适用场景对比
es mysql 适用场景对比 问题一 全文检索毫无疑问直接上es,那么除了这种场景,什么时候该选es?为啥mysql不行? 对枚举字段的搜索 mysql创建索引的原则是对于那些区别度高字段建立索引, ...