Advertisement
Taha_404

Untitled

May 7th, 2022
633
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. `timescale 1ns / 1ps
  2. //////////////////////////////////////////////////////////////////////////////////
  3. // Company:
  4. // Engineer:
  5. //
  6. // Create Date: 05/06/2022 07:53:46 PM
  7. // Design Name:
  8. // Module Name: cfo_memory
  9. // Project Name:
  10. // Target Devices:
  11. // Tool Versions:
  12. // Description:
  13. //
  14. // Dependencies:
  15. //
  16. // Revision:
  17. // Revision 0.01 - File Created
  18. // Additional Comments:
  19. //
  20. //////////////////////////////////////////////////////////////////////////////////
  21.  
  22.  
  23. module cfo_memory #(parameter DATA_WIDTH = 16)
  24.     (
  25.         input  i_clk,
  26.         input  i_EN,
  27.         input  i_rstn,
  28.         input  [DATA_WIDTH-1:0] i_I,
  29.         input  [DATA_WIDTH-1:0] i_Q,
  30.         output reg [DATA_WIDTH-1:0] o_I,
  31.         output reg [DATA_WIDTH-1:0] o_Q,
  32.         output reg o_valid
  33.     );
  34. reg [DATA_WIDTH-1:0] r_I [DATA_WIDTH-1:0];
  35. reg [DATA_WIDTH-1:0] r_Q [DATA_WIDTH-1:0];
  36. reg [3:0] r_inputAddress;
  37. reg [3:0] r_outputAddress;
  38. reg [3:0] r_delayedAddress;
  39. reg [5:0] r_validCounter;
  40. reg [5:0] r_validEst;
  41. reg [1:0] r_flag;
  42. reg [1:0] r_flagEst;
  43.  
  44. always@(posedge i_clk, negedge i_rstn)
  45.     begin
  46.         if(~i_rstn)
  47.             begin
  48.                 r_inputAddress <= 4'd0;
  49.                 r_delayedAddress <= 4'd0;
  50.                 r_validCounter <= 6'd0;
  51.                 r_flag <= 2'b00;
  52.             end
  53.         else if(i_EN)
  54.             begin
  55.                 r_inputAddress <= r_inputAddress+1;
  56.                 r_I[r_inputAddress] <= i_I;
  57.                 r_Q[r_inputAddress] <= i_Q;
  58.                 r_delayedAddress <= r_inputAddress;
  59.                 r_validCounter <= r_validEst;
  60.                 r_flag <= r_flagEst;
  61.             end
  62.     end
  63.    
  64. always@(*)
  65.     begin
  66.         if(r_validCounter == 37)
  67.             begin
  68.                 r_validEst = 6'd0;
  69.             end
  70.         else if(r_flag[0] == 1'd1)
  71.             begin
  72.                 r_validEst = r_validCounter + 1;
  73.             end
  74.         else
  75.             begin
  76.                 r_validEst = r_validCounter;
  77.             end
  78.     end
  79.    
  80. always@(*)
  81.     begin
  82.         if(r_validCounter == 37)
  83.             begin
  84.                  r_flagEst = 2'b00;
  85.             end
  86.         else
  87.             begin
  88.                 r_flagEst = r_flag;
  89.             end
  90.         if(r_delayedAddress == 4'd12)
  91.             begin
  92.                 r_flagEst = 2'b01;
  93.             end
  94.         else
  95.             begin
  96.                 if(r_flag[0] == 1'b1)
  97.                     begin
  98.                         r_flagEst = 2'b11;
  99.                     end
  100.                 else
  101.                     begin
  102.                         r_flagEst = 2'b00;
  103.                     end
  104.             end
  105.     end  
  106.    
  107. always@(posedge i_clk, negedge i_rstn)
  108.     begin
  109.         if(~i_rstn)
  110.             begin
  111.                 r_outputAddress <= 4'b0000;
  112.             end
  113.          
  114.         else if(~i_EN && r_delayedAddress == 15)
  115.             begin
  116.                 r_outputAddress <= r_outputAddress+1;
  117.                 o_I <= r_I[r_outputAddress];
  118.                 o_Q <= r_Q[r_outputAddress];
  119.             end
  120.     end
  121.        
  122.  always@(posedge i_clk, negedge i_rstn)
  123.     begin
  124.         if(~i_rstn)
  125.             begin
  126.                 o_valid <= 1'b0;
  127.             end
  128.         else if(r_flag[0] == 1'b1 && r_validCounter == 6'd1)
  129.             begin
  130.                 o_valid <= 1'b1;
  131.             end
  132.         else
  133.             begin
  134.                 o_valid <= 1'b0;
  135.             end
  136.            
  137.    end
  138. endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement