用MATLAB产生并行的LFSR

上一篇 / 下一篇  2017-04-17 09:58:10

线性反馈移位寄存器(LFSR)由于它的混效率低,经常作为输出响应分析器(ORA)广泛应用于logic BIST中。LFSR实际上是在GF域上的除法器(模2多项式除法),所以用组合逻辑产生和LFSR相同功能的电路理论上讲应该是可能的。
下面我们以一个LFSR为例,说明一下如何用MATLAB生成和LFSR具有相同功能的组合逻辑电路的HDL。
假设出入数据M=11011001000,最左端为MSB(先进入LFSR)。设M的最高位为S1,以此类推最低位为S11。对此LFSR在第i个时钟周期应有如下表达式成立
利用MATLAB强大的矩阵运算能力,我们可以通过循环计算11个周期之后Q3Q2Q1Q0的值。显而易见,最后寄存器中的值只是S1...S11中部分值的异或。
若想生成这个异或阵列的HDL,当然要用MATLAB求出符号表达式。我们可以将Q3Q2Q1Q0分别用x^4,x^3...x来代表。利用MATLAB符号运算,最后得出Q3Q2Q1Q0的每一位都为一个多项式。再利用MATLAB处理字符串,得出异或门阵列的形式,最后通过fopen 和 fdisplay函数输出到HDL文件中。
实现代码如下:

%输入数据流为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');

TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

我的栏目

日历

« 2017-07-19  
      1
2345678
9101112131415
16171819202122
23242526272829
3031     

我的存档

数据统计

  • 访问量: 404
  • 日志数: 2
  • 建立时间: 2017-04-16
  • 更新时间: 2017-04-17

RSS订阅

Open Toolbar