热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

FPGA学习第1篇:基于ROM的直接数字式频率合成器(DDS)的FPGA实现

原理:基于ROM的直接数字式频率合成器(DDS)的结构主要是由相位累加器、正弦查找表、数模转换器(DAC)和低

原理:

  基于ROM的直接数字式频率合成器(DDS)的结构主要是由相位累加器正弦查找表数模转换器(DAC)和低通滤波器等四个大的结构组成,其结构框图如下 :

  


  输出频率的公式             :    Fout = Fclk * Freq_World  /  2 (N为相位累加器位宽)

     输出信号频率分辨率     :    △Fout  =  Fclk  /  2N


 

一、相位累加器

  略

二、正弦查找表

  通过如下Matlab脚本生成10进制、65536点的正弦采样序列并将其保存在“init.coe”文件中,并在下面生成rom ip核时调用。

1 % Matlab代码:
2
3 % 相位累加器位宽
4 N = 16;
5 M = 2^N;
6 % 生成正弦抽样序列
7 n = 0:M-1;
8 x = sin(2*pi*n/M);
9 % 量化
10 y = round((x+1)*M/2);
11 plot(n,y);
12
13 % 生成.coe文件
14 init_vector = fopen('init.coe','wt');
15 fprintf(init_vector, 'memory_initialization_radix = 10;\nmemory_initialization_vector = ');
16 for i = 1:M
17 if mod(i-1,16) == 0
18 fprintf(init_vector, '\n');
19 end
20 fprintf(init_vector, '%4d,', y(i));
21 end

  

三、FPGA实现

  通过计数器计数输出作为储存有正弦序列表的rom的地址进行寻址输出,详细原理“略”,具体实现见下:

1 `timescale 1ns / 1ps
2 //---------------------------------------------------------------------------
3 // Company :
4 // Engineer : Aqua
5 // Create Date : 2017/11/26
6 // Module Name : dds_module
7 // Project Name : dds_7z20.demo
8 // Target Devices : zynq7020
9 // Tool Versions : vivado 2017.1
10 // Description :
11 // Revision : v 1.0
12 //---------------------------------------------------------------------------
13 module dds_module#(
14 parameter Phase_Width = 16,
15 Dout_Width = 17
16 )(
17 input clk,
18 input rst,
19 input [Phase_Width-1:0] s_tphase_in,
20 output [Phase_Width-1:0] m_tphase_out,
21 output [Dout_Width-1:0] m_tdata_out
22 );
23
24 reg [15:0] PhaAcuml;
25 //------------------------相位累加器--------------------------
26 always@(posedge clk or posedge rst)
27 begin
28 if(rst)
29 PhaAcuml <&#61; &#39;b0;
30 else
31 PhaAcuml <&#61; PhaAcuml &#43; s_tphase_in;
32 end
33
34 assign m_tphase_out &#61; PhaAcuml;
35 //------------------------正弦查找表--------------------------
36 rom inst_rom (
37 .a (PhaAcuml), // input wire [15 : 0] a
38 .spo (m_tdata_out) // output wire [16 : 0] spo
39 );
40 endmodule

   部分激励代码如下&#xff1a;

1 testbench部分代码&#xff1a;
2
3 //----------------------------------------------------------------------------
4 //
5 // Fout &#61; Fclk * s_tphase_in / 2^16 (相位位宽&#xff1a;16 bit)
6 //
7 //----------------------------------------------------------------------------
8 s_tphase_in <&#61; 16‘h0CCC; // 5MHz
9 s_tphase_in <&#61; 16&#39;h3333; // 20MHz

 仿真波形&#xff1a;

  1、设定输出正弦信号频率值&#xff1a;5MHz

  

  2、设定输出正弦信号频率值&#xff1a;20MHz

  

 四、应用&#xff08;Chirp信号&#xff09;

1 &#96;timescale 1ns / 1ps
2
3 // Company :
4 // Engineer :
5 // Create Date : 2017/11/26
6 // Module Name : dds_module_tb
7 // Project Name :
8 // Target Devices :
9 // Tool Versions :
10 // Description :
11 // Revision :
12
13 module dds_module_tb;
14
15 reg clk;
16 reg rst;
17 reg [15:0] s_tphase_in;
18 wire [15:0] m_tphase_out;
19 wire [16:0] m_tdata_out;
20
21 reg [19:0] count;
22
23 localparam idle &#61; &#39;d1,
24 rise &#61; &#39;d2,
25 fall &#61; &#39;d3;
26 reg [2:0] s_state;
27
28 localparam N &#61; &#39;d200,
29 s_tphase_min &#61; 16&#39;h0001,
30 s_tphase_max &#61; 16&#39;h3333,
31 step &#61; (s_tphase_max - s_tphase_min)/N;
32//--------------------------------------------------------------------------------------
33 dds_module uut (
34 .clk (clk),
35 .rst (rst),
36 .s_tphase_in (s_tphase_in),
37 .m_tphase_out (m_tphase_out),
38 .m_tdata_out (m_tdata_out)
39 );
40//--------------------------------------------------------------------------------------
41 initial
42 begin
43 clk &#61; 0;
44 rst &#61; 1;
45 #100
46 rst &#61; 0;
47 end
48//-------------------------------------------------------------------------------------
49 always&#64;(posedge clk or posedge rst)
50 begin
51 if(rst)
52 begin
53 s_tphase_in <&#61; &#39;b0;
54 count <&#61; 1;
55 s_state <&#61; idle;
56 end
57 else
58 begin
59 case(s_state)
60 idle : begin
61 s_state <&#61; rise;
62 count <&#61; 1;
63 end
64 rise : begin
65 if(count <&#61; N)
66 begin
67 count <&#61; count &#43; 1;
68 s_tphase_in <&#61; s_tphase_min &#43; step * count;
69 end
70 else
71 begin
72 count <&#61; 1;
73 s_state <&#61; fall;
74 end
75 end
76 fall : begin
77 if(count <&#61; N)
78 begin
79 count <&#61; count &#43; 1;
80 s_tphase_in <&#61; s_tphase_max - step * count;
81 end
82 else
83 begin
84 count <&#61; 1;
85 s_state <&#61; rise;
86 end
87 end
88 default : begin
89   s_state <&#61; idle;
90 end
91 endcase
92 end
93 end
94//----------------------------------------------------------------------------------
95 always#5 clk &#61; ~clk;
96
97 endmodule

  设定输出Chirp信号频率值&#xff1a;0~20MHz

   

转:https://www.cnblogs.com/Kari-Jar/p/7899957.html



推荐阅读
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 【shell】网络处理:判断IP是否在网段、两个ip是否同网段、IP地址范围、网段包含关系
    本文介绍了使用shell脚本判断IP是否在同一网段、判断IP地址是否在某个范围内、计算IP地址范围、判断网段之间的包含关系的方法和原理。通过对IP和掩码进行与计算,可以判断两个IP是否在同一网段。同时,还提供了一段用于验证IP地址的正则表达式和判断特殊IP地址的方法。 ... [详细]
  • iOS超签签名服务器搭建及其优劣势
    本文介绍了搭建iOS超签签名服务器的原因和优势,包括不掉签、用户可以直接安装不需要信任、体验好等。同时也提到了超签的劣势,即一个证书只能安装100个,成本较高。文章还详细介绍了超签的实现原理,包括用户请求服务器安装mobileconfig文件、服务器调用苹果接口添加udid等步骤。最后,还提到了生成mobileconfig文件和导出AppleWorldwideDeveloperRelationsCertificationAuthority证书的方法。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • Android工程师面试准备及设计模式使用场景
    本文介绍了Android工程师面试准备的经验,包括面试流程和重点准备内容。同时,还介绍了建造者模式的使用场景,以及在Android开发中的具体应用。 ... [详细]
  • 在2022年,随着信息化时代的发展,手机市场上出现了越来越多的机型选择。如何挑选一部适合自己的手机成为了许多人的困扰。本文提供了一些配置及性价比较高的手机推荐,并总结了选择手机时需要考虑的因素,如性能、屏幕素质、拍照水平、充电续航、颜值质感等。不同人的需求不同,因此在预算范围内找到适合自己的手机才是最重要的。通过本文的指南和技巧,希望能够帮助读者节省选购手机的时间。 ... [详细]
  • 网卡工作原理及网络知识分享
    本文介绍了网卡的工作原理,包括CSMA/CD、ARP欺骗等网络知识。网卡是负责整台计算机的网络通信,没有它,计算机将成为信息孤岛。文章通过一个对话的形式,生动形象地讲述了网卡的工作原理,并介绍了集线器Hub时代的网络构成。对于想学习网络知识的读者来说,本文是一篇不错的参考资料。 ... [详细]
author-avatar
KD15635546_753
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有