在vivado中怎么调用时

在vivado中怎么调用时,第1张

设计DDS的核心就是调用IP ROM,vivado调用ROM的方法和ISE相类似,都是加载.coe文件,我这里特地做笔记,以防忘记。

这是DDS的原理图,DDS并没有像它的名字一样说的那么玄乎,它的核心便是控制频率的fword字输入,和相位字pword输入,最后调用IP核查找表即可,代码也十分简单,下面给出DDS design代码。

 DDS_design

使用vivado调用IP核ROM教程如下

点击IP catalog

选择block memory,然后双击

将show disabled ports 选项勾选掉

输入ROM名,我这里为了演示重新配置一个方波ROM,命名为square_rom

这里选择single ports ROM

按如上图所示勾选参数,port width是数据宽度,我们根据代码要求设置为10位,

port width是数据深度,即有多少个这样的数据,我打开生成的square.coe文件可以清楚的看到一共有4096这样的数据。

always enable是ROM一直处于工作宏笑脊状态,不需要使能信号。

这里是加载.coe文件,勾选load init file 然后点击browse将刚才生成的square.coe文件加载到ROM中,最后点击OK。

选择generate生成IP核

打开如图所示文件,

将生成的IP核实例化,即可

最后编写测试文件进行测试

最后右键点击da_data选择wave style选择analog,将会看到模拟波形,但是有时候还是需要设置一下模拟波形的显升颂示,同样右键点击da_data选择wave style选择analog setting,选择如蔽渗下图所示参数。

最后便大功告成,即可得打方波的波形图

大家还可以按照这种方法将其他两种波形都做出来。

1、理论知识

实现方法:将数字量转换为模拟量,根据输出数字量的大小转换为模拟量以实现信号幅值的变化。

具体思路:提前声明一个ROM IP核,将正弦波、三角板、方波和锯齿波的数字量写入进去,或者也可以自己用Verilog写一个ROM,ROM作为只读的一个存储器,在声明的时候需要提前将数据写入到ROM中,然后给定其一个地址,便会输出该地址所对应的数据以实现信号波形的输出。

根据思路进行举例说明:

若要实现一个正弦波的输出,提前将ROM的深度定义为1024,宽度定义桥郑岁为10位宽。则ROM中有1024个数据,每个数据的位宽为10位二进制,这1024个数据代表了一个正弦波。

由于位宽为10位,则输出幅值的最大值为2^10-1=1023,最小为0,具体如下图

同理可以实现三角波、方波、锯齿波。

2、具体实践

目标:用Vivado中的ROM IP核,实现正弦波、三角波、方波、锯齿波的输出。

第一步 生成波形数据

可以使用mif精灵,或者matlab生成一个coe文丛桐件,文件内容格式具体如下图:

第二步 定义ROM IP核

定义一个但端口的ROM IP核,一个波形深度为1024,则存放四个波形的深度需要4096,对应的地址位为12位。

然后将第一步生成的coe文件写入ROM中。

第三步 编写源文件代码并调用IP核

具体源文件代码如下

module wave4_rom(

input wire sys_clk,

input wire ena,

input wire [11:0] addr,

input wire [9:0] data_out

)

//调用第二步生成的ROM IP核

sinwave_rom inst1 (

.clka(sys_clk),// input wire clka

.ena(ena), // input wire ena

.addra(addr), // input wire [11 : 0] addra

.douta(data_out) // output wire [9 : 0] douta

)

endmodule

登录后复制

第四步 编写仿真代码

仿真代码如下:

`timescale 1ns / 1ns

module tb_wave4_rom()

reg sys_clk

reg ena

reg [11:0] addr

wire [9:0] data_out

initial

begin

sys_clk=1'b1

ena<=1'b0

#200

ena<=1'b1

end

always #10 sys_clk=~sys_clk

always@(posedge sys_clk or negedge ena)

if(ena==1'b0)

addr<=12'd0

else if(addr==12'd4095)

addr<=12'd0

else

addr<=addr+1'b1

//实例化源文件

wave4_rom inst1(

.sys_clk (sys_clk) ,

.ena (ena) ,

.addr (addr) ,

.data_out (data_out)

)

endmodule

登录后复制

Vivado仿真波形

整体波形如下

方波的数据只有1023和0

3、拓展训练

可以使用FPGA的按键控制四种波形的输出,需要使用到按键消抖模块。

也可敏睁以进行输出波形的频率和相位调制,实现一个简易的DDS信号发生器。具体实现原理图如下

图中所展示的四大结构中,相位累加器是整个 DDS 的核心,在这里完成相位累加,生成相位码。相位累加器的输入为频率字输入 K,表示相位增量,设其位宽为 N,满足等式K = 2^N * fOUT / fCLK 。其在输入相位累加器之前,在系统时钟同步下做数据寄存,数据改变时不会干扰相位累加器的正常工作。

通过改变频率字输入和相位字输入实现输出波形频率和相位的调节。

在用core gen 产生rom的时候,有个步骤,导入用户的coe文件(所有rom的参数都可以在这个文件中设置,如果不设置,rom生成之后,使用默认参数):

-----------------------

一个标准的coe文件的格式如下:

MEMORY_INITIALIZATION_RADIX=2//数据格式,此为2进制,还可以为8,10,16进制

MEMORY_INITIALIZATION_VECTOR=

01110100,

00100000,

11110101,

10000000,

01111000,

00100010,

00000001,

00010100,

00000000,

00000000,

00000000,

00000000,

00000000,

00000000,

00000000,

00000000,

00000000,

00000000,

00000000,

00000000,

01110100,

00000101,

11110101,

10000000,

00000000,

00000000,

00000000,

00000000,

00000000,

00000000,

00000000,

00000000,

00000000

-----------------------

再举一个例子:

Xilinx FIR滤波器系数文件格式

radix = 10 //系数的进制,此为10进制,也可以为2, 10,16进制

coefdata =

coef1,

coef2,

coef3,

coefN

文件扩展名为.coe。FIR的datasheet里没有写进制位8的情况。

在ise下,ROM初始化是靠加载coe文件完成的。其格式如下:

MEMORY_INITIALIZATION_RADIX=2//表示ROM内容的数据格式是2进制

MEMORY_INITIALIZATION_VECTOR=

00000000

00000001

00000011

但是当数据量很大的时候,直接写很不方便。

下面我将介绍,借助matlab工具来快速完成包含大量数据的coe文件的编写。

1、在matlab中将数据录入,如果数据是在txt文件中,可以读文件录入(网上很容易找到相关命令)。

2、将数据存成n行1列的数组。

3、通常录入的数据都是10进制的。可以用命令A=dec2bin(I)转为2进制字符,再用M=str2num(A)转换为数启前字显示。

如15,经过两次转化即为11111111;

4、将matlab数据窗口中的A双击出来,会显示n行1列的2进制数(类似excel),直接全选复制数据到txt文件中;

在txt文件开头加入:

MEMORY_INITIALIZATION_RADIX=2//表示ROM内容的数据格式是2进制

MEMORY_INITIALIZATION_VECTOR=

在txt文件的最后一个数字后加入悄者清分号“;”。

5、将txt文件后缀直接改为coe文件类型。嫌裂这时我们需要的coe文件就产生了。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11976907.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存