请设计一个奇分频电路,占空比为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)

奇分频电路如何实现? 负沿触发&非负沿触发的更多相关文章

  1. Verilog学习笔记简单功能实现(六)...............计数分频电路

    在分频器电路中最重要的概念有两个:1)奇分频/偶分频:2)占空比. A)其中最简单的就是二分频电路,占空比为50%,其Verilog程序为 module half_clk(clr,clk_in,clk ...

  2. 背水一战 Windows 10 (24) - MVVM: 通过 Binding 或 x:Bind 结合 Command 实现,通过非 ButtonBase 触发命令

    [源码下载] 背水一战 Windows 10 (24) - MVVM: 通过 Binding 或 x:Bind 结合 Command 实现,通过非 ButtonBase 触发命令 作者:webabcd ...

  3. 实例浅析epoll的水平触发和边缘触发,以及边缘触发为什么要使用非阻塞IO

    一.基本概念                                                          我们通俗一点讲: Level_triggered(水平触发):当被监控的 ...

  4. MVVM: 通过 Binding 或 x:Bind 结合 Command 实现,通过非 ButtonBase 触发命令

    介绍背水一战 Windows 10 之 MVVM(Model-View-ViewModel) 通过 Binding 或 x:Bind 结合 Command 实现,通过非 ButtonBase 触发命令 ...

  5. epoll的水平触发和边缘触发,以及边缘触发为什么要使用非阻塞IO

    转自:http://www.cnblogs.com/yuuyuu/p/5103744.html 一.基本概念                                               ...

  6. [原创][FPGA]时钟分频之奇分频(5分频)

    0. 简介 有时在基本模块的设计中常常会使用到时钟分频,时钟的偶分频相对与奇分频比较简单,但是奇分频的理念想透彻后也是十分简单的,这里就把奇分频做一个记录. 1. 奇分频 其实现很简单,主要为使用两个 ...

  7. 条件触发和边缘触发 及 epoll 的长处

    条件触发: 仅仅要输入缓冲有数据就会一直通知该事件 边缘触发: 输入缓冲收到数据时仅注冊1次该事件.即使输入缓冲中还留有数据,也不会再进行注冊 水平触发(level-triggered.也被称为条件触 ...

  8. jenkins 判断是手动触发还是定时器触发

    根据变量BUILD_CAUSE的值可以判断本次触发是手动触发还是定时器触发 手动触发:MANUALTRIGGER 定时器触发:TIMERTRIGGER

  9. epoll的边缘触发与水平触发

    epoll的边缘触发与水平触发 Tcp连接是双向的,内核为每个socket维护两个缓冲区,读缓冲区与写缓冲区,内核会一个关注这两个缓冲区,当采用水平触发时,对于写缓冲区而言,如果有多余空间可写,对于读 ...

  10. 如何用代码而非事件触发PBO

    通常我们通过抛出事件触发PBO,但若没有事件发生时,我们其实也可以用代码强制发出命令. 写法如下: CL_GUI_CFW=>SET_NEW_OK_CODE( NEW_CODE = <uco ...

随机推荐

  1. Spring配置数据库连接

    <beans xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="ht ...

  2. Typora+MinIO+Python代码打造舒适协作环境

    作者:IT王小二 博客:https://itwxe.com 不知不觉大半年没更新了...前面小二介绍过使用Typora+MinIO+Java代码打造舒适写作环境,然后有很多大佬啊,说用Java来实现简 ...

  3. StarCoder: 最先进的代码大模型

    关于 BigCode BigCode 是由 Hugging Face 和 ServiceNow 共同领导的开放式科学合作项目,该项目致力于开发负责任的代码大模型. StarCoder 简介 StarC ...

  4. 微擎删除分类无法删除解决-select in效率低解决办法

    今天朋友微擎后台微网站里的分类要删除,可是怎么删除也不能删除,同样的系统另一套却可以迅速删除. 后来查询到是查询语句的问题,朋友的平台用户量太大,数据太大,用了以下语句,造成效率太低: SELECT ...

  5. 2023-03-21:音视频解混合(demuxer)为MP3和H264,用go语言编写。

    2023-03-21:音视频解混合(demuxer)为MP3和H264,用go语言编写. 答案2023-03-21: 步骤1:安装github.com/moonfdd/ffmpeg-go go get ...

  6. 2022-12-29:nsq是go语言写的消息队列。请问k3s部署nsq,yaml如何写?

    2022-12-29:nsq是go语言写的消息队列.请问k3s部署nsq,yaml如何写? 答案2022-12-29: yaml如下: apiVersion: apps/v1 kind: Deploy ...

  7. 2021-05-17:数组中所有数都异或起来的结果,叫做异或和。给定一个数组arr,可以任意切分成若干个不相交的子数组。其中一定存在一种最优方案,使得切出异或和为0的子数组最多。返回这个最多数量。

    2021-05-17:数组中所有数都异或起来的结果,叫做异或和.给定一个数组arr,可以任意切分成若干个不相交的子数组.其中一定存在一种最优方案,使得切出异或和为0的子数组最多.返回这个最多数量. 福 ...

  8. JS中的纯函数

    在JavaScript中,纯函数是指在相同的输入下,始终产生相同的输出,并且没有副作用的函数.纯函数不会修改或依赖于函数之外的状态,也不会对外部环境产生任何可观察的影响. 以下是纯函数的特点: 1. ...

  9. 【Java】JTable的数据刷新

    前言 这段时间在写一个大实验,水果超市管理系统,yes,我觉得挺大的,但是就当成了一个实验,接下来还有一个课程设计和一个实训,more bigger... 问题 在我把其他的都写好的时候去写UI层,发 ...

  10. [NISACTF 2022]bingdundun~

    [NISACTF 2022]bingdundun~ 考点 文件上传.Phar://伪协议 一.题目 打开题目,发现是一道文件上传的题目,因为提示了可以压缩包,所以尝试直接上传zip文件,然后利用PHP ...