FPGA_分频(信号使能分频与计数器分频)(奇偶分频)

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

时钟对于 FPGA 是非常重要的,但板载晶振提供的时钟信号频率是固定的,不一定满
足工程需求,所以分频和倍频还是很有必要的。

一、计数器分频

这里通过计数的方式来实现分频。

1.通过计数器来实现6分频。两种方式。第一种直接通过计数方式直接获取获取。输入信号sys_clk和sys_rst_n,输出分频的信号clk_out,还有一个变量计数器cnt。

计数器分频如何实现分频,fpga开发

 cnt:计数器说明,要进行6分频,原始信号6个周期变一个周期输出,输出6分频周期的半个周期占三个原始时钟周期,对原始时钟计数3(0 1 2)

module      divider_six
(
        input wire      sys_rst,
        input wire      sys_clk,
        
        output reg      clk_out
);
reg     [2:0]   cnt;
always@(posedge sys_clk or negedge sys_rst)
    if(sys_rst == 1'b0)
    cnt <= 2'd0;
    else    if(cnt == 2'd2)
    cnt <= 2'd0;
    else
    cnt <= cnt+2'd1;
always@(posedge sys_clk or negedge sys_rst)
    if(sys_rst == 1'b0)
    clk_out <= 1'b0;
    else    if(cnt == 2'd2)
    clk_out <= ~clk_out;
    else
    clk_out <= clk_out;

endmodule

    

testbench

`timescale 1ns/1ns
module  tb_divider_six();
        reg       sys_rst;
        reg       sys_clk;
        
        wire       clk_out;
initial
    begin
    sys_clk = 1'b1;
    sys_rst = 1'b0;
    #20
    sys_rst = 1'b1;
    end
always #10 sys_clk = ~sys_clk;


 divider_six  divider_six_inst
(
        .sys_rst(sys_rst),
        .sys_clk(sys_clk),
          
        .clk_out(clk_out)
);
endmodule

计数器分频如何实现分频,fpga开发

 此时输出时钟就是clk_out ,如果直接用clk_out当作系统工作时钟

//直接使用clk_out作为工作时钟
always@(posedge clk_out or negedge sys_rst_n)
	if(sys_rst_n == 1'b0)
		a <= 0;
	else
		a <= a + 1;

二、 通过计数器控制标志信号,通过标志信号当作系统工作时钟

计数器分频如何实现分频,fpga开发

module      divider_six
(
        input wire      sys_rst,
        input wire      sys_clk,
        
        output reg      clk_flag
);
reg     [2:0]   cnt;

always@(posedge sys_clk or negedge sys_rst)
    if(sys_rst == 1'b0)
		cnt <= 2'd0;
    else    if(cnt == 3'd5)
		cnt <= 3'd0;
    else
		cnt <= cnt+3'd1;
		
always@(posedge sys_clk or negedge sys_rst)
    if(sys_rst == 1'b0)
		clk_flag <=1'b0;
    else    if(cnt == 3'd4)
		clk_flag <=1'b1;
    else
		clk_flag <=1'b0; 
endmodule

    

此时产生使能信号flag(实际还是周期变化的信号理解为时钟,但是不当作时钟信号使用,当作使能信号触发,但是组合逻辑还是用系统源时钟)。

//工作时钟还是系统时钟 
always@(posedge sys_clk or negedge sys_rst_n)
	if(sys_rst_n == 1'b0)
		a <= 1'd0;
	else	if(clk_flag == 1'b1)
		a <= a + 1'b1;

总结:两种方式的区别

这里为什么要说明这两种方式呢?
这里就要说到FPGA中的全局时钟网络,因为在 FPGA 中凡是时钟信号都要连接到全局时钟网络上,全局时钟网络也称为全局时钟树,是 FPGA 厂商专为时钟路径而特殊设计的,它能够使时钟信号到达每个寄存器的时间都尽可能相同,以保证更低的时钟偏斜(Skew)和抖动(Jitter)。然而我们采用第一种方式产生的时钟clk_out信号并没有连接到全局时钟网络上,这种做法所衍生的潜在问题在低速系统中不易察觉,而在高速系统中就很容易出现问题,但 sys_clk 则是由外部晶振直接通过管脚连接到了 FPGA 的专用时钟管脚上,自然就会连接到全局时钟网络上,所以在 sys_clk 时钟工作下的信号要比在 clk_out 时钟工作下的信号更容易在高速系统中保持稳定。所以第二种方式相对来说更加安全。

上述已经说到6分频,属于偶数分频。下面就来介绍奇数分频。奇数分频采用上述第二种方式来实现的话,思路和步骤都差不多。我这里介绍一下奇数分频采用上述的第一种方式。那么问题又来了,既然上述第一种方式没有第二种好,为什么还有讲的,哈哈,是的。我记录他并不是因为他的好,而是因为这里奇数分频时的思路和逻辑思维。这里实现一个5分频
计数器分频如何实现分频,fpga开发

首先是输入时钟和复位,一个计数器,两个变量分频时钟,一个输出时钟。要实现N奇数分频,计数器计数到N-1,这里5分频最大计数到4。然后变量clk1初始状态为高电平,系统时钟上升沿到来时有效,这里计数到2时拉低,其实这里可以计数到0,1,2,3都是可以的。clk2初始状态也是高电平,系统时钟下降沿到来时有效。这里计数到与clk1计数最大值一致就行,然后clk1与clk2做与运算就可以得到输出5分频时钟clk_out。

两个四分频,计数值范围不一样,造成相位偏移半个周期,两个四分频信号相与,输出5分频时钟信号,(最好该信号依然当作flag使能信号使用,在时序逻辑输入时钟还是使用原始时钟)
 

module	divider_five
(	
	
	input	wire			sys_clk		,
	input	wire			sys_rst_n	,
	
	output	wire			clk_out
);

reg	[2:0]	cnt;
reg			clk1;
reg			clk2;


always@(posedge sys_clk or negedge sys_rst_n)
	if(sys_rst_n == 1'b0)
		cnt <= 3'd0;
	else	if(cnt == 3'd4)
		cnt <= 3'd0;
	else
		cnt <= cnt + 1'b1;

always@(posedge sys_clk or negedge sys_rst_n)
	if(sys_rst_n == 1'b0)
		clk1 <= 1'b1;
	else	if(cnt == 3'd2)
		clk1 <= 1'b0;
	else	if(cnt == 3'd4)
		clk1 <= 1'b1;
	else
		clk1 <= clk1;
		

always@(negedge sys_clk or negedge sys_rst_n)
	if(sys_rst_n == 1'b0)
		clk2 <= 1'b1;
	else	if(cnt == 3'd2)
		clk2 <= 1'b0;
	else	if(cnt == 3'd4)
		clk2 <= 1'b1;
	else
		clk2 <= clk2;


assign  clk_out = clk1 & clk2;

endmodule

 testbench

`timescale 1ns/1ns 
module	tb_divider_five();

reg			sys_clk;
reg			sys_rst_n;

wire		clk_out;

initial
	begin
		sys_clk = 1'b1;
		sys_rst_n <= 1'b0;
		#30
		sys_rst_n <= 1'b1;
	end
	
always	#10 sys_clk = ~sys_clk;

divider_five	divider_five_inst
(	
	
	.sys_clk		(sys_clk),
	.sys_rst_n		(sys_rst_n),

	.clk_out        (clk_out)
);
endmodule

仿真

计数器分频如何实现分频,fpga开发

分频系数:50MHz晶振输入

        输出1KHz时钟频率,50_000_000/1000=50_000

        输出100KHz时钟频率,50_000_000/100_000=500

来源:有所更改,加入自己理解(175条消息) FPGA——分频器_fpga分频器_rοckman的博客-CSDN博客​​​​​https://blog.csdn.net/a17377547725/article/details/125927896文章来源地址https://www.toymoban.com/news/detail-775239.html

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

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

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

相关文章

  • 奇偶校验器设计(奇偶校验与奇偶检测,XOR法和计数器法|verilog代码|Testbench|仿真结果)

    数字IC经典电路设计 经典电路设计是数字IC设计里基础中的基础,盖大房子的第一部是打造结实可靠的地基,每一篇笔者都会分门别类给出设计原理、设计方法、verilog代码、Testbench、仿真波形。然而实际的数字IC设计过程中考虑的问题远多于此,通过本系列希望大家对数字I

    2024年02月11日
    浏览(36)
  • 【FPGA】Verilog:计数器 | 异步计数器 | 同步计数器 | 2位二进制计数器的实现 | 4位十进制计数器的实现

    目录 Ⅰ. 实践说明 0x00 计数器(Counter) 0x01 异步计数器(Asynchronous Counter)

    2024年02月05日
    浏览(46)
  • 【FPGA】Verilog:升降计数器 | 波纹计数器 | 约翰逊计数器 | 实现 4-bit 升降计数器的 UP/DOWN

    目录 Ⅰ. 理论部分 0x00 升降计数器(UP DOWN Counter) 0x01 波纹计数器(Ripple Counter)

    2024年02月05日
    浏览(41)
  • FPGA拾忆_(3):调用IP 计数器&BCD计数器

    调用IP计数器: 每来一个cin(进位输入)信号,计数器输出值加一,当计数值为9且cin为1时,输出一个时钟长度的cout(进位输出)信号。 首先采用调用quartus种IP的方式,具体步骤: Tools----IP Catalog: 然后会调出IP目录窗口: 通过搜索counter来添加计数器模块,需要设置的内容

    2024年02月03日
    浏览(45)
  • FPGA-计数器的实现

    计数器是依托时钟实现的,在时钟沿(一般在上升沿)进行检测,实现计数加1; 计数是从0开始计数的,所以计数值为(M-1),其中M为计数的值。比如计数到10,我们实现时到9即可; 这里为计数器的第一种实现方法,该方法非最优方法,我们只需要了解即可,后续我们会介

    2024年02月04日
    浏览(30)
  • 计数器简介以及FPGA实现

    在时序逻辑电路中,最基本的单元是寄存器,本篇将会介绍如何利用寄存器,实现一个具有计数器功能的电路。在FPGA开发中,一切与时间有关的设计都会用到计数器,所以学会设计计数器至关重要。 计数是一种最简单基本的运算,计数器就是实现这种运算的逻辑电路,计数

    2024年02月05日
    浏览(42)
  • fpga[1]计数器(附源码)

    计数器电路是在数字电子技术中应用的最多的时序逻辑电路。计数器不仅能用于对时钟脉冲计数,还可以用于分频、定时、产生节拍脉冲和脉冲序列以及进行数字运算等。 在许多大型电路中必然有计数器电路的身影,可以说了解并掌握计数器的设计方法是学习fpga的第一步。

    2023年04月25日
    浏览(41)
  • FPGA实验二:模可变计数器设计

    目录 一、实验目的 二、实验要求 三、实验代码 1.实验源码

    2024年02月12日
    浏览(39)
  • FPGA Vivado环境下实现计数器

    本文实现的是一个简单的计数器,模块中包含时钟信号和复位信号,计数使用的是一个四位的输出,复位键有效时,计数器置零,当时钟信号上升沿时,计数加一,实现计数。(仅供参考) 建立工程counter,并新建一个设计文件命名为:counter     3.打开counter文件,进行计数器

    2024年01月21日
    浏览(37)
  • Verilog语言实现FPGA上的计数器

    Verilog语言实现FPGA上的计数器 计数器是数字电路中经常使用的基本元素之一,它用于生成指定脉冲数量或者指定计数范围内的计数信号。在现代数字电路设计中,FPGA(Field Programmable Gate Array)作为一种可编程逻辑器件被广泛应用,可以通过Verilog语言来实现计数器模块。 在V

    2024年02月05日
    浏览(35)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包