Advertisement
Guest User

Untitled

a guest
Jun 16th, 2019
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. `define GET_N   3'b000//0
  2. `define GET_R   3'b001//1
  3. `define READ_A  3'b010//2
  4. `define READ_X  3'b011//3
  5. `define READ_B  3'b100//4
  6. `define WRITE_Y 3'b101//5
  7. module DFF (clk, next_out, out);
  8.   parameter n = 1;
  9.   input clk;
  10.   input [n-1:0] next_out;
  11.   output reg [n-1:0] out;
  12.   always@(posedge clk) begin
  13.       out <= next_out;
  14.   end
  15. endmodule
  16.  
  17.  
  18. module MO(clk, reset, in_data, i, j, opcode, out_data, fin);
  19.     input clk, reset;
  20.     input [9:0] in_data;
  21.     output fin;
  22.     output [2:0] opcode;
  23.     output [9:0] i, j;
  24.     output [19:0] out_data;
  25.     wire [9:0] true_n;
  26.     wire [9:0] next_n;
  27.     reg  [9:0] n;
  28.     wire [9:0] next_r;
  29.     wire [9:0] true_r;
  30.     reg  [9:0] r;
  31.     reg  [9:0] temp_r;
  32.     reg  [9:0] matA;
  33.     reg  [9:0] matA_n;
  34.     wire [9:0] A_rnext;
  35.     wire [9:0] A_r;
  36.     wire [9:0] A_n;
  37.     wire [9:0] A_nnext;
  38.     reg  [9:0] matA_r;
  39.     reg  [9:0] matX;
  40.     reg  [9:0] matX_n;
  41.     reg  [9:0] matX_r;
  42.     wire [9:0] X_r;
  43.     wire [9:0] X_rnext;
  44.     wire [9:0] X_n;
  45.     wire [9:0] X_nnext;
  46.     reg  [9:0] matB;
  47.     wire [2:0] next_opcode;
  48.     reg  [2:0] next_opcode1;
  49.     reg  [2:0] temp_op;
  50.     reg  [9:0] next_i;
  51.     reg  [9:0] temp_i;
  52.     wire [9:0] ti_next;
  53.     wire [9:0] ti;
  54.     reg  [9:0] next_j;
  55.     reg  [9:0] temp_j;
  56.     wire [9:0] tj;
  57.     wire [9:0] tj_next;
  58.     wire [19:0] next_out;
  59.     reg  [19:0] next_out1;
  60.     reg  [9:0] ttt1;
  61.     reg  [9:0] ttt2;
  62.     reg  [9:0] size;
  63.     reg  next_fin;
  64.     DFF #(3)  DFF1(clk, next_opcode, opcode);
  65.     DFF #(10) DFF2(clk,A_rnext,A_r);
  66.     DFF #(10) DFF3(clk,X_rnext,X_r);
  67.     DFF #(20) DFF4(clk, next_out, out_data);
  68.     DFF #(10) DFF5(clk,A_nnext,A_n);
  69.     DFF #(10) DFF6(clk,X_nnext,X_n);
  70.     DFF #(10) DFF7(clk,ti_next,ti);
  71.     DFF #(10) DFF8(clk,tj_next,tj);
  72.     DFF #(10) DFF9(clk,next_n,true_n);
  73.     DFF #(10) DFF0(clk,next_r,true_r);
  74.     always@(*) begin
  75.         next_opcode1 = opcode;
  76.         next_out1=out_data;
  77.         matA_r = A_r;
  78.         matA_n = A_n;
  79.         matX_r = X_r;
  80.         matX_n = X_n;
  81.         temp_i = ti;
  82.         temp_j = tj;
  83.         n = true_n;
  84.         r = true_r;
  85.         case(opcode)
  86.             `GET_N: begin//0
  87.                 next_opcode1 = `GET_R;
  88.                 n = in_data;
  89.                 matA_n = n;
  90.                 matX_n = n;
  91.                 next_fin = 1'b0;
  92.                 temp_i=10'd0;
  93.                 temp_j=10'd0;
  94.             end
  95.            
  96.             `GET_R:begin//1
  97.                 next_opcode1 = `READ_A;
  98.                 r=in_data;
  99.                 temp_r = r;
  100.                 matA_r = r;
  101.                 matX_r = r;
  102.                 next_fin = 1'b0;
  103.             end
  104.            
  105.             `READ_A:begin
  106.                 next_opcode1 = `READ_X;
  107.                 ttt1 = n - matA_n;
  108.                 ttt2 = r - matA_r;
  109.                 next_i = ttt1;
  110.                 next_j = ttt2;
  111.                 matA_r = matA_r - 1;
  112.                 matA = in_data;
  113.                 next_fin = 1'b0;
  114.             end
  115.            
  116.             `READ_X:begin
  117.                     if(matX_r > 0) begin
  118.                         ttt1 = r - matX_r;
  119.                         ttt2 = n - matX_n;
  120.                         next_i = ttt1;
  121.                         next_j = ttt2;
  122.                         matX = in_data;
  123.                         next_out1 = next_out1 + matA * matX;
  124.                         matX_r = matX_r - 1;
  125.                         if(matX_r == 0)begin
  126.                             next_opcode1 = `READ_B;
  127.                             temp_op = `READ_B;
  128.                             matX_r = r;
  129.                             matA_r = r;
  130.                             matX_n = matX_n - 1;
  131.                             matA_n = (matX_n == 0)? matA_n - 1 : matA_n;
  132.                             matX_n = (matX_n == 0)? n : matX_n;
  133.                         end
  134.                         else begin
  135.                             next_opcode1 = `READ_A;
  136.                             temp_op = `READ_A;
  137.                         end
  138.                     end
  139.                     else begin end
  140.                 next_fin = 1'b0;
  141.             end
  142.            
  143.             `READ_B:begin
  144.                 ttt1 = temp_i;
  145.                 ttt2 = temp_j;
  146.                 next_i = ttt1;
  147.                 next_j = ttt2;
  148.                 matB = in_data;
  149.                 next_out1 = next_out1 + matB;
  150.                 next_opcode1 = `WRITE_Y;
  151.                 next_fin = 1'b0;
  152.             end
  153.            
  154.             `WRITE_Y:begin
  155.                     ttt1 = temp_i;
  156.                     ttt2 = temp_j;
  157.                     next_i = ttt1;
  158.                     next_j = ttt2;
  159.                     next_out1 = 10'd0;
  160.                     next_fin = (next_i==n)? 1'b1:1'b0;
  161.                     next_opcode1 = (next_i==n)? 10'd0:`READ_A;     
  162.                     temp_i = (temp_j == n - 10'd1)? temp_i + 1 : temp_i;
  163.                     temp_j = (temp_j == n - 10'd1)? 10'd0 : temp_j + 1;
  164.             end
  165.             default begin end
  166.         endcase  
  167.     end
  168.     assign next_n = (reset == 0)? 10'd0 : n;
  169.     assign next_r = (reset == 0)? 10'd0 : r;
  170.     assign ti_next = (reset == 0)? 10'd0 : temp_i;
  171.     assign tj_next = (reset == 0)? 10'd0 : temp_j;
  172.     assign A_nnext = (reset == 0)? 10'd0 : matA_n;
  173.     assign X_nnext = (reset == 0)? 10'd0 : matX_n;
  174.     assign A_rnext = (reset == 0)? 10'd0 : matA_r;
  175.     assign X_rnext = (reset == 0)? 10'd0 : matX_r;
  176.     assign next_opcode = (reset==0)? `GET_N: next_opcode1;
  177.     assign i = (reset==0)? 10'd0: next_i;
  178.     assign j = (reset==0)? 10'd0: next_j;
  179.     assign next_out = (reset==0)? 10'd0: next_out1;
  180.     assign fin = (reset==0)? 10'd0: next_fin;
  181. endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement