首页 > 编程知识 正文

fpga分频器程序,verilog八分频

时间:2023-05-03 16:20:43 阅读:153109 作者:3039

一、为什么任意分频,FPGA的最初实验可能应该是分频实验而不是流水灯。 或者根据LCD1602的' Hello World ',因为分频的思想在FPGA中极其重要。 当初,为了展示效果,为了引起兴趣而安排了流水灯(MCU的学习也是如此)。

大多数教科书都提到了如何分频,包括奇数分频、偶数分频、小数分频等。 根据教科书的不同,也讨论了任意分频(半分频、任意分数分频)的原理,但使用的是相位积的电路,占空比不能达到50%,也不灵活。

但是,没有准确、易懂、高精度的任意分频原理的教科书(至少从没见过Bingo ),同时也没有可以用同一个电路实现任意频率控制的设计。 Bingo就当年制作的任意波形发生器时相累加器的原理,从中得到启示,总结了高精度任意频率合成的重要思考,希望能为大家做点贡献,对大家有所帮助。

二.任意分频的原理和性能

1. DDS相位累加器(1) DDS合成流程

首先阐述DSS (直接频率合成法)的原理。

ds是一种重要的频率合成方法,在波形发生器中有极其重要的应用。 DDS主要由以下部分组成:

a )相位累加器

b ) RAM数据读取

c ) D/A转换器

d )低通滤波器

请参照以下流程图。 直接频率合成法的流程图中有固定模块,输入频率控制器,输出固定频率的波形。

该电路最主要的模块是相位累加器,通过相位累加器的循环计数,循环读取RAM的数据,获得一定频率的波形数据。

)2)相位累加器原理

相位累积原理的流程如上。

输入频率控制字,基于算法实现相位变化,分析如下。

将FPGA基准频率设为50MHz,即基准频率:

(MHz ) )。

将计数器设为32位计数器;

k为频率控制字时,相位输出的频率如下所示。

(1) ) ) )。

也就是说

(2) ) ) )。

基于相位累计原理和RAM缓存的读取数据,按每一周期读出RAM数据间隔k。

K=1时,式可以输出最小频率,根据式(1) :

因此,最小波形频率上升到0.011655Hz。

fo=1Hz时,式(2)

因此,对于Hz的每次增加,k的步长为85.90。

K=N/2时,公式可以输出最大频率。 (因为每个CLK都会跳),此时,根据公式(1),可以得到以下内容。

因此,根据频率控制字k的变化,可输出和固定频率的波形。

2 .将任何分频原理应用于FPGA时,在对频率要求比较高的情况下,也可能采用相位累加器原理产生固定频率的方法。

我们规定将Cnt分成一半50%。 具体情况如下。

)1)时、即低电平

)2)时,fo=1,即高电平。

同上:

在FPGA中,Verilog代码如下所示:

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *。

* Module Name : clk_generator

* Engineer : Crazy Bingo

* Target Device : EP2C8Q208C8

*工具版本3360 Quartus ii 9.1 sp 1

* Create Date : 2011-6-25

* Revision : v1.0

*描述:

******************************

/*******************************。

fc=50MHz 50*10^6

fo=fc*k/(2^32 ) )

k=fo*(2^32 )/fc

=fo*(2^32 )/(50*10^6)

******************************

模块clk _ generator

#

parameter freq _ word=32 ' d 8590///1 khz

input clk,//50MHz

input rst_n,//clock reset

output reg clk_out

);

----------------

reg [31:0] max_value;

always @ (posedgeclkornegedgerst _ n )

比根

if (! rst_n )

max_value=1'b0;

else

max_value=max_value FREQ_WORD;

结束

----------------

always @ (posedgeclkornegedgerst _ n )

比根

if (! rst_n )

clk_out=1'b0;

else

比根

if(max_value32(H7fff_ffff ) ) ) ) ) ) ) ) ) ) ) ) )。

clk_out=1'b0;

else

clk_out=1'b1;

结束

结束

结束模块

本代码是从DDS相位累加器,根据移植总结的任意频率分频的原理。 该模块已应用于多个要求频率精度的项目(例如在UART中,为了获得115200Hz的bps,利用该任意分频原理可以获得准确的方法,在一定程度上提高数据传输的精度)。

DDS中相位累加器的任意分频原理同样适用于一般工程。 在一些应用场合,还是值得考虑的。 这个APP是Bingo的个人主观APP。 如果有异议的话,请联系本人。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。