脉动阵列算法

 

 

附上代码:

 PE:

module PE_module(CLK,RSTn,W,XIN,PEIN,XOUT,PEOUT);

parameter DATAWIDTN = 8;
input                                     CLK;
input                                   RSTn;    
input    [ DATAWIDTN - 1 : 0 ]               XIN;
input    [ DATAWIDTN - 1 : 0 ]            W;
input   [ DATAWIDTN * 2 - 1 : 0 ]          PEIN;
output   [ DATAWIDTN - 1 : 0 ]               XOUT;                                     
output   [ DATAWIDTN * 2 - 1 : 0 ]          PEOUT;
reg      [ DATAWIDTN - 1 : 0 ]               XOUT;                                     
reg      [ DATAWIDTN * 2 - 1 : 0 ]          PEOUT;

always @ ( posedge CLK or negedge RSTn )
begin
    if (!RSTn)
    begin
        XOUT <= 0;
        PEOUT <= 0;        
    end
    else 
    begin
        XOUT  <= XIN;
        PEOUT <= PEIN+XIN*W;
    end
end

endmodule

Systolic_Array:

module Systolic_Array(CLK,RSTn,W00,W01,W02,W03,W10,W11,W12,W13,W20,W21,W22,W23,W30,W31,W32,W33,XIN0,XIN1,XIN2,XIN3,PE03_OUT,PE13_OUT,PE23_OUT,PE33_OUT);
    parameter DATAWIDTN = 8;
    input                            CLK,RSTn;
    input    [ DATAWIDTN - 1 : 0 ]       XIN0,XIN1,XIN2,XIN3;
    output   [ DATAWIDTN * 2 - 1 : 0 ] PE03_OUT,PE13_OUT,PE23_OUT,PE33_OUT;
    input    [ DATAWIDTN - 1 : 0 ]   W00,W01,W02,W03,W10,W11,W12,W13,W20,W21,W22,W23,W30,W31,W32,W33;
                                     
    wire     [ DATAWIDTN - 1 : 0 ]      XOUT00_10,XOUT10_20,XOUT20_30,XOUT30_OUT,
                                     XOUT01_11,XOUT11_21,XOUT21_31,XOUT31_OUT,
                                       XOUT02_12,XOUT12_22,XOUT22_32,XOUT32_OUT,
                                     XOUT03_13,XOUT13_23,XOUT23_33,XOUT33_OUT;                                     
    wire     [ DATAWIDTN * 2 - 1 : 0 ]      PE00_01,PE01_02,PE02_03,PE03_OUT,
                                         PE10_11,PE11_12,PE12_13,PE13_OUT,
                                         PE20_21,PE21_22,PE22_23,PE23_OUT,
                                         PE30_31,PE31_32,PE32_33,PE33_OUT;

PE_module PE00(.CLK(CLK),.RSTn(RSTn),.W(W00),.XIN(XIN0),     .PEIN(0),        .XOUT(XOUT00_10), .PEOUT(PE00_01));
PE_module PE10(.CLK(CLK),.RSTn(RSTn),.W(W10),.XIN(XOUT00_10),.PEIN(0),        .XOUT(XOUT10_20), .PEOUT(PE10_11));
PE_module PE20(.CLK(CLK),.RSTn(RSTn),.W(W20),.XIN(XOUT10_20),.PEIN(0),        .XOUT(XOUT20_30), .PEOUT(PE20_21));
PE_module PE30(.CLK(CLK),.RSTn(RSTn),.W(W30),.XIN(XOUT20_30),.PEIN(0),        .XOUT(XOUT30_OUT),.PEOUT(PE30_31));

PE_module PE01(.CLK(CLK),.RSTn(RSTn),.W(W01),.XIN(XIN1),     .PEIN(PE00_01),.XOUT(XOUT01_11), .PEOUT(PE01_02));
PE_module PE11(.CLK(CLK),.RSTn(RSTn),.W(W11),.XIN(XOUT01_11),.PEIN(PE10_11),.XOUT(XOUT11_21), .PEOUT(PE11_12));
PE_module PE21(.CLK(CLK),.RSTn(RSTn),.W(W21),.XIN(XOUT11_21),.PEIN(PE20_21),.XOUT(XOUT21_31), .PEOUT(PE21_22));
PE_module PE31(.CLK(CLK),.RSTn(RSTn),.W(W31),.XIN(XOUT21_31),.PEIN(PE30_31),.XOUT(XOUT31_OUT),.PEOUT(PE31_32));

PE_module PE02(.CLK(CLK),.RSTn(RSTn),.W(W02),.XIN(XIN2),     .PEIN(PE01_02),.XOUT(XOUT02_12), .PEOUT(PE02_03));
PE_module PE12(.CLK(CLK),.RSTn(RSTn),.W(W12),.XIN(XOUT02_12),.PEIN(PE11_12),.XOUT(XOUT12_22), .PEOUT(PE12_13));
PE_module PE22(.CLK(CLK),.RSTn(RSTn),.W(W22),.XIN(XOUT12_22),.PEIN(PE21_22),.XOUT(XOUT22_32), .PEOUT(PE22_23));
PE_module PE32(.CLK(CLK),.RSTn(RSTn),.W(W32),.XIN(XOUT22_32),.PEIN(PE31_32),.XOUT(XOUT32_OUT),.PEOUT(PE32_33));

PE_module PE03(.CLK(CLK),.RSTn(RSTn),.W(W03),.XIN(XIN3),     .PEIN(PE02_03),.XOUT(XOUT03_13), .PEOUT(PE03_OUT));
PE_module PE13(.CLK(CLK),.RSTn(RSTn),.W(W13),.XIN(XOUT03_13),.PEIN(PE12_13),.XOUT(XOUT13_23), .PEOUT(PE13_OUT));
PE_module PE23(.CLK(CLK),.RSTn(RSTn),.W(W23),.XIN(XOUT13_23),.PEIN(PE22_23),.XOUT(XOUT23_33), .PEOUT(PE23_OUT));
PE_module PE33(.CLK(CLK),.RSTn(RSTn),.W(W33),.XIN(XOUT23_33),.PEIN(PE32_33),.XOUT(XOUT33_OUT),.PEOUT(PE33_OUT));
endmodule

Systolic_Array_tb:

`timescale 1ns / 1ps
module Systolic_Array_tb();

parameter DATAWIDTN = 8;
reg                                     CLK,RSTn;
reg      [ DATAWIDTN - 1 : 0 ]        XIN0,XIN1,XIN2,XIN3;
reg      [ DATAWIDTN - 1 : 0 ]        W00,W01,W02,W03,
                                     W10,W11,W12,W13,
                                     W20,W21,W22,W23,
                                     W30,W31,W32,W33;                                     
wire     [ DATAWIDTN - 1 : 0 ]           XOUT00_10,XOUT10_20,XOUT20_30,XOUT30_OUT,
                                     XOUT01_11,XOUT11_21,XOUT21_31,XOUT31_OUT,
                                     XOUT02_12,XOUT12_22,XOUT22_32,XOUT32_OUT,
                                     XOUT03_13,XOUT13_23,XOUT23_33,XOUT33_OUT;                                     
wire     [ DATAWIDTN * 2 - 1 : 0 ]      PE00_01,PE01_02,PE02_03,PE03_OUT,
                                     PE10_11,PE11_12,PE12_13,PE13_OUT,
                                     PE20_21,PE21_22,PE22_23,PE23_OUT,
                                     PE30_31,PE31_32,PE32_33,PE33_OUT;

Systolic_Array tb_Systolic_Array(CLK,RSTn,W00,W01,W02,W03,W10,W11,W12,W13,W20,W21,W22,W23,W30,W31,W32,W33,XIN0,XIN1,XIN2,XIN3,PE03_OUT,PE13_OUT,PE23_OUT,PE33_OUT);

initial CLK = 0;
always  #5 CLK = ~ CLK;

initial     
begin
    CLK  =1'b1;
    RSTn =1'b1;
    
    XIN0 = 101;
    XIN1 = 0;
    XIN2 = 0;
    XIN3 = 0;
    W00     = 1;
    W01     = 2;
    W02     = 3;
    W03     = 4;
    W10     = 5;
    W11     = 6;
    W12     = 7;
    W13     = 8;
    W20     = 9;
    W21     = 10;
    W22     = 11;
    W23     = 12;
    W30     = 13;
    W31     = 14;
    W32     = 15;
    W33     = 16;    
    #10     
    XIN0 = 102;
    XIN1 = 113;
    XIN2 = 0;
    XIN3 = 0;
    #10     
    XIN0 = 103;
    XIN1 = 114;
    XIN2 = 125;
    XIN3 = 0;
    #10     
    XIN0 = 104;
    XIN1 = 115;
    XIN2 = 126;
    XIN3 = 137;
    #10     
    XIN0 = 105;
    XIN1 = 116;
    XIN2 = 127;
    XIN3 = 138;
    #10     
    XIN0 = 106;
    XIN1 = 117;
    XIN2 = 128;
    XIN3 = 139;
    #10     
    XIN0 = 107;
    XIN1 = 118;
    XIN2 = 129;
    XIN3 = 140;
    #10     
    XIN0 = 108;
    XIN1 = 119;
    XIN2 = 130;
    XIN3 = 141;
    #10     
    XIN0 = 109;
    XIN1 = 120;
    XIN2 = 131;
    XIN3 = 142;
    #10     
    XIN0 = 110;
    XIN1 = 121;
    XIN2 = 132;
    XIN3 = 143;
    #10     
    XIN0 = 111;
    XIN1 = 122;
    XIN2 = 133;
    XIN3 = 144;
    #10     
    XIN0 = 112;
    XIN1 = 123;
    XIN2 = 134;
    XIN3 = 145;
    #10     
    XIN0 = 0;
    XIN1 = 124;
    XIN2 = 135;
    XIN3 = 146;
    #10     
    XIN0 = 0;
    XIN1 = 0;
    XIN2 = 136;
    XIN3 = 147;
    #10     
    XIN0 = 0;
    XIN1 = 0;
    XIN2 = 0;
    XIN3 = 148;
    #10     
    XIN0 = 0;
    XIN1 = 0;
    XIN2 = 0;
    XIN3 = 0;
end
endmodule

上面代码格式调整不了,例化程序那里往前靠靠。

  • 8
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

欺负老鼠的狗~~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值