123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208 |
- `default_nettype none
- module pgen #(
- parameter integer N_ROWS = 64,
- parameter integer N_COLS = 64,
- parameter integer BITDEPTH = 24,
-
- parameter integer LOG_N_ROWS = $clog2(N_ROWS),
- parameter integer LOG_N_COLS = $clog2(N_COLS)
- )(
-
- output wire [LOG_N_ROWS-1:0] fbw_row_addr,
- output wire fbw_row_store,
- input wire fbw_row_rdy,
- output wire fbw_row_swap,
- output wire [BITDEPTH-1:0] fbw_data,
- output wire [LOG_N_COLS-1:0] fbw_col_addr,
- output wire fbw_wren,
- output wire frame_swap,
- input wire frame_rdy,
-
- input wire clk,
- input wire rst
- );
-
-
-
- localparam
- ST_WAIT_FRAME = 0,
- ST_GEN_ROW = 1,
- ST_WRITE_ROW = 2,
- ST_WAIT_ROW = 3;
- reg [2:0] fsm_state;
- reg [2:0] fsm_state_next;
-
- reg [11:0] frame;
- reg [LOG_N_ROWS-1:0] cnt_row;
- reg [LOG_N_COLS-1:0] cnt_col;
- reg cnt_row_last;
- reg cnt_col_last;
-
- wire [7:0] color [0:2];
-
-
-
- always @(posedge clk or posedge rst)
- if (rst)
- fsm_state <= ST_WAIT_FRAME;
- else
- fsm_state <= fsm_state_next;
-
- always @(*)
- begin
-
- fsm_state_next = fsm_state;
-
- case (fsm_state)
- ST_WAIT_FRAME:
- if (frame_rdy)
- fsm_state_next = ST_GEN_ROW;
- ST_GEN_ROW:
- if (cnt_col_last)
- fsm_state_next = ST_WRITE_ROW;
- ST_WRITE_ROW:
- if (fbw_row_rdy)
- fsm_state_next = cnt_row_last ? ST_WAIT_ROW : ST_GEN_ROW;
- ST_WAIT_ROW:
- if (fbw_row_rdy)
- fsm_state_next = ST_WAIT_FRAME;
- endcase
- end
-
-
-
- always @(posedge clk or posedge rst)
- if (rst)
- frame <= 0;
- else if ((fsm_state == ST_WAIT_ROW) && fbw_row_rdy)
- frame <= frame + 1;
-
- always @(posedge clk)
- if (fsm_state == ST_WAIT_FRAME) begin
- cnt_row <= 0;
- cnt_row_last <= 1'b0;
- end else if ((fsm_state == ST_WRITE_ROW) && fbw_row_rdy) begin
- cnt_row <= cnt_row + 1;
- cnt_row_last <= cnt_row == ((1 << LOG_N_ROWS) - 2);
- end
-
- always @(posedge clk)
- if (fsm_state != ST_GEN_ROW) begin
- cnt_col <= 0;
- cnt_col_last <= 0;
- end else begin
- cnt_col <= cnt_col + 1;
- cnt_col_last <= cnt_col == (N_COLS - 2);
- end
-
-
-
-
- genvar i;
- generate
- for (i=0; i<8; i=i+1)
- begin
- assign color[0][7-i] = cnt_row[LOG_N_ROWS-1-(i%LOG_N_ROWS)];
- assign color[2][7-i] = cnt_col[LOG_N_COLS-1-(i%LOG_N_COLS)];
- end
- endgenerate
-
- wire [3:0] c0 = frame[7:4];
- wire [3:0] c1 = frame[7:4] + 1;
- wire [3:0] a0 = 4'hf - frame[3:0];
- wire [3:0] a1 = frame[3:0];
- assign color[1] =
- (((cnt_col[3:0] == c0) || (cnt_row[3:0] == c0)) ? {a0, a0} : 8'h00) +
- (((cnt_col[3:0] == c1) || (cnt_row[3:0] == c1)) ? {a1, a1} : 8'h00);
-
- assign fbw_wren = fsm_state == ST_GEN_ROW;
- assign fbw_col_addr = cnt_col;
-
- generate
- if (BITDEPTH == 8)
- assign fbw_data = { color[2][7:5], color[1][7:5], color[0][7:6] };
- else if (BITDEPTH == 16)
- assign fbw_data = { color[2][7:3], color[1][7:2], color[0][7:3] };
- else if (BITDEPTH == 24)
- assign fbw_data = { color[2], color[1], color[0] };
- endgenerate
-
-
- assign fbw_row_addr = cnt_row;
- assign fbw_row_store = (fsm_state == ST_WRITE_ROW) && fbw_row_rdy;
- assign fbw_row_swap = (fsm_state == ST_WRITE_ROW) && fbw_row_rdy;
-
-
- assign frame_swap = (fsm_state == ST_WAIT_ROW) && fbw_row_rdy;
- endmodule
|