xcman的个人空间 https://blog.eetop.cn/1574971 [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

用MATLAB产生并行的LFSR

已有 2441 次阅读| 2017-4-17 09:58 |系统分类:芯片设计

线性反馈移位寄存器(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');

点赞

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 2

    粉丝
  • 0

    好友
  • 0

    获赞
  • 0

    评论
  • 1068

    访问数
关闭

站长推荐 上一条 /1 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-3-29 14:17 , Processed in 0.014930 second(s), 7 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部