%输入数据流为1 x x^2 ... x^n
%LFSR特征方程为f
%产生LFSR的verilog代码
clear all;
syms x;
f=[1 0 0 1 1];%本原多项式x^4+x+1
%f=[1 1 0 0 1];
%f=[1 1 1 1 0];
A=circshift(eye(4),-1);
A(1,:)=[];
A=cat(1,f(1:4),A);
A(:,5)=zeros(4,1);
A(4,5)=1;
Q=[0 0 0 0 ]';
S=[x^10;x^9;x^8;x^7;x^6;x^5;x^4;x^3;x^2;x;1]
i=1;
while(i<12)
Q=cat(1,Q(1:4),S(i));
Q=A*Q;
i=i+1;
end
R(1,:)=rem(sym2poly(Q(1)),2);
R(2,:)=rem(sym2poly(Q(2)),2);
R(3,:)=rem(sym2poly(Q(3)),2);
R(4,:)=rem(sym2poly(Q(4)),2);
R=R*S
%生成verilog
A = [];
str='C:\Users\dell-pc\Documents\MATLAB\毕设\lfsr';
str=cat(2,str,dec2bin(f)');
str=cat(2,str,'.v')
save(str,'A','-ascii');
fid=fopen(str,'wt');
fprintf(fid,'module lfsr');
fprintf(fid,dec2bin(f)');
fprintf(fid,'(\n');
fprintf(fid,'input [10:0]address,\noutput [3:0]cmp_addr\n);\n');
i=3;
while(i>=0)
fprintf(fid,'wire cmp_addr%d;\n',i);
i=i-1;
end
i=10;
while(i>=0)
fprintf(fid,'assign address%d=address[%d];\n',i,i);
i=i-1;
end
fprintf(fid,'\n');
i=3;
while(i>=0)
fprintf(fid,'assign cmp_addr[%d]=cmp_addr%d;\n',i,i);
i=i-1;
end
str_R1=char(R(1));
str_R2=char(R(2));
str_R3=char(R(3));
str_R4=char(R(4));
str_R1_0=strrep(str_R1,'+ 1','+ x^0');
str_R1_1=strrep(str_R1_0,'x^','address');
str_R1_2=strrep(str_R1_1,'x','address1');
str_R1_3=strrep(str_R1_2,' + ','^');
str_R2_0=strrep(str_R2,'+ 1','+ x^0');
str_R2_1=strrep(str_R2_0,'x^','address');
str_R2_2=strrep(str_R2_1,'x','address1');
str_R2_3=strrep(str_R2_2,' + ','^');
str_R3_0=strrep(str_R3,'+ 1','+ x^0');
str_R3_1=strrep(str_R3_0,'x^','address');
str_R3_2=strrep(str_R3_1,'x','address1');
str_R3_3=strrep(str_R3_2,' + ','^');
str_R4_0=strrep(str_R4,'+ 1','+ x^0');
str_R4_1=strrep(str_R4_0,'x^','address');
str_R4_2=strrep(str_R4_1,'x','address1');
str_R4_3=strrep(str_R4_2,' + ','^');
fprintf(fid,'assign cmp_addr3=');
fprintf(fid,str_R1_3);
fprintf(fid,';\n');
fprintf(fid,'assign cmp_addr2=');
fprintf(fid,str_R2_3);
fprintf(fid,';\n');
fprintf(fid,'assign cmp_addr1=');
fprintf(fid,str_R3_3);
fprintf(fid,';\n');
fprintf(fid,'assign cmp_addr0=');
fprintf(fid,str_R4_3);
fprintf(fid,';\n');
fprintf(fid,'endmodule\n');