内存初始化文件: mif格式 hex格式 coe格式的相互转换如何实现?

内存初始化文件: mif格式 hex格式 coe格式的相互转换如何实现?,第1张

村里的傻子遇陪厅见个收废品的,小声的问他收铁轨不?收废品的四处张望了下说收,傻子说有点长,那人说没事先领我看看,傻子说等晚上的...到了夜里傻子把收废品的领橘举到了铁路上指着地上的火圆乱碧车道说,就是这两根,青岛到北京的,你开个价吧 …

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 。其在输入相位累加器之前,在系统时钟同步下做数据寄存,数据改变时不会干扰相位累加器的正常工作。

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

我们首先来看看一个ROM的生成过程。当我们生成一个ROM模块时,在Memory Initialization选项中,会让开发者去指定COE文件的路径,

当我们指定好COE文件的路径,最后生成ROM后,会发现,在生成的ROM的IP核工程的文件夹列表中会同时生成MIF文件,

打开MIF文件,会发现里面内容与COE文件相同,这时不禁会让人感到疑惑:到底ROM会用哪个文件作为自己的初始化文件呢?

答案是MIF文件。

COE文件的作用,是困败生成IP核工程的时候,将其文件中的内容导入,生成MIF文件。也就是说,MIF文件是基于COE文件生成的,所以二者的内容才会相同(格式上是不汪基颤同的)。此后,在实际的使用中,只有MIF文件才会发挥作用,COE这时就已经“无用”了。由此可以推测,若想改变某个ROM模块的初始化文件,要么重新生成一遍ROM模块,导入新的COE文件,要么直接替换掉MIF文件,二者的作用是等效的,只是后者做法不太规范,由于COE文件未变,若再生成ROM模块会导致MIF文件会根据老的COE文件重生成。

总结起来,在使用过程中,需要注意以下几点:

1、  MIF文件是根据COE文件生成的。

2、  COE文件只会在锋野生成ROM模块时起作用,其作用就是根据文件内容生成相应的MIF文件,而ROM真正使用的是MIF文件。

3、  若想改变某个ROM模块的初始化内容,根本上来说是要改变MIF文件,有两种方法:一是替换掉原来的COE文件,再将ROM模块重新生成一遍;二是直接替换掉MIF文件。前者是比较规范的作法,因为后者的COE文件未变,若后面再去因为配置ROM参数而重新生成ROM模块会导致MIF文件又会回到“老样子”。切忌直接替换COE而不重新生成ROM模块的作法,这样MIF文件没变,所以初始化内容也会保持不变


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

原文地址: http://outofmemory.cn/tougao/12151758.html

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

发表评论

登录后才能评论

评论列表(0条)

保存