關於使用FPGA實現sin波形並讀取ROM值得問題

在使用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文件的地址需要注意,如果碰到讀不出數據,首先檢查一下添加地址是否正確




















發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章