Advertisement
nelson33

Untitled

Jun 20th, 2023
143
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 2.90 KB | Source Code | 0 0
  1. `timescale 1ns/1ps
  2.  
  3. module decide_max (result, valid, state, maximum, o_maximum);
  4.     input [7:0] result;
  5.     input valid;
  6.     input [1:0] state;
  7.     input [7:0] maximum;
  8.     output [7:0] o_maximum;
  9.     reg [7:0] o_maximum;
  10.  
  11.     always @(*) begin
  12.         if (state != 0) begin
  13.             if (valid && (result > maximum)) begin
  14.                 o_maximum = result;
  15.             end
  16.             else o_maximum = maximum;    
  17.         end
  18.         else if (state == 0) begin
  19.             o_maximum = 8'b00000000;
  20.        end
  21.    end
  22. endmodule
  23.  
  24. module FSM (start, one_left, clk, rst_n, valid, state, o_finish);
  25.    input start,one_left,valid,clk,rst_n;
  26.    output [1:0] state;
  27.    output o_finish;
  28.    reg [1:0]state = 0;
  29.    reg o_finish = 0;
  30.    reg delay;
  31.  
  32.    always @(posedge clk) begin
  33.        if (state == 0) begin
  34.            o_finish = 0;
  35.            if (start)
  36.                state = 1;
  37.        end
  38.        if (state == 1 && !one_left) begin
  39.            o_finish = 0;
  40.        end
  41.        else if (state == 1 && one_left) begin
  42.            state = 2;
  43.            o_finish = 0;
  44.        end
  45.        else if (delay) begin
  46.            delay = 0;
  47.            state = 0;
  48.        end
  49.        else if (state == 2 && !valid) begin
  50.            o_finish = 0;
  51.        end
  52.        else if (state == 2 && valid) begin
  53.            delay = 1;
  54.            o_finish = 1;
  55.        end
  56.    end
  57. endmodule
  58.  
  59. module Output_FFs (o_finish, clk, rst_n, o_maximum, maximum, finish);
  60.    input [7:0] o_maximum;
  61.    input o_finish;
  62.    input clk;
  63.    input rst_n;
  64.    output [7:0] maximum;
  65.    output finish;
  66.    reg [7:0] maximum;
  67.    reg finish;
  68.  
  69.  
  70.    always @( posedge clk ) begin
  71.        if (!rst_n)
  72.            maximum = 8'b00000000;
  73.         else begin
  74.             maximum = o_maximum;
  75.         end
  76.         if (o_finish)
  77.             finish = 1;
  78.         else
  79.             finish = 0;
  80.  
  81.     end
  82.  
  83. endmodule
  84.  
  85. module find_MAX(
  86.     input wire clk,
  87.     input wire rst_n,
  88.     input wire start,
  89.     input wire valid,
  90.     input wire [7:0] Data_A,
  91.     input wire [7:0] Data_B,
  92.     input wire one_left,
  93.     input wire [2:0] instruction,
  94.     output reg [7:0] maximum,
  95.     output reg finish
  96. );
  97.     wire [7:0] result;
  98.  
  99.     // Functional_Unit instantiation
  100.     Functional_Unit fu(
  101.         .instruction(instruction),
  102.         .A(Data_A),
  103.         .B(Data_B),
  104.         .F(result)
  105.  
  106.     );
  107.  
  108.     //TODO: write your design below
  109.     //You cannot modify anything above
  110.  
  111.     wire [1:0] state;
  112.     wire o_finish;
  113.     wire [7:0] Wmaximum;
  114.     wire [7:0] o_maximum;
  115.     wire wfinish;
  116.  
  117.     FSM fsm (start, one_left, clk, rst_n, valid, state, o_finish);
  118.     Output_FFs off (o_finish, clk, rst_n, o_maximum, Wmaximum, wfinish);
  119.     decide_max dmax (result, valid, state, Wmaximum, o_maximum);
  120.     always @(*) begin
  121.         maximum = Wmaximum;
  122.         finish = wfinish;
  123.     end
  124.      
  125. endmodule
  126.  
  127.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement