参看原文:

FPGA学习(一)——产生频率可控的正弦波 - 子木的文章 - 知乎 https://zhuanlan.zhihu.com/p/36929424

2018.5.17更新如下

作为小透明,没想到随手一写的学习过程也能被看见,看到有人点赞也还是很高兴的,希望能以后自己忘了,还能来看懂,如果对大家能有所帮助,那就再好不过了。

对于输出的正弦波周期有两种算法,在这里记录一下。

因为和昨天使用的不是同一个文件,所以名称会和昨天的不一样,不过原理一样。

另外,在仿真的时候可以不用添加约束文件,只需要仿真时可以直接跳过,如果需要下载进板子的话就必须要写了。下一篇会介绍。

1.使用DDS输出的最高位去计算,具体操作如图

步骤1.2.3,注意黄线的位置和数值

点击两次上图3的图标

根据两次的数值就能算出输出正弦波的周期

可能会觉得频率控制字可以控制输出波形的频率,而输出位宽又可以计算输出波形周期,那改变输出波形会影响什么呢?会影响输出波形周期吗?答案是不会。

具体看图,我将输出位宽改为10位的仿真结果。

圈圈圈

输出位宽影响的是输出波形的幅度\(0^◇^0)/

了解DDS的原理就明白了。

2.第二种就是昨天解释原理时用频率控制字控制输出频率时,fre_word取1的值。

具体算法见原答案。

两种区别就是一个取最高位,一个取最低位,刚开始容易理不清。


原答案如下

信号调制和解调功能。写下其中过程当做自己的学习记录吧。本篇讲的是如何产生一个正弦波。

  1. 使用的软件是Vivado 2016.4
  2. 实验室板卡是Nexys Video

1.原理说明

采用的是自带DDS IP核,DDS直接数字式频率合成器(Direct Digital Synthesizer),相信所有人看到这个名字就觉得不会陌生。

DDS由频率控制字(Frequency Control Word)寄存器、相位累加器(Phase Accumulator)和正余弦查找表(Sine/Cosine LUT)三部分组成,通过控制相位累加器的位宽和查找表的位宽,可以实现不同频率和动态范围的正弦信号的产生。

关于DDS是如何产生我们需要的波形信号可以查看这篇文章:

用FPGA实现DDS任意波形发生器 | 电子创新网赛灵思中文社区​xilinx.eetrend.com

而我们现在不用关心太多原理,经过实验的过程,自然就能明白其工作原理。

我们只需要知道如何控制其输出频率就行了,首先记住两个术语(jargon):

a. 相位累加器:Phase = Phase + fre_word,可以暂且理解为i = i + 1一样的东西。

b. 频率控制字:fre_word,这个东西的值直接影响输出信号的频率。

我们的输出频率就是由fre_word来控制。

具体怎么算的呢?

DDS核频率分辨率计算公式如下:

其中Δθ就是我们的频率控制字取值后文用fre_word表示,Bθ(n)是相位累加器位宽后文用B表示,fclk为DDS工作时钟。

频率分辨率就是当Δθ=1时的fout。

先假如我们需要的信号频率范围:1M-10MHz,分辨率0.01MHz。

取Δθ=1,fout=0.01MHz,B=10bit,我们可得DDS工作时钟fclk=10.24MHz。

到这里我们就知道,产生一个正弦波信号需要2部分即可:

  1. 时钟分频器(因为我们的软件系统时钟为100MHz,而我们算出的DDS工作时钟为10.24MHz)
  2. DDS IP核

2.具体操作过程

打开vivado,新建工程

给工程命名,路径不能出现中文

如图勾选,我们后面自己建源文件

选择板卡(这个板卡需要在安装后自己添加了才会有),点击接下来的next,finish。

添加源文件

取名

现在不用添加管脚,点击ok,yes即可

添加IP 核,找到DDS,蓝色的都是一样的,随便选一个双击

命名,选择dds工作时钟10.24MHz,选择使用硬件参数,位宽根据前面计算的结果填写(相位位宽就是我们的频率控制字位宽,而输出位宽影响ROM表深度 (大小为 表示输出的正弦波一个周期的采样值,因为DDS是数字信号经DA输出模拟信号))。

选择可编程(因为由fre_word控制),输出sine,不需要观测相位输出

因为是10位,改为0000000001

查看summary,可知最小频率为0.01MHz,点击ok

点击生成

用时钟管理核生成时钟分频模块,步骤如图,不再描述

咦,,,,好像点击图片可以直接描述,第一次用知乎写,还不会。。。。后面的图片描述在图片下方的描述区。。。

接下来就是例化IP核,首先是时钟分频模块,双击.veo文件,因为是Verilog语言写的

接下来就是例化IP核,首先是时钟分频模块,双击.veo文件(因为是Verilog语言写的),将程序复制到主程序中去

同样的方式例化DDS模块,修改例化模块的名字,2.3步

建立顶层约束文件

添加代码,涉及到时序,说起来太麻烦,具体语句就不解释了,最后会附代码,复制就行

添加仿真文件

注意名称

编写仿真代码

重点重点!!!!名字一定要一样,否则会有惊喜的。mmp被坑惨了

运行仿真

右键将需要观测的假如波形窗口

选中,右键,修改为有符号数10进制表示,波形选择为模拟波形

周期为100us,我们运行200us查看波形

3.代码只要所建名字一样,可以直接复制使用

主程序
`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2018/05/16 18:44:03
// Design Name:
// Module Name: ZXB
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//module ZXB(input sysclk,input [9:0] fw_z//用vio就注释这一句);wire CLK_10240K;ZXB_CLK ZXB_CLKinst(// Clock out ports.clk_out1(CLK_10240K),     // output clk_out1// Clock in ports.clk_in1(sysclk));//  wire [9:0] fw_z;           //用仿真就注释这一句wire [9:0] fre_word;wire fre_word_en;assign fre_word = fw_z;assign fre_word_en = 1'b1;wire [7:0] dds_out;ZXB_DDS ZXB_DDSinst (.aclk(CLK_10240K),                                  // input wire aclk.s_axis_config_tvalid(fre_word_en),  // input wire s_axis_config_tvalid.s_axis_config_tdata(fre_word),    // input wire [15 : 0] s_axis_config_tdata.m_axis_data_tvalid(m_axis_data_tvalid),      // output wire m_axis_data_tvalid.m_axis_data_tdata(dds_out)        // output wire [7 : 0] m_axis_data_tdata);
endmodule

顶层约束文件

set_property -dict {PACKAGE_PIN R4 IOSTANDARD LVCMOS33} [get_ports sysclk]
############################
#https://mp.weixin.qq.com/s/3WoAO4aHYTqTWLTnF56zMA关于时序约束#
############################
create_clock -period 10.000 -name sysclk -waveform {0.000 5.000} [get_ports sysclk]

仿真文件

`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2018/05/16 19:29:18
// Design Name:
// Module Name: ZXB_tb
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//module ZXB_tb();reg clk;
//    wire [7:0] data;reg [9:0] fw_z;ZXB dut(.sysclk(clk),.fw_z(fw_z),//                .led(data)
);// 初始化    initialbeginclk = 0;fw_z = 10'b0000000001;end//产生100MHz时钟信号alwaysbegin#5 clk = ~clk;end
endmodule

4.本来应该添上VIO和ILA的,不过没有板子在,写了也用不了,就不写了,大概和这个差不多,主要区别就是VIO是外部板子给信号,而仿真就是软件假装的,所以在主程序中会有所不同。会Verilog就懂了。

5.第一次写,很简单的一个功能,居然写了这么多,说明理解还不是很到位,表达也不是很简洁明了,ε=(´ο`*)))唉溜了溜了

FPGA产生频率可控的正弦波相关推荐

  1. verilog设计简易正弦波信号发生器_FPGA学习(一)——产生频率可控的正弦波

    2018.5.17更新如下 作为小透明,没想到随手一写的学习过程也能被看见,看到有人点赞也还是很高兴的,希望能以后自己忘了,还能来看懂,如果对大家能有所帮助,那就再好不过了. 对于输出的正弦波周期有两 ...

  2. python正弦波叠加方波_无穷多个(幅值)和(频率)不等的正弦波叠加就能形成周期方波。_学小易找答案...

    [简答题]请上传撰写的演讲稿 (30.0分) [单选题]被称为"信息化的第一场战争"的是() [简答题]编程题 1 .编写一个 C 程序 , 从键盘上输入任意两个整数 , 输出他们 ...

  3. 【至简设计案例系列】基于FPGA的频率、电压测量仪器

    作者:造就狂野青春 1.概述 基于明德扬至简设计法和明德扬设计规范,设计一个基于FPGA的频率.电压测量仪器,实现了测量AD采集后的波形频率和电压(峰峰值),并将数值显示在数码管上.这个案例通过扩展还 ...

  4. 基于FPGA实现DAC8811接口(正弦波)

    1 应用领域 基于FPGA实现DAC8811接口参考设计较少,网络资源都是基于单片机实现DAC8811接口控制,但是在特殊场合必须要使用FPGA实现:因为FPGA不仅具有容量大,逻辑功能强的特点,而且 ...

  5. 基于FPGA的AM信号调制与解调详细步骤

    详细程序及原理参考原文: FPGA学习(二)--实现AM信号调制与解调 - 子木的文章 - 知乎 https://zhuanlan.zhihu.com/p/37203478 使用的软件是Vivado ...

  6. ASIC与FPGA能达到的频率差异巨大是为什么

    为什么ASIC的频率可以达到GHz,而FPGA只能达到几百MHz? 为什么实现同样的电路,asic频率总是(几乎是一定)比FPGA要高?简单来看这是FPGA在要求"可重构"的特性时 ...

  7. 为什么ASIC的频率可以达到GHz,而FPGA只能达到几百MHz?

    作者:岑川 链接:https://www.zhihu.com/question/51179323/answer/124680433 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转载 ...

  8. 【FPGA实例】基于FPGA的DDS信号发生器设计

    原文链接来源:www.runoob.com 基于FPGA的DDS信号发生器设计 DDS 原理 ------DDS(直接频率合成) 技术是根据奈奎斯特抽样定理及数字处理技术,把一系列的模拟信号进行不失真 ...

  9. NCO ip核生成正弦波并用FIR滤波器输出滤波波形

    NCO ip核生成正弦波并用FIR滤波器输出滤波波形 一.认识ip核 1.数字振荡器(NCO) 2.FIR滤波器 二.quartus调用ip核 1.NCO产生正弦波 2.FIR ip核调用 3.乘法器 ...

最新文章

  1. 浅析网站域名申请注册的四种常见方式
  2. java中override快捷键_【基础回溯1】面试又被 Java 基础难住了?推荐你看看这篇文章。...
  3. pthread 立即停止线程_pthread线程的终止退出 | 线程的大量创建
  4. conky在ubuntu xfce4下面的配置
  5. AAAI 2020 | 北理工阿里文娱:你所看视频的介绍,可以用到这样的「图像描述」技术...
  6. centos查找未挂载磁盘格式化并挂载
  7. 2017值得一瞥的JavaScript相关技术趋势
  8. 斯皮尔曼相关(Spearman correlation)系数概述及其计算例
  9. 什么是c语言函数,C语言中的函数是什么意思
  10. ValueError: operands could not be broadcast together with shapes (100,) (71,)
  11. UI设计中,颜色的搭配
  12. FFT 采样频率和采样点数的选取
  13. IT狂人职场路:揭秘华为百度高管如何炼成?
  14. hdu 3932 Groundhog Build Home
  15. 自定义View之网易云音乐听歌识曲水波纹动画
  16. 给力!低代码开发平台广州流辰信息科技助您增辉创价值!
  17. 基于Linux系统搭建智能DNS
  18. java习题4.1-将学生的学习成绩按不同的分数段分为优、良、中、及格和不及格五个登记,从键盘上输入一个0~100的成绩,输出相应的等级。要求用switch语句实现
  19. 【tflearn系列教程】(二)如何安装tflearn
  20. 小米Max2(全网通)线刷兼救砖_解账户锁_纯净刷机包_教程

热门文章

  1. padavan 源码
  2. 【Maven学习】Nexus OSS私服仓库的备份与迁移
  3. nginx配置ssl加密(单双向认证、部分https)
  4. FOJ 2105 Digits Count
  5. LibJson数据解析方法
  6. MySQLdb批量插入数据
  7. 我家的漫路超市——怎么开淘宝网店
  8. Microsoft Sync Framework 2.1 软件开发包 (SDK)
  9. ADO.NET之使用SqlConnection链接数据库
  10. 整型数与字符串之间的转化