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的更多相关文章

  1. FPGA学习笔记(二)——FPGA学习路线及开发流程

    ###### [该随笔部分内容转载自小梅哥]       ######### 一.FPGA学习路线 工具使用 -> 语法学习 -> 逻辑设计 -> IP使用 ->接口设计 -& ...

  2. FPGA学习笔记(三)—— 数字逻辑设计基础(抽象的艺术)

    FPGA设计的是数字逻辑,在开始用HDL设计之前,需要先了解一下基本的数字逻辑设计-- 一门抽象的艺术. 现实世界是一个模拟的世界,有很多模拟量,比如温度,声音······都是模拟信号,通过对模拟信号 ...

  3. FPGA学习笔记(一)——初识FPGA

    ###### [该随笔部分内容转载自小梅哥]       ######### FPGA(Field-Programmable Gate Array,现场可编程门阵列),正如其名,FPGA内部有大量的可 ...

  4. FPGA学习笔记(七)——FSM(Finite State Machine,有限状态机)设计

    FPGA设计中,最重要的设计思想就是状态机的设计思想!状态机的本质就是对具有逻辑顺序和时序规律的事件的一种描述方法,它有三个要素:状态.输入.输出:状态也叫做状态变量(比如可以用电机的不同转速作为状态 ...

  5. Xilinx FPGA 学习笔记

    一.时序设计 方法1.通过状态机来实现,通过verilog控制FPGA,让它该快的时候快,该慢的时候慢. 方法2.FPGA中运行CPU 把逻辑控制顺序复杂的事情用C代码来实现,而实时处理部分用veri ...

  6. FPGA学习笔记之Altera FPGA使用JIC文件配置固化教程(转)

    很多做过单片机的朋友都知 道,我们在对MCU烧写完程序固件后,那么该程序固件就存储在了该MCU内部.即使MCU断电了再重新上电,程序也能继续运行.这是因为对MCU烧写固件 的实质就是将程序固件写入到M ...

  7. FPGA学习笔记(八)—— 状态机设计实例之独立按键消抖

    ###### [该随笔中部分内容转载自小梅哥] ######### 独立按键消抖自古以来在单片机和FPGA中都是个不可避免的问题,首先,解释一下什么叫做按键抖动,如图,按键在按下和松开的那个瞬间存在大 ...

  8. FPGA学习笔记(六)—— 时序逻辑电路设计

    用always@(posedge clk)描述        时序逻辑电路的基础——计数器(在每个时钟的上升沿递增1) 例1.四位计数器(同步使能.异步复位) // Module Name: coun ...

  9. FPGA学习笔记之按键控制

    参考: [黑金原创教程][FPGA那些事儿-驱动篇I ]实验二:按键模块① - 消抖 源码如下: key_funcmod.v module key_funcmod(clk, rst, key, led ...

随机推荐

  1. Unity插件-NGUI学习笔记

    Anchors 的作用 类似Android里面的.9格式图片的功能, 边框可以随着文字变大而变大. 实现方法: 用NGUI 创建一个Sprite, 命名为TextBg, 一个Label, Label的 ...

  2. oracle union

    union 取并集,去重不仅去掉两个集合之间的重复,也会去掉集合的自重复

  3. 第二个Sprint冲刺第三天(燃尽图)

  4. Resharper简单安装及代码覆盖率的测试

    Resharper简单安装及代码覆盖率的测试 测试环境:VS 2015 专业版 一.下载Resharper 官方链接:https://www.jetbrains.com/resharper/ 点击下载 ...

  5. WPF使用路径(URI)引用资源文件

    Uri uri = new Uri("pack://application:,,,/程序集名称;component/Resources/bj.png", UriKind.Absol ...

  6. AD分辨率和精度区别

    最近做了一块板子,当然考虑到元器件的选型了,由于指标中要求精度比较高,所以对于AD的选型很慎重.很多人对于精度和分辨率的概念不清楚,这里我做一下总结,希望大家不要混淆.我们搞电子开发的,经常跟“精度” ...

  7. Linux 基础一(系统分区、格式化与挂载)

    1.Linux 基础之系统分区与格式化 讲分区之前,先说一下硬盘结构:硬盘(机械)的横截面是一个圆,并且被分成等大小的扇区,每个扇区的大小是 512Byte,其中有 446Byte 被用来存储启动信息 ...

  8. python 十进制整数转换为任意进制(36以内)

    def baseN(num, b): return ((num == 0) and "0") or (baseN(num // b, b).lstrip("0" ...

  9. robotframework 赋予临时id

    有的时候用rf执行ui自动化测试脚本的时候,一直提示找不到元素 (前提是没有id) 那么这个时候 我们可以随便赋予一个临时id Assign Id To Element      xpath=//*[ ...

  10. poj2135 Farm Tour(费用流)

    Description When FJ's friends visit him on the farm, he likes to show them around. His farm comprise ...