-
使用
FPGA
产生
正弦
波
看不懂可以加
137194782
1 <
/p>
使用
matlab
产生
< br>正弦
波的
.mif
的
rom
表
工程中,经常
要用到正弦表数据。把正弦表数据存入
mif
文件中,
供
LPM_ROM
初始化用,那么如何得到正弦
表数据呢?可以用
matlab
实现
这里介绍两种方式:
(一)这个方法
只在
matlab
中生成数据表,需要自己手动的
往
mif<
/p>
文件中添加数据
1.
< br>假设用到的
DA
芯片为
14
p>
为,则
2^14=16384
2.
一个完整的正弦波为
0-2pi
3.
正弦波
ROM
的深度为
4096
(地址总数)
4.
由于
FPGA
中不识别负数,加入一个直流分量,加
8192
则用
matlab
产生正弦表的函
数为:
Y=ceil((16384/2-1)*sin(0
:pi*2/4096:2*pi)+8192)
其中
ceil
函数描述如下:
ceil(x) :
大于
x
的最小整数
>>ceil(
[3.12 -3.12])
ans =4
-3
(二)
可以直接生成
mif
文件
直接生成
mif
文件
depth = 4096;
width =14;
x=ceil(16384/2*sin(0:pi*2/4096:2*pi)+8192)
fid =
fopen('d:','w');%
路径
fprintf(fid,'depth= %d n',depth);
fprintf(fid,'width= %d n',width);
fprintf(fid,'address_radix=uns;n');
fprintf(fid,'data_radix = uns;n');
fprintf(fid,'Content Begin n');
for(k=1:depth)
fprintf(fid,'%d: %d n',k-1,x(k));
end
fprintf(fid,'end;');
用上面这段程序最大值会出现
163
84
,
在
Quartus II
中会认为是超出数
据范围,所以需要手动的改写为
16383
把
x=ceil(16384/2*sin(0
:pi*2/4096:2*pi)+8192)
改写为下面语句
x=ceil((16384/2-1)*sin(0:pi*2/4096:2*pi)+8192)
就不存在上述问题
了
数据量小的话,可以用第一种方法,要是数据量大的话,介意用第
二种方法。<
/p>
2
使用
modelsim
仿真
< br>FPGA
产生正玄波。
最简易
的
sin
波发生器
Verilog
代码:
module sin_top (
input clk_50m,
input rst_n,
output
[13:0]
q
);
reg [11:0] cnt;
wire [11:0] addr;
always @(posedge clk_50m or
negedgerst_n) begin
if(!rst_n)
cnt<= 12'd0;
else if(cnt ==
12'd4095)
cnt<= 12'd0;
else
cnt<= cnt +
12'd1;
end
assign addr = cnt;
sin_romsin_rom_inst(
.address(addr),//4096
.clock(clk_50m),
.q(q)
//14bit
);
Endmodule
-
-
-
-
-
-
-
-
-
上一篇:SPIM和SPIS介绍
下一篇:HR英文版知识(名词)