Advertisement
Guest User

Untitled

a guest
Dec 27th, 2022
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. module stack
  2. #(
  3.         parameter WIDTH_BW=32,
  4.         parameter DEPTH_BW=8
  5. )
  6. (
  7.         input  wire clk,
  8.         input  wire rst_n,
  9.  
  10.         input  wire                push,
  11.         input  wire [WIDTH_BW-1:0] push_data,
  12.  
  13.         input  wire                pop,
  14.         output wire [WIDTH_BW-1:0] pop_data
  15. );
  16.        
  17.         reg [DEPTH_BW-1:0] mem_ptr;
  18.         reg [DEPTH_BW-1:0] rd_addr;
  19.  
  20.         reg [WIDTH_BW-1:0] tos;
  21.  
  22.         wire [WIDTH_BW-1:0] mem_read_data;
  23.  
  24.        
  25.  
  26.         // mem ptr
  27.         always @(posedge clk)
  28.         if( !rst_n )
  29.                 mem_ptr <= 'd0;
  30.         else case( {push,pop} )
  31.                 2'b01: mem_ptr <= mem_ptr - 'd1;
  32.                 2'b10: mem_ptr <= mem_ptr + 'd1;
  33.         endcase
  34.  
  35.  
  36.         // rd_addr
  37.         always @*
  38.         case( {push,pop} )
  39.                 2'b01:   rd_addr = mem_ptr - 'd2;
  40.                 2'b10:   rd_addr = mem_ptr;
  41.                 default: rd_addr = mem_ptr - 'd1;
  42.         endcase
  43.  
  44.  
  45.         // tos
  46.         always @(posedge clk)
  47.         case( {push,pop} )
  48.                 2'b01: tos <= mem_read_data;
  49.  
  50.                 2'b10,
  51.                 2'b11: tos <= push_data;
  52.         endcase
  53.  
  54.         // pop_data
  55.         assign pop_data = tos;
  56.  
  57.         // memory
  58.         mem #( .WIDTH_BW(WIDTH_BW),
  59.                .DEPTH_BW(DEPTH_BW),
  60.                .SAMEADDR_BYPASS(1),
  61.                .SAMEADDR_BREAK(0)
  62.         ) memblk
  63.         (
  64.                 .clk(clk),
  65.  
  66.                 .r_addr(rd_addr),
  67.                 .r_data(mem_read_data),
  68.  
  69.                 .w_addr(mem_ptr),
  70.                 .w_ena(push && !pop),
  71.                 .w_data(tos)
  72.         );
  73.  
  74.  
  75. endmodule
  76.  
  77.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement