FPGA学习笔记. DDS
DDS原理
直接数字式频率合成器(Direct Digital Synthesizer)
频率计算公式
Fout = FW * Fclk / 2^N
Fout 输出频率, Fw 频率控制字, N 位数 精度 Fclk / 2^N
设计思路
设置一个计数cnt作累加,Fw频率控制字,作为计数步长。
时钟clk下,cnt <= cnt + Fw.
设输入时钟是100mHz,目标Fo为115200Hz,计数器为32位,据上面的公式可以得出
Fw = Fo * 2^32 / Fc = 115200 * 2^32 / (100*10^6) = 4947802.3249992
取整 Fw = 4947802,
占空比为50%,cnt <= 2^N ,Fo = 0 ; cnt > 2^N ,Fo = 1。
添加一个block menery IP,存放 正弦波相位-幅度 表,由相位累加来查询地址。
生成COE文件
位宽32bit 深度2^12,code
clear;
close all;
%%
width = ; %data width
N = ; %addr witdh
depth = ^N;%memery depth
x = linspace(,*pi,depth);
y_sin = sin(x)+;
y_sin_q=round(y_sin*(^(width-)));
fid = fopen('CosWaveWid32Def2e12.coe','w');
%write header
fprintf(fid,'MEMORY_INITIALIZATION_RADIX=16;\n');
fprintf(fid,'MEMORY_INITIALIZATION_VECTOR=\n');
%write data
if(fid>)
fprintf(fid,'%x,\n',y_sin_q);
end
fclose(fid);
verilog 程序
累加与查询地址
/*
fc = 100MHz
fo = 1kHz
N = 32 (width)
fw = (fo * 2^N) / fc = 42949.67296 => 42950 */
module DdsTopV
#(
parameter COUNTWIDTH = ,
parameter FW = 'd429497
)
(
input wire clk,
input wire rst_n,
output reg clk_out,
// output wire [11:0] addr,
output wire [:] phase,
output wire [:] sin_o
); //wire [31:0] phase;
wire [:] addr;
reg [COUNTWIDTH-:] cnt; //相位累加
always @(posedge clk or posedge rst_n)
begin
if(!rst_n)
cnt <= ;
else
cnt <= cnt + FW; //计数器步长FW
end
//clk_out
always @(posedge clk or posedge rst_n)
begin
if(!rst_n)
clk_out <= 'b0;
else if(cnt < 'h7FFF_FFFF)
clk_out <= 'b0;
else
clk_out <= 'b1;
end assign phase = cnt;
assign addr = {phase[:]}; blk_mem_gen_0 blk_mem_gen_0(
.clka(clk),
.addra(addr),
.douta(sin_o)
); endmodule
TestBench
module testbench(); reg clk;
reg rst_n;
wire clk_out;
//wire [11:0] addr;
wire [:] phase;
wire [:] sin_o; /*
Fo = 115200Hz
Fw = 4947802.3
*/
DdsTopV
#(
// .COUNTWIDTH(32'd32),
.FW('d4947802)
)
uut
(
.clk(clk),
.rst_n(rst_n),
.phase (phase),
// .addr(addr),
.clk_out(clk_out),
.sin_o(sin_o)
); initial begin
clk = ;
rst_n = ;
# rst_n=;
end always # clk=~clk; endmodule
设置Block Memery
仿真结果

via
https://www.cnblogs.com/christsong/p/5536995.html
FPGA学习笔记. DDS的更多相关文章
- FPGA学习笔记(二)——FPGA学习路线及开发流程
###### [该随笔部分内容转载自小梅哥] ######### 一.FPGA学习路线 工具使用 -> 语法学习 -> 逻辑设计 -> IP使用 ->接口设计 -& ...
- FPGA学习笔记(三)—— 数字逻辑设计基础(抽象的艺术)
FPGA设计的是数字逻辑,在开始用HDL设计之前,需要先了解一下基本的数字逻辑设计-- 一门抽象的艺术. 现实世界是一个模拟的世界,有很多模拟量,比如温度,声音······都是模拟信号,通过对模拟信号 ...
- FPGA学习笔记(一)——初识FPGA
###### [该随笔部分内容转载自小梅哥] ######### FPGA(Field-Programmable Gate Array,现场可编程门阵列),正如其名,FPGA内部有大量的可 ...
- FPGA学习笔记(七)——FSM(Finite State Machine,有限状态机)设计
FPGA设计中,最重要的设计思想就是状态机的设计思想!状态机的本质就是对具有逻辑顺序和时序规律的事件的一种描述方法,它有三个要素:状态.输入.输出:状态也叫做状态变量(比如可以用电机的不同转速作为状态 ...
- Xilinx FPGA 学习笔记
一.时序设计 方法1.通过状态机来实现,通过verilog控制FPGA,让它该快的时候快,该慢的时候慢. 方法2.FPGA中运行CPU 把逻辑控制顺序复杂的事情用C代码来实现,而实时处理部分用veri ...
- FPGA学习笔记之Altera FPGA使用JIC文件配置固化教程(转)
很多做过单片机的朋友都知 道,我们在对MCU烧写完程序固件后,那么该程序固件就存储在了该MCU内部.即使MCU断电了再重新上电,程序也能继续运行.这是因为对MCU烧写固件 的实质就是将程序固件写入到M ...
- FPGA学习笔记(八)—— 状态机设计实例之独立按键消抖
###### [该随笔中部分内容转载自小梅哥] ######### 独立按键消抖自古以来在单片机和FPGA中都是个不可避免的问题,首先,解释一下什么叫做按键抖动,如图,按键在按下和松开的那个瞬间存在大 ...
- FPGA学习笔记(六)—— 时序逻辑电路设计
用always@(posedge clk)描述 时序逻辑电路的基础——计数器(在每个时钟的上升沿递增1) 例1.四位计数器(同步使能.异步复位) // Module Name: coun ...
- FPGA学习笔记之按键控制
参考: [黑金原创教程][FPGA那些事儿-驱动篇I ]实验二:按键模块① - 消抖 源码如下: key_funcmod.v module key_funcmod(clk, rst, key, led ...
随机推荐
- webWorker
一.webWorker之初体验 在"setTimeout那些事儿"中,说到JavaScript是单线程.也就是同一时间只能做同一事情. 也好理解,作为浏览器脚本语言,如果JavaS ...
- Book Review 《构建之法》-2
-敏捷流程包括了几大原则:Backlog.burn-down.Sprint.Scrum. 敏捷开发注重个人之间的交流,提倡尽早的交付有价值的软件满足顾客的需求, 在开发过程中不断与客户进行交互,变化. ...
- 老李的blog使用日记(2)
寥寥数语结束一个不曾期待的遇见,可还是剧情不会这样结束,他也会在我的时间里注册自己的专属账号,无论什么时候,他会时而需要被注视着,为了达到目的,即使不择手段,只为一次擦肩而过的邂逅,极短的一段时间,相 ...
- Ubuntu安装eclipse,并创建桌面快捷方式
系统:Ubuntu 16.04 JDK版本:1.8.0_121 Ubuntu下安装JDK配置环境变量可见我的这篇文章 http://www.cnblogs.com/AloneZ/p/Ubuntu1 ...
- [转帖] 大神 Linus Torvalds 语录
My name is Linus Torvalds and I am your god.我的名字是Linus Torvalds,我是你们的上帝.(在1998 Linux大会上的自我介绍) If you ...
- C语言变长数组data[0]
1.前言 在刷题时遇到一个结构中包含char data[0],第一次见到时感觉很奇怪,数组的长度怎么可以为零呢?于是上网搜索一下这样的用法的目的,发现在linux内核中,结构体中经常用到data[0] ...
- tp3.2.3运用phpexcel将excel文件导入mysql数据库
1,下载PHPExcel 2,配置将下载好的PHPExcel文件与PHPExcel.php 放到thinkphp 根目录 include/Library/Org/Util/下面 3,同时将PHPExc ...
- 移动的调试工具vConsole
在PC端写代码调试的时候,直接console.log()即可,但是在手机端怎么调试??最近发现一个很有用的插件vConsole 首先引入插件: 然后再文件中使用即可: 这样再手机中就会出现下面的标识, ...
- KSOA单据保护表中Clientid解析为mac和ip
SELECT DISTINCT a.*,ISNULL(c.client_net_address,'') AS client_net_address FROM ( SELECT * ,),,) ) ), ...
- [代码]--其他信息: ORA-01400: 无法将 NULL 插入
这个错误其实就是oracle数据库的某列约束为 not null,但在插入值的时候插入了控制,无论是null和"",它都识别为空 有两种方法: 1.修改数据库字段约束为允许为空 2 ...