首页 > 其他分享 >奇分频电路如何实现? 负沿触发&非负沿触发

奇分频电路如何实现? 负沿触发&非负沿触发

时间:2023-07-27 15:34:20浏览次数:38  
标签:负沿 触发 clk sys 分频 rst reg 时钟

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

标签:负沿,触发,clk,sys,分频,rst,reg,时钟
From: https://www.cnblogs.com/yhm1314/p/17585093.html

相关文章

  • 2023-07-25 uview1.0的u-number-box组件在渲染时会触发change,如何才能避免事件影响?==
    前言:购物车用到加减购物车数量的一个步进器组件,使用的是uview组件1.0版本的u-number-box。该组件设置了一个@change事件,该事件会在页面渲染的时候触发一次,如果你在里面调用了接口,比如增加/减少购物车数量,那么每次一刷新购物车该事件就会被触发,从而导致不必要的报错。解决方案:在......
  • 555定时器组成的单稳态触发器
     555定时器是一种模拟和数字功能相结合的中规模集成器件。一般用双极型(TTL)工艺制作的称为555,用互补金属氧化物(CMOS)工艺制作的称为7555,除单定时器外,还有对应的双定时器556/7556。555定时器的电源电压范围宽,可在4.5V~16V工作,7555可在3~18V工作,输出驱动电流约为......
  • verilog时序单元分频器
    分频电路2.2.1简单的计数器计数器实质是对输入的驱动时钟进行计数,所以计数器在某种意义上讲,等同于对时钟进行分频。例如一个最大计数长度为N=2^M(从0计数到N-1)的计数器,也就是寄存器位数为M,那么寄存器最高位的输出为N=2^M分频,次高位为N/2分频...例如下面的代码:moduletest#(......
  • mysql 删除触发器
    MySQL删除触发器的步骤在MySQL数据库中,触发器(Trigger)是一种特殊的存储过程,它会在指定的数据库操作(例如插入、更新、删除)发生时自动执行。如果我们需要删除一个已经存在的触发器,可以按照以下步骤进行操作:步骤描述1连接到MySQL数据库2查看已经存在的触发器3删除......
  • 解决element ui 下拉框表单验证切换选项就直接触发的问题
    elementui下拉框表单验证正确使用步骤1.确保form组件的:model属性绑定了表单的数据对象  2.确保form组件的rules绑定了对应的rule 3.确认要验证的表单item绑定了对应的prop属性注意:prop属性的名称要和rule里面的名称一样并且和v-model的属性名称一样才行 完成以上......
  • mysql定时执行触发器
    MySQL定时执行触发器MySQL是一个流行的关系型数据库管理系统,它支持许多高级功能,其中之一是定时执行触发器。触发器是一种特殊的存储过程,当特定的数据库事件发生时自动触发执行。触发器的基本概念在MySQL中,触发器是与表关联的数据库对象。当满足触发器的定义条件时,它会自动在表上......
  • 值类型的侦听器watch不触发 immediate: true
    现象:一个组件的变量有初始值,然后,如果在引用该变量的页面onLoad中为组件的变量赋不同的新值,不触发对该变量的watch回调原因:onLoad的时候,组件还没有初始化完成,修改其变量的值相当于给它一个初始化的值,所以不会触发watch的回调。解决:watch里应该加上immediate:true,以便在创建侦听......
  • el-form 自定义验证规则,手动触发某项验证
    1.ui<el-formref="xXXForm":rules="XXXFormRules"> <el-form-itemlabel="图片"prop="xxx"> </el-form-item></el-form>2.变量初始化exportdefault{data(){return{ ...... XXXForm......
  • element-ui pagination分页组件 点击一次页面跳转触发两次current-change请求
    在项目中使用element编写前端页面时,发现在使用pagination分页组件的时候,出现一个坑。情况是每一次点击页面切换,都会重复触发两次页面切换current-change事件。无论是点击后面的页码或者是下一页或者是跳转到某个页面都会触发两次。第一次正常触发,第二次触发后会返回首页。经过多......
  • 数据库(SQL注入问题、视图、触发器、事务、存储过程、内置函数、流程控制、索引)
    SQL注入问题SQL注入的原因:由于特殊符号的组合会产生特殊的效果 实际生活中,尤其是在注册用户名的时候会非常明显的提示你很多特殊符号不能用,会产生特殊的效果。结论:涉及到敏感数据部分,不要自己拼接,交给现成的方法拼接即可。importpymysql#链接MySQL服务端conn=pymysql.......