请设计一个奇分频电路,占空比为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. iptables四个表五条链

    iptables四个表五条链     其实关于iptables的使用网上的资料和教程也比较多,主要是要理解其中的路由前和路由后每个表和链所处的位置和作用,明白了也就简单了,以下是我转载的觉得写的比较详 ...

  2. vue—一个组件调用另一个组件的methods

    这种方法不常用,项目中有个地方共享数据了,起初没用vuex做,后来有个地方不好解决,这两个组件没有什么关系 1.首先同一个vue实例来调用两个方法.所以可以建立一个中转站. 建立 util.js 中转 ...

  3. xlsx纯前端导出表格,完善边框等样式

    仅用xlsx是无法实现文字样式及表格边框的style的,因此配合使用xlsx-style 以下源码直接复制过去用 // 源码什么的都不需要改动 import * as XLSXStyle from ' ...

  4. 深度学习-07(图像分类、常用数据集、利用CNN实现图像分类、图像分类优化)

    文章目录 深度学习-07(PaddlePaddle图像分类) 图像分类概述 概述 什么是图像分类 图像分类粒度 图像分类发展历程 图像分类问题的挑战 常用数据集介绍 MNIST数据集 CIFAR10数 ...

  5. nginx 访问域名跳转至域名后接目录

    要实现 https://xxx.com/ 自动跳转至 https://xxx.com/new,可以在Nginx 的配置文件中添加以下重定向规则: server { listen 80; listen ...

  6. .NET周报 【5月第2期 2023-05-14】

    国内文章 XUnit数据共享与并行测试 https://www.cnblogs.com/podolski/p/17388602.html 在单元或者集成测试的过程中,需要测试的用例非常多,如果测试是一 ...

  7. 【GiraKoo】Android Studio调试时,提示port无法打开

    Android Studio调试时,提示port无法打开 现象描述 在Android Studio在进行调试时,无法正常运行.App闪退. IDE提示: Error running 'app': Un ...

  8. 【Linux】详解Centos7的下载安装配置

    本文时间 2023-05-17 作者:sugerqube漆瓷 为什么是Centos7 centos8已经停止维护,centos7将在2024-06-30停止维护(所以暂时选7) 未来替代品参考: Al ...

  9. adb查看端口号,杀进程

    1.先查看端口号占用的进程 netstat -ano | findstr 8000 2.在杀掉我们查出的进程15812 3.再次查看8000端口号的进程

  10. 【城南 · LlamaIndex 教程】一文看懂LlamaIndex用法,为LLMs学习私有知识

    我是卷了又没卷,薛定谔的卷的AI算法工程师「陈城南」(全网平台同名)~ 担任某大厂的算法工程师,带来最新的前沿AI知识,分享 AI 有趣工具和实用玩法,包括 ChatGPT.AI绘图等,欢迎大家交流~ ...