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. web框架-Struts开始

    问题: 为什么有structs 作为一种框架(frameset)可以与传统的mvc进行比较? MVC是一种模式数据处理.显示和数据输入分开,来规范开发,但是却又并不规范.可以这样想:有三家公司,他们对 ...

  2. Hadoop 5 Hbase 遇到的问题

    hbase伪分布式配置完成后: 在bin/hbase shell 进行create操作时出现:Can't get master address from ZooKeeper; znode data = ...

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

  4. 个人作业Week2-代码复审

    代码复审Check List 概要部分 代码能符合需求和规格说明么? 符合.针对-c和-s可以将正确的结果输出到相应的sudoku.txt,并在规定的时间内求解. 代码设计是否有周全的考虑? 有的.我 ...

  5. [Java]Object有哪些公用方法?

    1.clone方法 保护方法,实现对象的浅复制,只有实现了Cloneable接口才可以调用该方法,否则抛出CloneNotSupportedException异常. 主要是JAVA里除了8种基本类型传 ...

  6. Django-基本概念

    目录 Django 项目创建 项目结构 应用目录 Django Django是一个开放源代码的Web应用框架, 由Python写成. 采用了MVC的软件设计模式, 即模型M, 视图V和控制器C. 这套 ...

  7. 防止短时间js 重复执行

    function debounce(fn, delay) { // 持久化一个定时器 timer let timer = null; // 闭包函数可以访问 timer return function ...

  8. robotframework 赋予临时id

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

  9. swagger error: Conflicting schemaIds: Duplicate schemaIds detected for types A and B

    使用Web API并使用swashbuckle生成swagger文档,我在两个不同的命名空间中定义了两个具有相同名称的不同类.当我在浏览器中打开swagger页面时,它说: Conflicting s ...

  10. 实体框架自定义代码优先约定(EF6以后)

    仅限EF6仅向前 - 此页面中讨论的功能,API等在实体框架6中引入.如果您使用的是早期版本,则部分或全部信息不适用. 使用Code First时,您的模型是使用一组约定从您的类计算的.默认的Code ...