在开发FPGA过程中,经常会遇到重复性的语句需要编写,而这些重复性的语句又不是完全重复的,而是有不同的编号。这个时候直接人工编程非常麻烦,这里分享matlab自动产生verilog的方法。
close all
fs=10000000;%采样频率
%N=length(y);
N=1024;%FFT点数
size = 10 ;
freq=(0:N-1)*fs/N;%频率轴
t=linspace(0,2*pi,N);
y=sin(t)'%产生单音信号
q = quantizer('fixed', 'ceil', 'saturate', [10 8]);%量化
%q = quantizer('fixed', 'ceil', 'saturate', [12 10]);%量化
y_q=num2bin(q,y); %量化输入
fid=fopen('dds_rom.v','wt');%自动生成rom文件
fprintf(fid,'module dds_rom(CLK2,ADDR,dataout);\n');
fprintf(fid,'input CLK2;\n');
fprintf(fid,'input [9:0] ADDR;\n');
fprintf(fid,'output [%d:0] dataout;\n',size-1);
fprintf(fid,'reg [%d:0] dataout;\n',size-1);
fprintf(fid,'\n');
fprintf(fid,'always @(posedge CLK2)\n');
fprintf(fid,'case(ADDR)\n');
fprintf(fid,'\n');
for j=1:N;
i=j-1;
fprintf(fid,'10''d%3d',i); fprintf(fid,':');
fprintf(fid,'dataout = #1 %d''b%s',size,y_q(j,:));
fprintf(fid,';\n');
end
fprintf(fid,'endcase\n');
fprintf(fid,'endmodule');
fclose(fid);
比如这个代码,运行之后,会产生如下的verilog代码:
module dds_rom(CLK2,ADDR,dataout);
input CLK2;
input [9:0] ADDR;
output [9:0] dataout;
reg [9:0] dataout;
always @(posedge CLK2)
case(ADDR)
10'd 0:dataout = #1 10'b0000000000;
10'd 1:dataout = #1 10'b0000000010;
10'd 2:dataout = #1 10'b0000000100;
10'd 3:dataout = #1 10'b0000000101;
10'd 4:dataout = #1 10'b0000000111;
10'd 5:dataout = #1 10'b0000001000;
10'd 6:dataout = #1 10'b0000001010;
10'd 7:dataout = #1 10'b0000001100;
.........................
10'd1012:dataout = #1 10'b1111101111;
10'd1013:dataout = #1 10'b1111110001;
10'd1014:dataout = #1 10'b1111110010;
10'd1015:dataout = #1 10'b1111110100;
10'd1016:dataout = #1 10'b1111110101;
10'd1017:dataout = #1 10'b1111110111;
10'd1018:dataout = #1 10'b1111111001;
10'd1019:dataout = #1 10'b1111111010;
10'd1020:dataout = #1 10'b1111111100;
10'd1021:dataout = #1 10'b1111111101;
10'd1022:dataout = #1 10'b1111111111;
10'd1023:dataout = #1 10'b0000000000;
endcase
endmodule
这里面有1023个数据项,如果纯人工输入,非常费时间。而使用上述的matlab代码,则瞬间完成。
我们对上述的matlab做下简单的分析
产生一个名字为dds_rom.v的verilog文件,这个地方可以根据自己需要改名字
产生input和output接口
这个地方,通过j循环,产生重复性的语句,即verilog的1024个数据信息
产生结尾信息,endcase和endmodule。