整数分频,奇偶分频。

实验目标:

实现任意整数奇偶分频。

/*

二分频电路就是用同一个时钟信号通过一定的电路结构转变成不同频率的时钟信号。

二分频就是通过有分频作用的电路结构,在时钟每触发2个周期时,电路输出1个周期信号。

比如用一个脉冲时钟触发一个计数器,计数器每计2个数就清零一次并输出1个脉冲。

那么这个电路就实现了二分频功能。 

四分频就是通过有分频作用的电路结构,在时钟每触发4个周期时,电路输出1个周期信号。

比如用一个脉冲时钟触发一个计数器,计数器每计4个数就清零一次并输出1个脉冲,

那么这个电路就实现了四分频功能。

*/

需求分析:

任意整数分频。占空比百分之50.

灵活使用计数器,可以进行分频。

比如偶数分频N

高电平时间占(N/2) * T_sys_clk,在这个期间有N/2个sys_clk系统时钟。

低电平时间占(N/2) * T_sys_clk,在这个期间有N/2个sys_clk系统时钟。

比如奇数分频M

高电平时间占(M/2) * T_sys_clk,  在这个期间有(M>>1)个完整的sys_clk + 半个sys_clk.

低电平时间占(M/2) * T_sys_clk,  在这个期间有(M>>1)个完整的sys_clk + 半个sys_clk.

模块框图:

时序图:

 

 

代码: 

/*
二分频电路就是用同一个时钟信号通过一定的电路结构转变成不同频率的时钟信号。 
二分频就是通过有分频作用的电路结构,在时钟每触发2个周期时,电路输出1个周期信号。
比如用一个脉冲时钟触发一个计数器,计数器每计2个数就清零一次并输出1个脉冲。
那么这个电路就实现了二分频功能。 

四分频就是通过有分频作用的电路结构,在时钟每触发4个周期时,电路输出1个周期信号。
比如用一个脉冲时钟触发一个计数器,计数器每计4个数就清零一次并输出1个脉冲,
那么这个电路就实现了四分频功能。
*/
module top (
    input		wire				sys_clk      ,
    input		wire				sys_rst_n    ,

    output		wire                clk_even     ,
    output		wire                clk_odd     
);

clk_even clk_even_inst(
    .sys_clk           ( sys_clk    ) ,
    .sys_rst_n         ( sys_rst_n  ) ,

    .clk_even          ( clk_even   )  
);

clk_odd clk_odd_isnt(
    .sys_clk            ( sys_clk    ) ,
    .sys_rst_n          ( sys_rst_n  ) ,

    .odd_clk            ( clk_odd   )  
);

endmodule
/*
    奇数分频。整数。
*/
`include     "para.v" 
module clk_odd (
    input		wire				sys_clk      ,
    input		wire				sys_rst_n    ,

    output		wire                odd_clk     
);

    // reg signal
    reg     [31:0]      cnt_odd     ;
    reg                 clk_odd_p   ;
    reg                 clk_odd_n   ;

    // wire signal  
    wire                add_cnt_odd ;
    wire                end_cnt_odd ;
    wire    [31:0]      reversal_odd;
/******************************************************************************************
********************************************main code**************************************
*******************************************************************************************/
    // reg signal
    // reg     [31:0]      cnt_odd     ;
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) 
            cnt_odd <= 32'd0 ;
        else if(add_cnt_odd) begin
            if(end_cnt_odd)
                cnt_odd <= 32'd0 ;
            else
                cnt_odd <= cnt_odd + 1'b1 ;
        end
        else 
            cnt_odd <= 32'd0 ;
    end
    // reg                 clk_odd_p   ;
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) 
            clk_odd_p <= 1'b0 ;
        else if(cnt_odd >= reversal_odd)
            clk_odd_p <= 1'b1 ;
        else 
            clk_odd_p <= 1'b0 ;
    end
    // reg                 clk_odd_n   ;
    always @(negedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) 
            clk_odd_n <= 1'b0 ;
        else if(cnt_odd >= reversal_odd)
            clk_odd_n <= 1'b1 ;
        else 
            clk_odd_n <= 1'b0 ;
    end
    // wire signal  
    // wire                add_cnt_odd ;
    assign  add_cnt_odd = 1'b1 ;
    // wire                end_cnt_odd ;
    assign  end_cnt_odd = add_cnt_odd && (cnt_odd == (`ODD_NUM - 1)) ;
    // wire                reversal_odd;
    assign  reversal_odd= ((`ODD_NUM >> 1) + 1) ; // 由于加的优先级大于>> 所以要加括号。

    // output		wire                odd_clk 
    assign  odd_clk = clk_odd_p || clk_odd_n ;

endmodule
/*
    偶数分频。整数。
*/
`include     "para.v"
module clk_even (
    input		wire				sys_clk      ,
    input		wire				sys_rst_n    ,

    output		reg                 clk_even     
);

    // reg signal 
    reg     [31:0]      cnt_even ;

    // wire signal 
    wire                add_cnt_even    ;
    wire                end_cnt_even    ;
    wire                reversal_even   ;

/******************************************************************************************
********************************************main code**************************************
*******************************************************************************************/
    // // reg signal 
    // reg     [31:0]      cnt_even ;
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) 
            cnt_even <= 32'd0 ;
        else if(add_cnt_even) begin
            if(end_cnt_even)
                cnt_even <= 32'd0 ;
            else 
                cnt_even <= cnt_even + 1'b1 ;
        end
        else 
            cnt_even <= 32'd0 ;
    end
    // // wire signal 
    // wire                add_cnt_even ;
    assign  add_cnt_even = 1'b1 ;
    // wire                end_cnt_even ;
    assign  end_cnt_even = add_cnt_even && (cnt_even == (`EVEN_NUM - 1)) ;
    // wire                reversal_even  ;
    assign  reversal_even= (cnt_even == ((`EVEN_NUM >> 1) - 1)) ;
    // output		reg                 clk_even    
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) 
            clk_even <= 1'b1 ;
        else if(reversal_even || end_cnt_even)
            clk_even <= ~clk_even ;
        else 
            clk_even <= clk_even ;
    end 
endmodule

`timescale 1ns/1ns
module test_top ();
	reg 				sys_clk		    ;
	reg 				sys_rst_n	    ;

	wire                clk_odd         ;
    wire                clk_even        ;

    parameter           CYCLE = 20 ;

top top_inst(
    .sys_clk            ( sys_clk		) ,
    .sys_rst_n          ( sys_rst_n	    ) ,

    .clk_even           ( clk_even      ) ,
    .clk_odd            ( clk_odd       )  
);
    initial begin
        sys_clk = 1'b1      ;
        sys_rst_n <= 1'b0   ;
        #(CYCLE * 2)        ;
        sys_rst_n <= 1'b1   ;
    end

    always #(CYCLE/2) sys_clk = ~sys_clk ;

endmodule

 仿真波形:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/212726.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

numpy实现神经网络

numpy实现神经网络 首先讲述的是神经网络的参数初始化与训练步骤 随机初始化 任何优化算法都需要一些初始的参数。到目前为止我们都是初始所有参数为0&#xff0c;这样的初始方法对于逻辑回归来说是可行的&#xff0c;但是对于神经网络来说是不可行的。如果我们令所有的初始…

如何学习 Spring ?学习 Spring 前要学习什么?

整理了一下Spring的核心概念BeanDefinitionBeanDefinition表示Bean定义&#xff0c;BeanDefinition中存在很多属性用来描述一个Bean的特点。比如&#xff1a;class&#xff0c;表示Bean类型scope&#xff0c;表示Bean作用域&#xff0c;单例或原型等lazyInit&#xff1a;表示Be…

解码 SQL:深入探索 Antlr4 语法解析器背后的奥秘

探寻SQL的背后机制 前言 在数据领域&#xff0c;SQL&#xff08;Structured Query Language&#xff09;是一门广泛使用的语言&#xff0c;用于查询和处理数据。你可能已经使用过诸如MySQL、Hive、ClickHouse、Doris、Spark和Flink等工具来编写SQL查询。 每一种框架都提供了…

阅读软件OmniReader Pro mac功能特色

OmniReader Pro mac是一款文字识别和阅读软件&#xff0c;它可以将印刷体和手写体的文字转换为数字文本&#xff0c;并将其朗读出来。该软件适用于视力受损、阅读困难、语言障碍等用户&#xff0c;可以帮助他们更加轻松地获取信息和阅读文本。 OmniReader Pro具有简洁直观的用户…

csapp-linklab之第5阶段“输出编码后的学号”(补齐残缺的重定位表)

实验内容 修改补充phase5.o重定位节中被清零的重定位记录&#xff0c;使其与main.o链接后能够正确输出学号编码后的字符串&#xff1a; $ gcc -o linkbomb main.o phase5.o $ ./linkbomb $学号编码后字符串 实验提示 仅需修改重定位节的内容。 不允许修改.text节内容。 给出…

python+Appium自动化:python多线程多并发启动appium服务

Python启动Appium 服务 使用Dos命令或者bat批处理来手动启动appium服务&#xff0c;启动效率低下。如何将启动Appium服务也实现自动化呢&#xff1f; 这里需要使用subprocess模块&#xff0c;该模块可以创建新的进程&#xff0c;并且连接到进程的输入、输出、错误等管道信息&…

系统托盘区句柄研究和C#基本托盘编程

因为我的系统托盘区小图标有时候会不可见,在还是在; 研究一下系统托盘区的句柄,是否每个小图标是一个单个窗口,就像form的button一样; 下图句柄工具,把问号拖动到窗口上,就会显示该窗口的句柄和窗口类等信息; 拖到系统托盘区看一下;拖到任何一个小图标上面,都只显示…

人工智能学习4(特征选择)

编译工具&#xff1a;PyCharm 有些编译工具在绘图的时候不需要写plt.show()或者是print就可以显示绘图结果或者是显示打印结果&#xff0c;pycharm需要&#xff08;matplotlib.pyplot&#xff09; 文章目录 编译工具&#xff1a;PyCharm 特征选择嵌入法特征选择练习&#xff…

训练自己的YOLOv8姿态估计模型

在不断发展的计算机视觉领域&#xff0c;姿态估计作为一项关键创新脱颖而出&#xff0c;改变了我们理解视觉数据以及与视觉数据交互的方式。 Ultralytics YOLOv8 处于这一转变的最前沿&#xff0c;提供了一个强大的工具来捕捉图像中物体方向和运动的微妙之处。 NSDT工具推荐&am…

使用Visual Studio创建第一个C代码工程

文章目录 2019创建C工程创建C文件运行 上一节我们使用记事本编辑C代码&#xff0c;在命令行运行文件&#xff0c;这种方式只是作为对编译器的了解&#xff0c;实际的开发中一般使用集成开发环境比较多&#xff0c;因为 集成开发环境操作比较简单&#xff0c;通常可编辑&#x…

工作几年了,你真的懂 Redis 嘛?

大家好&#xff0c;我是伍六七。一个专注于输出 AI 编程内容的在职大厂资深程序员&#xff0c;全国最大 AI 付费社群破局初创合伙人&#xff0c;关注我一起破除 35 诅咒。 Redis 基本上是大部分技术公司都会使用的缓存框架&#xff0c;但是我发现很多程序员其实并不懂 Redis。 …

canvas 轮廓路径提取效果

前言 微信公众号&#xff1a;前端不只是切图 轮廓 对内容做border效果&#xff0c;可以先看下代码运行的效果 内容是黑线构成的五角星&#xff0c;其轮廓就是红线的部分&#xff0c;本文主要介绍如何在canvas中实现这种效果 Marching Square 这里运用到的是marching square算法…

Gradio库的安装和使用教程

目录 一、Gradio库的安装 二、Gradio的使用 1、导入Gradio库 2、创建Gradio接口 3、添加接口到Gradio应用 4、处理用户输入和模型输出 5、关闭Gradio应用界面 三、Gradio的高级用法 1、多语言支持 2、自定义输入和输出格式 3、模型版本控制 4、集成第三方库和API …

边缘与云或边缘加云:前进的方向是什么?

边缘计算使数据处理更接近数据源&#xff0c;以及由此产生的行动或决策的对象。通过设计&#xff0c;它可以改变数十亿物联网和其他设备存储、处理、分析和通信数据的方式。 边缘计算使数据处理更接近数据源&#xff0c;以及由此产生的行动或决策的对象。这与传统的体系结构形成…

L1-016:查验身份证

题目描述 一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下&#xff1a; 首先对前17位数字加权求和&#xff0c;权重分配为&#xff1a;{7&#xff0c;9&#xff0c;10&#xff0c;5&#xff0c;8&#xff0c;4&#xff0c;2&#xf…

站群优化工具,站群优化方案策略

站群优化&#xff0c;作为网络推广的一项重要策略&#xff0c;站群的构建和优化对于提升网站在搜索引擎中的排名、吸引目标流量、增加用户粘性等方面有着不可忽视的作用。 站群优化方案 站群优化并非简单的堆积大量网站&#xff0c;更要注重质量和策略。在构建站群时&#xff…

VMware下载安装教程

目录 一.下载二.安装 一.下载 官网地址&#xff1a;官网 下载的时候选择Workstation Player&#xff0c;这个是免费的&#xff0c;当然你也可以选择下载Workstation Pro。 二.安装 下载完成之后点击安装包按照需要安装即可。 安装之后启动&#xff0c;可以看到这个能够免费使…

CPU标高load标高;linux故障日志排查

一般情况下&#xff0c;服务器不太会出问题。但是遇到特别诡异的情况&#xff0c;多半是服务器本身的问题。遇到问题&#xff0c;我们不能一味的去排查应用&#xff0c;中间件。更应该想到服务器的问题。否则很容易出现南辕北辙的情况。 这次分享的是一次服务器故障&#xff0c…

【小沐学Python】Python实现Web服务器(Flask+celery,生产者-消费者)

文章目录 1、简介2、安装和下载2.1 flask2.2 celery2.3 redis 3、功能开发3.1 创建异步任务的方法3.1.1 使用默认的参数3.1.2 指定相关参数3.1.3 自定义Task基类 3.2 调用异步任务的方法3.2.1 app.send_task3.2.2 Task.delay3.2.3 Task.apply_async 3.3 获取任务结果和状态 4、…

Java LeetCode篇-深入了解关于栈的经典解法(栈实现:中缀表达式转后缀)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 中缀表达式转后缀说明 1.1 实现中缀表达式转后缀思路 2.0 逆波兰表达式求值 2.1 实现逆波兰表达式求值思路 3.0 有效的括号 3.1 实现有效的括号思路 4.0 栈的压…
最新文章