首页 > 其他分享 >Verilog Hdl 计数器分频

Verilog Hdl 计数器分频

时间:2024-06-19 13:59:44浏览次数:21  
标签:分频 周期 CN 高电平 clk Verilog Hdl 时钟

“分频”:是累加多个输入时钟信号clk_in的周期,最终使得,输出时钟信号clk_out的周期变大,频率变小。

一、偶数分频

例:计数器要实现6分频,输入时钟信号clk_in的6个周期要变成1个周期输出,输出6分频的输出时钟信号clk_out的半个周期占3个输入时钟信号clk_in的周期,相当于clk_out每次在3进制的计数器下,变换一次极性。

公式:f(高)/ f(低)== 分频数 == 周期的扩大倍数 == M 

所以计数器的进制N == M/2,这里分析偶数分频,所以把分频数都看作偶数。

例:要实现6分频的话,计数器的进制N == 3。

以6分频为例的具体波形图如下:

使能信号rst先赋值一个时钟周期的低电平信号,用来初始化变量,之后全部赋值为高电平。

下面是具体思路:

定义一个参数:用作偶数分频计数器的进制数 COUNT_INIT == N

用反馈清零法实现N进制的计数器时,计数值的最大值 == 初始计数值+N(进制数)-1。
所以计数值的最大值是(1+COUNT_INIT-1)-1 == COUNT_ININT-1(初始计数值是从1开始的)(这里的-1是因为计数循环的最后一位是0,要减去这一位。)

再定义一个中间变量count_zero,可以分别控制计数值count和输出时钟clk_out,让输出时钟开始是上升沿(高电平的周期时间)以及控制偶数分频的电平变换(计数值为0时的上升沿,输出时钟的极性发生变换。)最终的输出时钟和输入时钟的时序对齐。

初始计数值是1,先是上升沿(高电平的周期),半个周期的计数值循环是:1->2->0(三进制)

具体代码如下:

//计数器偶数分频
module div_ou
			(
				clk_in,
				rst,
				clk_out
			);

//************************输入输出*************************//

//inputs:
		input		clk_in;
		input		rst;
      
//outputs:
		output		clk_out;
		
//************************参数定义*************************//

		parameter 	COUNT_INIT = 3;//N=M/2
	
//************************变量定义*************************//

//regs:
		reg [2:0]	count;
		reg 		clk_out;
		
//wires:
		wire 		count_zero;
		
//************************程序定义*************************//
//六分频

//引入中间变量count_zero,可以分别控制计数值count和输出时钟clk_out。
//让输出时钟开始是上升沿(高电平的周期时间)
//控制偶数分频的电平变换(计数值为0时的上升沿,输出时钟的极性发生变换。)
//时钟的计数值从1开始:半个周期的循环是1->2->0
//最终的输出时钟和输入时钟的时序对齐
always@(posedge clk_in or negedge rst)
begin
	if(~rst)
			count<=1'b0;
	else if(count==COUNT_INIT-1)//0~N-1
			count<=1'b0;
	else
			count<=count+1'b1;
end
assign count_zero = (count == 0);
always@(posedge clk_in or negedge rst)
begin
	if(~rst)
			clk_out<=1'b0;
	else if(count_zero)
			clk_out<=~clk_out;
end

endmodule


二、奇数分频(50%占空比)

下面讨论奇数分频,M为奇数,此方法是用OR(或)操作:

(1)上升沿分频,高电平保持N周期,低电平保持N+1周期;

(2)下降沿分频,高电平保持N周期,低电平保持N+1周期;

将两个结果输出的时钟信号,相或起来得到最终的输出时钟。

例:实现M(奇数)分频:则2N+1 == M,则高电平周期:N == (M-1)/2,低电平周期:N+1 == (M+1)/2。

因为是对高电平和低电平周期分别进行限定,所以此处的周期数等于计数器的进制数,即要实现一个一个N == (M-1)/2进制(高电平周期)的计数器,和一个N+1 == (M+1)/2进制(低电平周期)的计数器。

因为设计的计数器会使输出时钟先是上升沿(高电平周期),所以先实现N进制的计数器,再在此计数器的基础上实现N+1进制的计数器。

定义两个中间变量用来对高低电平周期变换的最大计数值进行限定:CN_M          CN_N

N进制(高电平周期):N == (M-1)/2,计数值从1开始,所以最大计数值CN_M == 1+N-1 == (M-1)/2

所以:CN_M ==  (M-1)/2

 N+1进制(低电平周期):N+1 == (M+1)/2,计数值从N+1 == (M+1)/2开始,所以最大计数值CN_N == ( (M+1)/2+(M+1)/2-1)-1==M-1(初始计数值是从1开始的)(这里的-1是因为计数循环的最后一位是0,要减去这一位。)

所以:CN_N == M-1

再引入两个中间变量:count1_zero和count2_zero,其作用与偶数分频的中间变量类似:计数值从1开始,先是上升沿,高电平的周期,并且可以将输出信号clk初始化为上升沿以及控制奇数分频的第二次极性变换,最终使得输出时钟和输入时钟的时序对齐。

计数值从1开始,先是上升沿(高电平的周期):

高电平计数值循环:1->2     

低电平计数值循环:3->4->0

两个参数:

                        实现N+1进制和N进制,看作两个偶数分频器:

                        CN_M = (M-1)/2;计数值:(实现N进制)(高电平周期)

                        CN_N = M-1;      计数值:(实现N+1进制)(低电平周期)

如果仅仅是对输入时钟的上升沿或者下降沿的时钟周期相加,则占空比不会是50%,所以需要同时对其上升沿和下降沿进行限定,再将两个输出时钟相或起来,才能得到占空比为50%的奇数分频。

以五分频为例,CN_M =2, CN_N=4,具体波形图如下:

上升沿波形:

下降沿波形:

最终波形:

具体代码如下:

//计数器奇数分频(占空比50%)
module div_ji
			(
				clk_in,
				rst,
				clk_out
			);
			
//************************输入输出*************************//

//inputs:
		input		clk_in;
		input 		rst;
		
//outputs:
		output 		clk_out;

//************************参数定义*************************//

		parameter	CN_M = 2;//(M-1)/2
		parameter 	CN_N = 4;//M-1
		
//************************变量定义*************************//

//regs:
		reg 		clk1;
		reg [2:0]	count1;
		reg			clk2;
		reg [2:0]	count2;
		
//wires:
		wire		count1_zero;
		wire		count2_zero;
		
//************************程序定义*************************//
//五分频

//上升沿
always@(posedge clk_in or negedge rst)
begin
	if(~rst)
			count1<=1'b0;
	else if(count1==CN_M)//0~CN_M(0~2)
			count1<=count1+1'b1;
	else if(count1==CN_N)//CN_M+1~CN_N(3~4)
			count1<=1'b0;
	else
		    count1<=count1+1'b1;
end
assign count1_zero = (count1 == 0);
always@(posedge clk_in or negedge rst)
begin
	if(~rst) 
			clk1<=1'b0;
	else if(count1==CN_M)//高电平的保持周期:1->2(1->CN_M)
			clk1<=~clk1;
	//计数值从1开始,先是上升沿,高电平的保持周期。
	//将输出信号clk初始化为上升沿(高电平的保持周期)以及控制奇数分频的第二次电平变换。
	else if(count1_zero)//低电平的保持周期:3->4->0(CN_M+1->CN_N->0)
			clk1<=~clk1;
end


//下降沿
always@(negedge clk_in)
begin 
	if(~rst)
			count2<=1'b0;
	else if(count2==CN_M)
			count2<=count2+1'b1;
	else if(count2==CN_N)
			count2<=1'b0;
	else 
			count2<=count2+1'b1;
end
assign count2_zero =(count2 == 0);
always@(negedge clk_in)
begin 
	if(~rst)
			clk2<=1'b0;
	else if(count2==CN_M)
			clk2<=~clk2;
	else if(count2_zero)
			clk2<=~clk2;
end


//outputs:

assign clk_out=clk1||clk2;

endmodule

标签:分频,周期,CN,高电平,clk,Verilog,Hdl,时钟
From: https://blog.csdn.net/m0_56351488/article/details/139760918

相关文章

  • SpinalHDL 学习笔记
    SpinalHDL是一种基于Scala的硬件构筑语言(ConstructingHardwareInScalaEmbeddedLanguage),通过比Verilog/VHDL更好层次的行为级描述,拥有更加高层次视角以及抽象编码能力,作为一种Verilog/VHDL代码的生成器,在Verilog/VHDL绝对统治芯片设计语言的情况下,宛如一泓清泉带来不一样......
  • ncverilog与finesim联合进行混合仿真的详细过程(以spice为顶层)
    第一步:Makefile仿真命令one:ncverilog+access+rwc+nc64bit+loadvpi=finesim.so:finesim_startup-frun.f第二步:环境结构(1)以模拟为顶层,顾名思义是把CDL网表中某一个模块替换为数字的function,其余全是CDL,以上图为例,把其中inv替换为数字的function。(2)需要文件:testben......
  • 用verilog/systemverilog 设计fifo (1)
    目录fifo的基本原理基于计数器的同步fifo实现(1)基于计数器的同步fifo实现(2)基于高位补偿法的fifo实现fifo的基本原理FIFO(firstinfirstout),即先进先出存储器,功能与数据结构中的队列相似。在IC设计中,FIFO常用来缓冲突发数据,流式数据与块数据的转换等等。比如上图中,在两个......
  • 串口收发UART(Verilog HDL)
    UART(UniversalAsynchronousReceiverTransmitter,通用异步收发器)是一种异步串行通信协议,主要用于计算机和嵌入式系统之间的数据交换。实现UART通信的接口规范和总线标准包括RS-232、RS449、RS423和RS485等,接口标准规定了通信标准的电气特性、传输速率、连接特性和机械特性。文......
  • Case专题--->(28)verilog 优先Case(四)
     (28)verilog优先Case(四)1目录(a)IC简介(b)vim简介(c)Verilog简介(d)verilog优先Case(四)(e)结束1IC简介(a)在IC设计中,设计师使用电路设计工具(如EDA软件)来设计和模拟各种电路,例如逻辑电路、模拟电路、数字信号处理电路等。然后,根据设计电路的规格要求,进行布局设计和布线,确定各......
  • 搭建verilog/systemverilog学习环境
    目录仿真软件选择使用iverilog的基本步骤仿真软件选择学习verilog或者systemverilog过程中,使用那种仿真软件?当然最好是使用synopsys的vcs+verdi的组合,功能强大,而且大部分公司也使用synopsys的eda软件,如果熟练掌握vcs+verdi对以后工作中使用它们也是有很大帮助。但是这两个软件......
  • 基于VHDL的倒车雷达项目(免费提供全部源码)
    下载地址如下:基于VHDL的倒车雷达项目(免费提供全部源码)资源-CSDN文库1.项目介绍基于VHDL的倒车雷达项目旨在开发一种高效、可靠的倒车辅助系统,利用VHDL(VHSICHardwareDescriptionLanguage)语言实现雷达的核心逻辑控制。该项目的背景源于车辆安全性需求的不断提升,尤其是在停......
  • SystemC & TLM-2.0 - SystemC vs SystemVerilog
    WhatisthedifferencebetweenSystemCandSystemVerilogSystemCisusedprimarilyasamodelinglanguageparticularlyforvirtualplatformmodelingwhereassystemverilogisusedmainly50chableHardwareverification.I'mgoingtodivedowninto......
  • Emacs Verilog Mode 简单使用指南
    引言在硬件描述语言(HDL)中,Verilog是一种广泛使用的语言,用于设计和描述数字电路。为了提高Verilog代码编写的效率和准确性,许多开发者选择使用Emacs作为他们的集成开发环境(IDE)。Emacs是一个高度可定制的文本编辑器,拥有丰富的插件生态系统,其中VerilogMode是专为Veril......
  • 基于FPGA的图像直方图均衡化处理verilog实现,包含tb测试文件和MATLAB辅助验证
    1.算法运行效果图预览FPGA的仿真图如下:   将数据导入MATLAB,对比结果如下:  2.算法运行软件版本MATLAB2022a vivado2019.2 3.部分核心程序  `timescale1ns/1ps////Company://Engineer:////CreateDate:2023/01/1901:47:15//DesignNa......