在使用FPGA實現sin波形的時候採用查找表法比較簡單,也就是讀取ROM表的值,具體的步驟如下:
1、第一步是需要在ROM中添加初始化數據,創建.mif文件,採用matlab來實現。matlab代碼如下:
width=12; %寬度是
depth=4096; %深度是1024
n=0:depth-1;
yn=sin(2*pi/4096*n);
yn=round((yn+1)*2047);
plot(n,yn);
%===============================開始寫mif文件===============================
addr=0:depth-1;
str_width=strcat('WIDTH=',num2str(width));
str_depth=strcat('DEPTH=',num2str(depth));
fid=fopen('E:\code\matlab_code\sin_code.mif','wt'); %打開或者新建mif,存放位置和文件名任意
%如果只寫文件名,則在當前目錄下建立此文件
fprintf(fid,str_width);
fprintf(fid,';\n');
fprintf(fid,str_depth);
fprintf(fid,';\n\n');
fprintf(fid,'ADDRESS_RADIX=HEX;\n'); %因爲下面的數據輸入我選的是16進制,
%這裏可根據情況改寫
fprintf(fid,'DATA_RADIX=HEX;\n\n');
fprintf(fid,'CONTENT BEGIN\n');
fprintf(fid,'\t%X : %X;\n',[addr;yn]) %開始寫數據了
fprintf(fid,'END;\n');
fclose(fid);
可以得到如下所示的.mif文件WIDTH=12;
DEPTH=4096;
ADDRESS_RADIX=HEX;
DATA_RADIX=HEX;
CONTENT BEGIN
0 : 7FF;
1 : 802;
2 : 805;
3 : 808;
注意數據的位寬和數據的深度,也就是ROM表中數據個數,這裏我設置的是位寬爲12位,深度爲4096,把sin一個週期採樣成4096份。
2、第二步是建立ROM表,主要的問題也是數據的位寬和深度。
Attention!!!
添加的.mif文件一定要放在所建立的工程文件下面,不然會讀不出ROM表中的數據。(至少quartusII 12版本是這個樣子的)
3、寫主module,然後將生成的ROM例化進去
module sin(clk,rst_n,start,data_out,phase);
input clk;
input rst_n;
input start;
output [11:0]data_out;
output [11:0]phase ;
/******************************/
wire [11:0]phase;
myrom U1(
.address(phase),
.clock(clk),
.q(data_out));
/*******************************/
reg [11:0]cnt=12'd0;
always@(posedge clk or negedge rst_n)
begin
if(rst_n==1'b0)
cnt<=12'd0;
else if(start)
cnt<=cnt+1'b1;
else
cnt<=cnt;
end
assign phase=cnt;
endmodule
4、編寫testbench
`timescale 1 ns/1 ns
module sin_simulation();
reg clk;
reg rst_n;
reg start=1;
wire [11:0]data_out;
wire [11:0]phase;
/*******************************/
sin U1(.clk(clk),.rst_n(rst_n),.start(start),.data_out(data_out),.phase(phase));
initial
begin
rst_n=1'b0;
#5;
rst_n=1'b1;
end
initial
begin
clk=0;
forever #5 clk=~clk;
end
endmodule
5、運行modelsim
設置modelsim模式爲示波器模式,數據格式設置爲無符號類型
Radix——unsigned
Format——Analog(automatic)
這樣就得到要顯示的波形啦!
6、通過設置設置地址的步進長度可以得到不同週期的正弦波,同時創建不同波形的.mif文件,同樣可以通過按鍵得到不同的相應的波形,製作一個簡易的波形發生器。
需要注意的就兩點:1、.mif文件中數據的寬度和深度,然後還有創建的ROM的數據寬度和深度,兩者不匹配的話就 會讀不 出數據
2、添加.mif文件的地址需要注意,如果碰到讀不出數據,首先檢查一下添加地址是否正確