FPGA基础设计(二):任意分频器(奇数,偶数,小数)

这篇具有很好参考价值的文章主要介绍了FPGA基础设计(二):任意分频器(奇数,偶数,小数)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

FPGA开发板上一般只有一个晶振,即一种时钟频率。数字系统设计中,时间的计算都要以时钟作为基本单元,对基准时钟进行不同倍数的分频而得到各模块所需时钟频率,可通过Verilog代码实现;倍频可通过锁相环【PLL】实现。

分频原理

把输入信号的频率变成成倍的低于输入频率的输出信号;每经历几个单位时钟周期就输出一个时钟周期。
例:clk_in为12MHz; clk_out为2MHz.则分频系数为6。那么如何实现6分频:
  把输入信号作为计数脉冲(边沿触发一次,计数一次),
当计数6次,为输出信号的一个周期,此时输入信号经历了6个周期,置0,重新开始计数,循环往复。(前提:输入信号占空比50%)
而输出信号的不同占空比的实现无非是输出信号经历的单位周期输出高低电平不同;

偶数分频

   6分频

占空比50%:6分频电路:一个always块实现一个模3计数器。
     另一个always块实现当计数到2(从0计数到2,计数,3次)输出信号翻转,
     占空比50%。
占空比不是50%:先实现模6计数器,然后可任意设计当计数到某个值输出高电平,再计数到另一个值输出低电平。

   代码
//不带标志位占空比50%
module divider_six(clk,reset,clk_out,cnt);

         input clk;
		 input reset;
		 output reg clk_out;
		 
		 output reg [1:0] cnt;//用于计数的寄存器; always块内,reg型变量
		 
		 always@(posedge clk)
		       if(reset == 1'b0)
				    cnt <= 2'd0;
				 else if(cnt == 2'd2)//从0开始,计数到2,计数为3,则6分频
				    cnt <= 2'd0;
				 else
				    cnt <= cnt + 1'b1;
//计数3次,输出翻转;所以cnt计数3次作为标志,实现翻转功能					 
		  always@(posedge clk)
		        if(reset == 1'b0)
				     clk_out <= 1'b0;
				  else if(cnt == 2'd2)
				     clk_out <= ~clk_out;
				  else;
endmodule
   tb
`timescale 1ns/100ps
`define clk_cycle 50

module divider_six_tb;
  
     reg clk;
	 reg reset;
	 
	 wire clk_out;
	 wire [1:0]cnt;
	 
	 always #(`clk_cycle) clk = ~clk;//产生测试时钟,时钟周期100ns(s>ms>us>ns>ps)
	 
	 initial begin
	 
	     clk = 0;
		 reset = 1;
		 
		 #10 reset = 0;
		 #110 reset = 1;
		 #100000
		 $stop;
		 
	 end
	 divider_six u1(
	          .reset(reset),
				 .clk(clk),
				 .clk_out(clk_out),
				 .cnt(cnt)
				 );
endmodule 
   仿真波形

FPGA基础设计(二):任意分频器(奇数,偶数,小数)
FPGA基础设计(二):任意分频器(奇数,偶数,小数)

奇数分频

算法:需要在系统时钟为上升沿和下降沿都工作(不是同时工作)
    产生50%的占空比,需要设计两个分频时钟跳变点,分频周期的N-1(N-1)/2
例:13分频:两个分频时钟跳变点:6[(13-1)/2]和12[13-1],此时输出保持7个高电平时钟周期,6个低电平时钟周期分别在上升沿触发clk1和下降沿触发clk2,两者相位相差半个单位周期,clk_out = clk1 & clk2; 之后clk_out占空比50%
如图仿真波形:

  仿真波形

FPGA基础设计(二):任意分频器(奇数,偶数,小数)

  代码
//13分频,占空比为50%

module div_13(clk,reset,clk_out,clk1,clk2);

       input clk;
	   input reset;
		 
	   output  clk_out;
		 
	   reg [3:0] cnt;
		 
	   output reg clk1;
	   output reg clk2;

//计数从0到12		 
		 always@(posedge clk)
		       if(reset == 1'b0 || cnt == 4'd12)
				    cnt <= 4'd0;
				 else
				    cnt <= cnt + 1'b1;
					 
//实现分频,clk1:7个高电平时钟周期,6个低电平时钟周期,上升沿触发	
       always@(posedge clk)				 
				 if(reset == 1'b0)
				    clk1 <= 1'b0;
				 else if(cnt == 4'd6)//复位后,计数到6,开始低电平,保持6个周期,
			       clk1 <= 1'b0;   //此时计数到12,重新计数,保持高电平直至计数到6
				 else if(cnt == 4'd12)//计数到6和12,这两个是分频跳变点
			       clk1 <= 1'b1;	  //如何得到?N-1;(N-1)/2
//clk2:下降沿触发,7个高电平时钟周期,6个低电平时钟周期
       always@(negedge clk)	
             if(reset == 1'b0)
		          clk2 <= 1'b0;
			    else if(cnt == 4'd6)
		          clk2 <= 1'b0;
			    else if(cnt == 4'd12)
		          clk2 <= 1'b1;
//clk1,clk2两者相差半个时钟周期					 
//clk1,clk2配合作用,都计数7次后,clk1立即回到低电平,而clk2延迟半个周期					 
		 assign	clk_out = clk1 & clk2;		 					
endmodule		 
  tb
`timescale 1ns/100ps
`define clk_cycle 50

module div_13_tb;
  
    reg clk;
	 reg reset;
	 
	 wire clk_out;
	 wire clk1;
	 wire clk2;
	 
	 always #(`clk_cycle) clk = ~clk;//产生测试时钟,时钟周期100ns(s>ms>us>ns>ps)
	 
	 initial begin
	 
	    clk = 0;
		 reset = 1;
		 
		 #10 reset = 0;
		 #110 reset = 1;
		 #100000
		 $stop;
		 
	 end
	 div_13 u1(
	          .reset(reset),
			  .clk(clk),
		      .clk_out(clk_out),
			  .clk1(clk1),
		      .clk2(clk2)
			 );
endmodule 

小数分频

   说明

1.等效意义上的小数分频:例5.3分频,没有周期为5.3的分频电路,实际是输出时钟53的周期对应于输出时钟的10个周期。
2.按序输出:时钟用处不大,没有意义
3.插入乱序输出:防止相位抖动,把多出来的脉冲均匀分散开

 半整数分频:N+0.5

思路:例:5.5分频
原时钟的半周期为单位,此时周期为11可分频输出6高5低。
上升沿触发,使得clk1前6周期输出高电平【N-1=10为一个跳变点】后5周期输出低电平【N-1)/2=5为另一个跳变点】;
下降沿触发使得clk2前5周期为低电平(cnt为0时的跳变点),后6【cnt=N-1)/2=5】周期为高电平。两个信号相与即为分频信号clk_div = clk1 & clk2;,类似奇分频

  仿真波形

FPGA基础设计(二):任意分频器(奇数,偶数,小数)

  代码
//5.5分频
//原时钟周期一半为单位,输出1高10低,从0到10计数,前6周期高电平,后5周期低电平;
//再使用下降沿触发前5周期低电平,前6周期高电平,最后相与
module div_half_1(clk,rst_n,clk_div,clk1,clk2,cnt);

      input clk;
	   input rst_n;
	   
	   output clk_div;
		
	   
	   output reg[3:0] cnt;
	   output reg clk1;
	   output reg clk2;
//从0到10计数 模11	   
	   always@(posedge clk or negedge rst_n)
	          if(!rst_n)
			    cnt <= 4'd0;
			  else if (cnt==4'd10)
			    cnt <= 0;
			  else
			    cnt <= cnt + 1'b1;
				
	    always@(posedge clk or negedge rst_n)
		       if(!rst_n)
			     clk1 <= 1'b0;
			   else if(cnt==4'd10)//6个周期的高电平N-1=10
			     clk1 <= 1'b1;
			   else if(cnt==4'd5)//5个周期的低电平(N-1)/2=5
			     clk1 <= 1'b0;  //两个跳变点,(N-1)/2;N-1
//clk2相比于clk1延时半个时钟周期,			 
		always@(negedge clk or negedge rst_n)
               if(!rst_n)
                 clk2 <= 1'b0;
               else if(cnt==4'd0)//5个周期的低电平
                 clk2 <= 1'b0;
               else if(cnt==4'd5)//6个周期的高电平
                 clk2 <= 1'b1;

assign clk_div = clk1 & clk2;
endmodule				 
  tb
`timescale 1ns/100ps
`define clk_cycle 50

module div_half_1_tb;
  
    reg clk;
	 reg reset;
	 
	 wire clk_out;
	 wire clk1;
	 wire clk2;
	 wire[3:0] cnt;
	 
	 always #(`clk_cycle) clk = ~clk;//产生测试时钟,时钟周期100ns(s>ms>us>ns>ps)
	 
	 initial begin
	 
	    clk = 0;
		 reset = 1;
		 
		 #10 reset = 0;
		 #110 reset = 1;
		 #100000
		 $stop;
		 
	 end
	 div_half_1 u1(
	             .rst_n(reset),
				 .clk(clk),
				 .clk_div(clk_out),
				 .clk1(clk1),
				 .clk2(clk2),
				 .cnt(cnt)
				 );
endmodule 

 小数分频

   5.3分频

53/10=5.3 设5分频a次;6分频次
a+b=10;
5a+6b=53 ->a=7 ; b=3
如何插入排序:6556556555
Verilog实现:
脉冲删除:53个单位周期删除43个
算法:分母作为累加值,在clk的上升沿cnt加上分母10,判断是否大于分子,若小于(脉冲删除标志为1,删除)继续累加,若大于(脉冲删除标志为0,不删除)在下一周期减去分子。结果刚好是6556556555(由来:分母-余数=7,作为累加值,大于分母,输出N分频,然后减去分母,继续累加7,;小于分母,输出N+1分频)

  代码
//脉冲删除小数分频

module div_5_3_1(clk,rst_n,clk_out,cnt);  

       input clk;
	   input rst_n;
	   
	   output clk_out;
	   
	   parameter fra = 6'd53;//分子
	   parameter den = 6'd10;//分母
	   
	   output reg[5:0] cnt;
	   reg flag_del;//脉冲删除标志位
				
	   always@(posedge clk or negedge rst_n) begin
	          if(!rst_n)begin
			    cnt <= 6'd0;
				 flag_del <= 1'b0;
			  end
			//大于分子,不删除  
			  else if(cnt>fra) begin
			    cnt <= cnt + den - fra;
				 flag_del <= 1'b0;
			  end
			//小于分子,累加;删除:保持高电平
			  else begin
			    cnt <= cnt + den;
			  	 flag_del <= 1'b1;
			  end
		end	
		
		assign clk_out = flag_del ? 1 : clk;

endmodule
  tb
`timescale 1ns/100ps
`define clk_cycle 50

module div_5_3_1_tb;
  
     reg clk;
	 reg reset;
	 
	 wire clk_out;
	 wire [5:0]cnt;
	 
	 always #(`clk_cycle) clk = ~clk;//产生测试时钟,时钟周期100ns(s>ms>us>ns>ps)
	 
	 initial begin
	 
	     clk = 0;
		 reset = 0;
		 
		 #10 reset = 0;
		 #110 reset = 1;
		 #100000
		 $stop;
		 
	 end

	 		 div_5_3_1 u1 (
		          .clk(clk),
				  .rst_n(reset),
				  .clk_out(clk_out),
				  .cnt(cnt)
				  );
endmodule 
  仿真波形

FPGA基础设计(二):任意分频器(奇数,偶数,小数)

最后

不足之处:未实现参数化编程;

参考:

https://blog.csdn.net/weixin_43698385/article/details/122773225
https://blog.csdn.net/Reborn_Lee/article/details/97553078
https://blog.csdn.net/wangyanchao151/article/details/81204126?ops_request_misc=&request_id=&biz_id=102&utm_term=%E5%B0%8F%E6%95%B0%E5%88%86%E9%A2%91&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-5-81204126.nonecase&spm=1018.2226.3001.4187文章来源地址https://www.toymoban.com/news/detail-430275.html

到了这里,关于FPGA基础设计(二):任意分频器(奇数,偶数,小数)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 偶数分频器电路设计

    目录 偶数分频器电路设计 1、偶数分频器电路简介 2、实验任务 3、程序设计 方法1: 3.1、8分频电路代码如下: 3.2、仿真验证 3.2.1、编写 TB 文件 3.2.2、仿真验证 方法2: 4、计数器进行分频 4.1、仿真测试        分频器在逻辑设计中一直都担任着很重要的角色,分频器一般包

    2024年02月09日
    浏览(42)
  • FPGA设计开发(基础课题):分频器设计

    一、设计目的 1、掌握分频器的设计原理; 2、用HDL语言设计分频器。 二、设计原理 分频器与计数器类似,也是要对时钟脉冲进行计数,但其输出的不是对时钟脉冲个数的计数值,而是其频率与时钟的频率成固定比例关系的脉冲信号。整数分频是所有分频器中最简单,最容易

    2024年02月13日
    浏览(52)
  • 任意分频器电路设计

    目录 任意分频器电路设计 1、任意偶数分频器电路设计 1.2、实验任务 1.3、程序设计 1.3.1、代码如下: 1.3.2、编写仿真 TB 文件 2、任意奇数分频器电路设计 2.1、实验任务 2.2、程序设计 2.2.1、奇数分频电路代码 2.2.2、编写仿真 TB 文件 2.2.3、仿真验证        偶数分频实现比较

    2024年02月16日
    浏览(33)
  • 4种FPGA时钟分频 【附源码】:1.偶数分频;2.奇数分频(占空比50%);3.奇数分频(任意无占空比);4.小数分频;

    题目来源于牛客网,完整工程源码:https://github.com/ningbo99128/verilog 目录 VL37 偶数分频 VL40 奇数分频(占空比50%) VL42 奇数分频(任意无占空比) VL41 任意小数分频(较难) 题目介绍 请使用D触发器设计一个同时输出2/4/8分频的50%占空比的时钟分频器;注意rst为低电平复位。

    2024年01月17日
    浏览(39)
  • 分频器——(任意奇分频(50%占空比、非50%占空比),任意偶分频,任意小数分频)

            在数字系统的设计中经常会碰到 需要使用多个时钟 的情况。时钟信号的产生通常具有两种方法,一种是使用PLL(Phase Locked Loop,锁相环),可生成 倍频、分频信号 ;另一种则是使用硬件描述语言构建一个分频电路。         分频器的设计通常分为以下 三类:

    2023年04月23日
    浏览(67)
  • 【FPGA】Verilog:时序电路设计 | 二进制计数器 | 计数器 | 分频器 | 时序约束

    前言: 本章内容主要是演示Vivado下利用Verilog语言进行电路设计、仿真、综合和下载 示例:计数器与分频器   ​​ 功能特性: 采用 Xilinx Artix-7 XC7A35T芯片  配置方式:USB-JTAG/SPI Flash 高达100MHz 的内部时钟速度  存储器:2Mbit SRAM   N25Q064A SPI Flash(样图旧款为N25Q032A) 通用

    2024年02月02日
    浏览(58)
  • FPGA——分频器

    野火学习备忘录——FPAG分频 时钟对于 FPGA 是非常重要的,但板载晶振提供的时钟信号频率是固定的,不一定满 足工程需求,所以分频和倍频还是很有必要的。这里通过计数的方式来实现分频。 1.通过计数器来实现6分频。两种方式。第一种直接通过计数方式直接获取获取。输

    2024年02月10日
    浏览(41)
  • FPGA【Verilog分频器】

            在数字系统的设计中经常会碰到需要使用多个时钟的情况。时钟信号的产生通常具有两种方法,一种是使用PLL(Phase Locked Loop,锁相环),可生成倍频、分频信号;另一种则是使用硬件描述语言构建一个分频电路。         分频器的设计通常分为以下三类:奇

    2024年02月20日
    浏览(45)
  • FPGA 多路分频器实验

    1 概述         在 FPGA 中,时钟分频是经常用到的。本节课讲解 2 分频、3 分频、4 分频和 8 分频的 Verilog 实现并且学习 generate 语法功能的应。 2 程序设计思路         1)整数倍分频,为 2、4、8,这种 2^n 次方倍数倍数关系的分频最容易实现,所以我们可以把这 3 种分

    2024年01月19日
    浏览(37)
  • 实验二 基于FPGA的分频器的设计(基本任务:设计一个分频器,输入信号50MHz,输出信号频率分别为1KHz、500Hz及1Hz。拓展任务1:用按键或开关控制蜂鸣器的响与不响。拓展任务2:用按键或开)

    1. 实验目的: (1) 掌握QuartusⅡ软件的层次型设计方法; (2) 掌握元件封装及调用方法; (3) 熟悉FPGA实验平台,掌握引脚锁定及下载。 2. 实验任务: (1) 基本任务:设计一个分频器,输入信号50MHz,输出信号频率分别为1KHz、500Hz及1Hz。 (2) 拓展任务1:用按键或开关

    2024年02月06日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包