The following code is to
get the transpose of a matrix. I have taken a simple 2x2 matrix. The logic in
finding the transpose is similar to the logic in C. The code is written using
procedural statements. The $display functions are used for the output display. The
testbench for the program is also provided after the code.
Code:
module mat_add(
input clk,
input [7:0] in_1,
input [7:0] in_2,
input [7:0] in_3,
input [7:0] in_4,
output
[31:0] given_in,
output
[31:0] trans_out
);
wire [7:0] temp [1:0][1:0];
wire [7:0] trans_temp [1:0][1:0];
genvar ROW,COLUMN;
assign temp[0][0] = in_1;
assign temp[0][1] = in_2;
assign temp[1][0] = in_3;
assign temp[1][1] = in_4;
for
(COLUMN=0;COLUMN<2;COLUMN=COLUMN+1) begin
for (ROW=0;ROW<2;ROW=ROW+1)
begin
assign trans_temp[COLUMN][ROW] =
temp[ROW][COLUMN];
end
end
initial
begin
#100$display("the original
matrix");
#100$display("%b\t
%b",temp[0][0],temp[0][1]);
#100$display("%b\t
%b",temp[1][0],temp[1][1]);
#100$display("the transposed
matrix");
#100$display("%b\t
%b",trans_temp[0][0],trans_temp[0][1]);
#100$display("%b\t
%b",trans_temp[1][0],trans_temp[1][1]);
end
assign given_in =
{{temp[1][1]},{temp[1][0]},{temp[0][1]},{temp[0][0]}};
assign trans_out =
{trans_temp[0][0],trans_temp[0][1],trans_temp[1][0],trans_temp[1][1]};
endmodule
Testbench:
module matrix_transpose_test;
//
Inputs
reg
clk;
reg
[7:0] in_1;
reg
[7:0] in_2;
reg
[7:0] in_3;
reg
[7:0] in_4;
//
Outputs
wire
[31:0] given_in;
wire
[31:0] trans_out;
//
Instantiate the Unit Under Test (UUT)
mat_add
uut (
.clk(clk),
.in_1(in_1),
.in_2(in_2),
.in_3(in_3),
.in_4(in_4),
.given_in(given_in),
.trans_out(trans_out)
);
initial
begin
//
Initialize Inputs
clk
= 0;
in_1
= 0;
in_2
= 0;
in_3
= 0;
in_4
= 0;
//
Wait 100 ns for global reset to finish
#100;
clk
= 1;
in_1
= 8'd12;
in_2
= 8'd23;
in_3
= 8'd45;
in_4
= 8'd32;
//
Add stimulus here
end
endmodule
Output:
the original matrix
00001100 00010111
00101101 00100000
the transposed matrix
00001100 00101101
00010111 00100000