Design a hardware-friendly priority queue using a shift-register based sorted insert.

Module name: prio_q
Parameters:
  - WIDTH = 24       // Data width (Q15.8 fixed-point prices)
  - DEPTH = 8        // Maximum number of entries

Ports:
  - input  clk, rst_n
  - input  [WIDTH-1:0] data_in       // Data to insert
  - input  push                      // Assert to insert data_in
  - input  pop                       // Assert to remove minimum element
  - output [WIDTH-1:0] min_out       // Current minimum (element at position 0)
  - output empty                     // Queue is empty
  - output full                      // Queue is full

Functional specification:
  - Maintains a sorted array of up to DEPTH elements (ascending order)
  - push: new element is inserted into its correct sorted position by shifting
    larger elements up in parallel (one cycle)
  - pop: removes element at position 0 (minimum) and shifts remaining down
  - push and pop should not be asserted simultaneously
  - min_out always reflects position 0 of the sorted array
  - empty is high when count == 0; full is high when count == DEPTH
  - On reset, count goes to 0
