手头刚好有块高速 AD/DA 模块,用锆石A4来驱动他产生正弦波,在手上都快发霉了
。
实验:将正玄波数据存储在IP核构建ROM中,从ROM中读出数据,并将数据直接通过并口输出到DA上。、
DA原理图: 使用的是AD9708
现在开始讲解实现这个功能:
在建工程之前先准备一个正玄波的mif文件要用到一个软件来生成
软件Guagle_wave
来生成正玄波
然后建立工程
添加ip核(因为我用的是15的版本)在IP catalog 中找到单口的rom 添加
然后是配置rom了
然后下一步
最后添加之前生成的mif文件
完成。
在编译一下
然后写一个testbench文件进行RTL的仿真
代码:
- `timescale 1ns/1ns
- `define clk_period 20
-
-
-
- module rom_sin_tb;
-
- reg [7:0]addr;
- reg clk;
-
- wire [7:0]q;
-
- integer i;
- rom_sin rom_sin1(
- .address(addr),
- .clock(clk),
- .q(q)
- );
-
-
- initial clk = 1;
- always #(`clk_period/2) clk = ~clk;
-
- initial begin
- addr = 0;
- for(i=0;i<2550;i=i+1) begin
- #`clk_period;
- addr = addr +1;
- end
- #(`clk_period * 500);
- $stop;
- end
- endmodule
然后全编译一下
仿真:
得到的波形是这样的:尴尬
去设置一下q的数据类型是无符号的
然后得到的波形是:
波形上移了,然后去设置一下波形的最大值最小值的 最大254 最小0
然后波形出来了
仿真成功了
然后就是板级验证了:
代码:
- module rom_sin_top(Clk,DA_Clk,Rst_n,q);
-
- input Clk;
- input Rst_n;
-
- output DA_Clk;
- output [7:0]q;
-
- reg [7:0]addr;
-
- rom_sin rom_sin2(
- .address(addr),
- .clock(Clk),
- .q(q)
- );
-
- assign DA_Clk = Clk;
- always@(posedge Clk or negedge Rst_n)
- if(!Rst_n)
- addr <= 8'd0;
- else
- addr <= addr +1'b1;
- endmodule
最后下载到板子上:
完成
本帖最后由 ihalin 于 2016-8-22 12:35 编辑