矩阵转置verilog实现

用 HDL 语言按照节省芯片面积的方式实现交织器,假定输入的数据 datain 顺序为 1、2、 3、…63,输入使能为 datain_ena,经交织器后输出的顺序要求为 1、10、19、28、37、 46、55、2、11、…

    即行列交织,按行的顺序进按列的顺序出,输入输出数据均按时钟沿变化。实现时可自己 定义 ram 使用。
1  2  3  4  5  6  7  8   9

10 11 12 13 14 15 16 17 18

19 20 21 22 23 24 25 26 27

28 29 30 31 32 33 34 35 36

37 38 39 40 41 42 43 44 45

46 47 48 49 50 51 52 53 54

55 56 57 58 59 60 61 62 63

代码

module matrix_trans(
    input               clk         ,
    input               rstn        ,
    input       [5:0]   datain      ,
    input               datain_ena  ,

    output      [5:0]   dataout     ,
    output  reg         dataout_ena
);

reg [5:0] ram [62:0];  //63 numbers
reg [5:0] addr_wr,addr_rd;

// write data
always @(posedge clk)begin
    if(!rstn)begin
        addr_wr <= 6'd0;
    end
    else if(datain_ena && addr_wr < 62)begin
        addr_wr <= addr_wr + 1'b1;
    end
    else if(datain_ena && addr_wr ==62)begin
        addr_wr <= 6'd1;
    end
end

always @(posedge clk)begin
    if(datain_ena)begin
        ram[addr_wr] <= datain;
    end
end

// read data
always @(posedge clk)begin
    if(!rstn)begin
        dataout_ena <= 1'b0;
    end
    else if(addr_rd == 6'd62)begin
        dataout_ena <= 1'b0;
    end
    else if(addr_wr == 6'd62 && datain_ena == 1'b1)begin
        dataout_ena <= 1'b1;
    end
end

always @(posedge clk)begin
    if(!rstn)begin
        addr_rd     <= 6'd0;
    end
    else if(dataout_ena==1'b1 && addr_rd < 62)begin
        addr_rd     <= addr_rd + 1'b1;
    end
    else if(dataout_ena==1'b1 && addr_rd == 62)begin
        addr_rd     <= 6'd0;
    end
end
// 9*7
// 0=0,1=9,2=18,3=27,4=36,5=45,6=54, 7=1
assign dataout = ram[((addr_rd)%7)*9+addr_rd/7];

endmodule 

testbensh

module matrix_trans_tb();
reg clk,rstn;
reg [5:0] datain;
reg datain_ena;

wire [5:0] dataout;
wire dataout_ena;

always #5 clk = ~clk;

initial begin
    clk <= 1'b0;
    rstn <= 1'b0;
    #20
    rstn <= 1'b1;
    #20
    datain <= 6'd1;
    #20
    datain_ena <= 1'b1;
    repeat(63)begin
        @(posedge clk)begin
            datain <= datain + 1'b1;
        end
    end
    datain_ena <= 1'b0;
    #2000
    $finish();
end

initial begin
    forever begin
        @(posedge clk)begin
            if(dataout_ena == 1'b1)begin
                $display("dataout = %d", dataout);
            end
        end
    end
end

//dump fsdb
initial begin
    $fsdbDumpfile("matrix_trans.fsdb");
    $fsdbDumpvars(0);
end

matrix_trans u_matrix_trans(
    .clk            (clk)           ,
    .rstn           (rstn)          ,

    .datain         (datain)        ,
    .datain_ena     (datain_ena)    ,

    .dataout        (dataout)       ,
    .dataout_ena    (dataout_ena)
);

endmodule 作者:不吃葱的酸菜鱼 https://www.bilibili.com/read/cv20329404/?spm_id_from=333.999.0.0 出处:bilibili

波形

在这里插入图片描述

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值