【温故而知新】【3】时钟分频-半整数分频N.5

本文介绍了如何使用移位寄存器实现半整数分频,如1.5、2.5、3.5和13.5分频。详细讲解了实现步骤,包括设置移位寄存器初值、移位操作和调整占空比。通过Verilog代码展示了不同分频的仿真波形,并探讨了如何通过增加或操作的信号数来调整分频信号的占空比。
摘要由CSDN通过智能技术生成

【温故而知新】【3】时钟分频-半整数分频N.5

本次实现是半整数分频,或者叫做N.5分频。实现的方式是通过移位寄存器。这种方式的思路来源于文献“Clock dividers made easy”, writed by Mohit Arora from ST mircoelectronics, LTD。 Mohit Arora 也写过一本书,叫做“The art of hardware architecture”, 由Springer出版,这本书的第四章的内容跟上述论文的内容一致。

实现步骤和方式(N=1)


  1. 定义移位寄存器的初值,将移位初值定义为3’b001;
  2. 定义移位寄存器,每个周期将末位的‘1’向左移位1位,移位产生的中间数据跟初值位宽一致,设为tmp。
  3. 采用将tmp[1]寄存一拍,注意此处采用的时钟信号边沿与移位寄存器时钟边沿相反。设移位之后的信号分别位tmp_1_
  4. 将tmp[0]、tmp_1_进行 或操作

以下是实现1.5分频的Verilog代码


//===========================================================
// Author: seuchenrui@126.com
//
// Description:
// This is a simple verilog code for clock frequency division
// this code can be used to get 
// 1. divided by 1.5
//===========================================================
module iCLK_div_shift_register_15
(
    input   iCLK,
    input   iRESET,
    output  oCLK
);

wire    [2:0] tmp_shift;

reg tmp_0_;
reg tmp_1_;
reg [2:0] tmp;

assign  tmp_shift = 3'b001;

always@(posedge iCLK or negedge iRESET)
begin
if(!iRESET)
tmp<=tmp_shift;
else
tmp<={tmp[1:0], tmp[2]};
end



always@(negedge iCLK or negedge iRESET)
begin
if(!iRESET)
tmp_1_<=1'b0;
else
tmp_1_<=tmp[1];
end


assign oCLK = tmp[0]|tmp_1_;


endmodule

1.5分频的仿真波形
这里写图片描述

实现步骤和方式(N>2):


  1. 定义移位寄存器的初值,比如4.5分频时,将移位初值定义为9’b0_0000_0001,3.5分频时,将移位器初值定义为7’b000_0001,以此类推。
  2. 定义移位寄存器,每个周期将末位的‘1’向左移位1位,移位产生的中间数据跟初值位宽一致,设为tmp。
  3. 采用将tmp[0]、tmp[1]、tmp[N]和tmp[N+1]寄存一拍,注意此处采用的时钟信号边沿与移位寄存器时钟边沿相反。设移位之后的信号分别位tmp_0_, tmp_1_, tmp_N_, tmp_N+1_
  4. 将tmp[0]、tmp[1]、tmp_0_、tmp_N_, tmp_N+1_、tmp[N+1]进行 或操作

以下是实现2.5、3.5、4.5和13.5分频的Verilog代码


//===========================================================
// Author: seuchenrui@126.com
//
// Description:
// This is a simple verilog code for clock frequency division
// this code can be used to get 
// 1. divided by 2.5
//===========================================================
module iCLK_div_shift_register_25
(
    input   iCLK,
    input   iRESET,
    output  oCLK
);

wire    [4:0] tmp_shift;

reg tmp_0_;
reg tmp_2_;
reg tmp_3_;

reg [4:0] tmp;
assign  tmp_shift = 
  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值