FPGA产生频率可控的正弦波
参看原文:
FPGA学习(一)——产生频率可控的正弦波 - 子木的文章 - 知乎 https://zhuanlan.zhihu.com/p/36929424
2018.5.17更新如下
作为小透明,没想到随手一写的学习过程也能被看见,看到有人点赞也还是很高兴的,希望能以后自己忘了,还能来看懂,如果对大家能有所帮助,那就再好不过了。
对于输出的正弦波周期有两种算法,在这里记录一下。
因为和昨天使用的不是同一个文件,所以名称会和昨天的不一样,不过原理一样。
另外,在仿真的时候可以不用添加约束文件,只需要仿真时可以直接跳过,如果需要下载进板子的话就必须要写了。下一篇会介绍。
1.使用DDS输出的最高位去计算,具体操作如图
步骤1.2.3,注意黄线的位置和数值
点击两次上图3的图标
根据两次的数值就能算出输出正弦波的周期
可能会觉得频率控制字可以控制输出波形的频率,而输出位宽又可以计算输出波形周期,那改变输出波形会影响什么呢?会影响输出波形周期吗?答案是不会。
具体看图,我将输出位宽改为10位的仿真结果。
圈圈圈
输出位宽影响的是输出波形的幅度\(0^◇^0)/
了解DDS的原理就明白了。
2.第二种就是昨天解释原理时用频率控制字控制输出频率时,fre_word取1的值。
具体算法见原答案。
两种区别就是一个取最高位,一个取最低位,刚开始容易理不清。
原答案如下
信号调制和解调功能。写下其中过程当做自己的学习记录吧。本篇讲的是如何产生一个正弦波。
- 使用的软件是Vivado 2016.4
- 实验室板卡是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部分即可:
- 时钟分频器(因为我们的软件系统时钟为100MHz,而我们算出的DDS工作时钟为10.24MHz)
- 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产生频率可控的正弦波相关推荐
- verilog设计简易正弦波信号发生器_FPGA学习(一)——产生频率可控的正弦波
2018.5.17更新如下 作为小透明,没想到随手一写的学习过程也能被看见,看到有人点赞也还是很高兴的,希望能以后自己忘了,还能来看懂,如果对大家能有所帮助,那就再好不过了. 对于输出的正弦波周期有两 ...
- python正弦波叠加方波_无穷多个(幅值)和(频率)不等的正弦波叠加就能形成周期方波。_学小易找答案...
[简答题]请上传撰写的演讲稿 (30.0分) [单选题]被称为"信息化的第一场战争"的是() [简答题]编程题 1 .编写一个 C 程序 , 从键盘上输入任意两个整数 , 输出他们 ...
- 【至简设计案例系列】基于FPGA的频率、电压测量仪器
作者:造就狂野青春 1.概述 基于明德扬至简设计法和明德扬设计规范,设计一个基于FPGA的频率.电压测量仪器,实现了测量AD采集后的波形频率和电压(峰峰值),并将数值显示在数码管上.这个案例通过扩展还 ...
- 基于FPGA实现DAC8811接口(正弦波)
1 应用领域 基于FPGA实现DAC8811接口参考设计较少,网络资源都是基于单片机实现DAC8811接口控制,但是在特殊场合必须要使用FPGA实现:因为FPGA不仅具有容量大,逻辑功能强的特点,而且 ...
- 基于FPGA的AM信号调制与解调详细步骤
详细程序及原理参考原文: FPGA学习(二)--实现AM信号调制与解调 - 子木的文章 - 知乎 https://zhuanlan.zhihu.com/p/37203478 使用的软件是Vivado ...
- ASIC与FPGA能达到的频率差异巨大是为什么
为什么ASIC的频率可以达到GHz,而FPGA只能达到几百MHz? 为什么实现同样的电路,asic频率总是(几乎是一定)比FPGA要高?简单来看这是FPGA在要求"可重构"的特性时 ...
- 为什么ASIC的频率可以达到GHz,而FPGA只能达到几百MHz?
作者:岑川 链接:https://www.zhihu.com/question/51179323/answer/124680433 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转载 ...
- 【FPGA实例】基于FPGA的DDS信号发生器设计
原文链接来源:www.runoob.com 基于FPGA的DDS信号发生器设计 DDS 原理 ------DDS(直接频率合成) 技术是根据奈奎斯特抽样定理及数字处理技术,把一系列的模拟信号进行不失真 ...
- NCO ip核生成正弦波并用FIR滤波器输出滤波波形
NCO ip核生成正弦波并用FIR滤波器输出滤波波形 一.认识ip核 1.数字振荡器(NCO) 2.FIR滤波器 二.quartus调用ip核 1.NCO产生正弦波 2.FIR ip核调用 3.乘法器 ...
最新文章
- 浅析网站域名申请注册的四种常见方式
- java中override快捷键_【基础回溯1】面试又被 Java 基础难住了?推荐你看看这篇文章。...
- pthread 立即停止线程_pthread线程的终止退出 | 线程的大量创建
- conky在ubuntu xfce4下面的配置
- AAAI 2020 | 北理工阿里文娱:你所看视频的介绍,可以用到这样的「图像描述」技术...
- centos查找未挂载磁盘格式化并挂载
- 2017值得一瞥的JavaScript相关技术趋势
- 斯皮尔曼相关(Spearman correlation)系数概述及其计算例
- 什么是c语言函数,C语言中的函数是什么意思
- ValueError: operands could not be broadcast together with shapes (100,) (71,)
- UI设计中,颜色的搭配
- FFT 采样频率和采样点数的选取
- IT狂人职场路:揭秘华为百度高管如何炼成?
- hdu 3932 Groundhog Build Home
- 自定义View之网易云音乐听歌识曲水波纹动画
- 给力!低代码开发平台广州流辰信息科技助您增辉创价值!
- 基于Linux系统搭建智能DNS
- java习题4.1-将学生的学习成绩按不同的分数段分为优、良、中、及格和不及格五个登记,从键盘上输入一个0~100的成绩,输出相应的等级。要求用switch语句实现
- 【tflearn系列教程】(二)如何安装tflearn
- 小米Max2(全网通)线刷兼救砖_解账户锁_纯净刷机包_教程