Commit aeb5b749 authored by Andrey Filippov's avatar Andrey Filippov
Browse files

Simulating/debugging raw mode

parent bf8f63c5
Loading
Loading
Loading
Loading
+503 −18

File changed.

Preview size limit exceeded, changes collapsed.

+15 −9
Original line number Diff line number Diff line
@@ -62,6 +62,7 @@ module bit_stuffer_raw_metadata(
    input              abort,       // @ any, extracts 0->1 and flushes (for both modes!)

    // RAW mode ports, all @ xclk
    input              compressed_mode,    // operating in raw mode (uncompressed)
    input              raw_mode,    // operating in raw mode (uncompressed)
    input              raw_be16,    // swap byte pairs to outut 16-bit big endian data
    input        [7:0] raw_bytes,   // raw bypass byte data in little endian order 
@@ -123,12 +124,14 @@ module bit_stuffer_raw_metadata(
    wire          meta_last = (imgsz4[2:0] == 7) &&    meta_out;
    // re-clock enable to this clock
    
    wire          ts_rstb= raw_mode ?  raw_ts_copy: (last_block && !last_block_d);  // enough time to have timestamp data; // one cycle before getting timestamp data from FIFO
//    wire          ts_rstb= raw_mode ?  raw_ts_copy: (last_block && !last_block_d);  // enough time to have timestamp data; // one cycle before getting timestamp data from FIFO
    wire          ts_rstb= (raw_mode && raw_ts_copy) || ( compressed_mode && last_block && !last_block_d);  // enough time to have timestamp data; // one cycle before getting timestamp data from FIFO
    wire    [7:0] ts_dout; // timestamp data, byte at a time
    wire          write_size = (in_stb && (bytes_in != 0)) || (flush && last_stb_4); // TODO: never in raw mode?
    wire          stb_start = raw_mode?  raw_start: (!color_first && color_first_r) ;
    wire          stb =  in_stb & !trailer && !force_flush;
    wire          stb1 = raw_stb & !trailer && !force_flush;
    wire          write_size = (in_stb && (bytes_in != 0)) || (flush && last_stb_4) || raw_flush; // TODO: never in raw mode?
//    wire          stb_start = raw_mode?  raw_start: (!color_first && color_first_r) ;
    wire          stb_start = (raw_mode && raw_start) ||  (compressed_mode && !color_first && color_first_r) ;
    wire          stb =  compressed_mode && in_stb && !trailer && !force_flush;
    wire          stb1 = raw_mode && raw_stb && !trailer && !force_flush;
    
    always @ (posedge xclk) begin
        if (xrst ||trailer_done) imgsz4 <= 0;
@@ -149,7 +152,8 @@ module bit_stuffer_raw_metadata(
        if ((!ts_in[3] && (ts_in[1:0] == 3)) || write_size) time_ram3[ts_in[3:2]] <= ts_in[3]? (8'hff):ts_dout;
        
        if      (xrst)                                                                 trailer <= 0;
        else if (force_flush || (raw_mode ? raw_flush : flush)) trailer <= 1;
//        else if (force_flush || (raw_mode ? raw_flush : flush)) trailer <= 1;
        else if (force_flush || (raw_mode && raw_flush) || (compressed_mode && flush)) trailer <= 1;
        else if (trailer_done)                                                         trailer <= 0;

        if      (xrst)                                       meta_out <= 0;
@@ -167,7 +171,9 @@ module bit_stuffer_raw_metadata(
        data_out_valid <= stb1 || stb || trailer;
        
        
        if      (xrst || trailer) running <= 0;
///        if      (xrst || trailer) running <= 0; // FIXME: Was this for quite a while? Was in intentional?
        if      (xrst || trailer_done) running <= 0;
        
        else if (stb_start)       running <= 1; // for raw need color_first trailing edge
        
        done <= trailer_done;
+14 −3
Original line number Diff line number Diff line
@@ -189,6 +189,7 @@ module cmprs_cmd_decode#(
                                  //  outputs sync @ posedge mclk:
    output                        cmprs_en_mclk,      // @mclk 0 resets immediately
    input                         cmprs_en_extend,    // @mclk keep compressor enabled for graceful shutdown
    input                         compressor_running,  // @xclk - reading frame or running stuffer/trailer
    
    output reg                    cmprs_run_mclk,     // @mclk enable propagation of vsync_late to frame_start_dst in bonded(sync to src) mode
    output reg                    cmprs_standalone,   // @mclk single-cycle: generate a single frame_start_dst in unbonded (not synchronized) mode.
@@ -221,7 +222,8 @@ module cmprs_cmd_decode#(
    output reg [CMPRS_CSAT_CR_BITS-1:0] color_sat_cr,    // scale for Cr color component (color saturation)
    
    output reg [CMPRS_CORING_BITS-1:0]  coring,           // scale for Cb color component (color saturation)
    output reg                    uncompressed,
    output reg                    compressed,      // late on, early off running compressor chain
    output reg                    uncompressed,    // late on, early off running raw chain
    output reg                    be16
    );

@@ -261,9 +263,11 @@ module cmprs_cmd_decode#(
    reg   [ 2:0] coring_xclk; // color saturation values (only 10 LSB in each 12 are used
    
    wire         uncompressed_mclk;
    wire         uncompressed_xclk;
    
    assign cmprs_en_mclk = cmprs_en_mclk_r;
    assign uncompressed_mclk = cmprs_mode_mclk[3:0] == CMPRS_CBIT_CMODE_RAW;
    assign uncompressed_xclk = cmprs_mode_xclk[3:0] == CMPRS_CBIT_CMODE_RAW;
    
    always @ (posedge mclk) begin
        if (mrst) ctrl_we_r <= 0;
@@ -478,10 +482,17 @@ module cmprs_cmd_decode#(
                converter_type[2:0] <= 'bx;
              end
       endcase
       uncompressed <= cmprs_mode_xclk[3:0] == CMPRS_CBIT_CMODE_RAW;
    
//       uncompressed <= cmprs_mode_xclk[3:0] == CMPRS_CBIT_CMODE_RAW;
    end
    always @ (posedge xclk) begin
        if (!cmprs_en_mclk_r || (!uncompressed_xclk && !compressor_running)) uncompressed <= 0;
        else if (frame_start_xclk)                                           uncompressed <= uncompressed_xclk;

        if (!cmprs_en_mclk_r || ( uncompressed_xclk && !compressor_running)) compressed <= 0;
        else if (frame_start_xclk)                                           compressed <= !uncompressed_xclk;
    end
    
    
//frame_start_xclk
    pulse_cross_clock ctrl_we_xclk_i       (.rst(mrst), .src_clk(mclk), .dst_clk(xclk), .in_pulse(ctrl_we_r),      .out_pulse(ctrl_we_xclk),.busy());
    pulse_cross_clock format_we_xclk_i     (.rst(mrst), .src_clk(mclk), .dst_clk(xclk), .in_pulse(format_we_r),    .out_pulse(format_we_xclk),.busy());
+33 −12
Original line number Diff line number Diff line
@@ -96,7 +96,7 @@ module cmprs_raw_buf_iface #(
    reg    [14:0] quads_left;  // number of quad bytes left in a row (after this)    
    reg    [16:0] rows_left;   // number of rows left (after this)
    reg     [1:0] rows_last;
    reg           page_run;
    reg           page_run; // on after page_start, off after quad_r[2], so during last quad_r[3] shold be off
    reg     [3:0] quad_r;
    reg           quad_last;   // last quad byte in a row should be valid @quad_r[2]
    wire          page_start;
@@ -106,6 +106,9 @@ module cmprs_raw_buf_iface #(
    wire          frame_finish_w;
    wire          frames_pending;
    reg           starting; // from frame_start_r to first page start
    reg           mode_valid;//  after parameters are valid, invalid whe mode is reset
    reg           page_end_r;
    reg           frame_done;
    
    assign frame_en_w = frame_en && frame_go; // both are inputs
    // one extra at the end of frame is needed (sequence will be short)  ???
@@ -116,21 +119,25 @@ module cmprs_raw_buf_iface #(
    assign buf_diff = needed_page - next_valid;
    assign buf_ready_w = buf_diff[2];

    assign page_start = !page_run && buf_ready_w && frame_pre_run && (starting && stuffer_running);  // frame_pre_run should deassert  in time with frame end
//    assign page_start = !page_run && buf_ready_w && ((frame_pre_run && starting && stuffer_running) || !frame_done);  // frame_pre_run should deassert  in time with frame end
    assign page_start = !page_run && buf_ready_w && frame_pre_run && ((starting && stuffer_running) || !frame_done);  // frame_pre_run should deassert  in time with frame end
   
    reg page_end_r;
//    reg page_restart_r;
     
    assign raw_start = frame_pre_start_r; // for JP - leading edge of color_first
    assign page_end_w = frame_en && quad_r[2] && (&bufa_r[9:2] || quad_last);
//  assign page_end_w = frame_en && quad_r[2] && (&bufa_r[9:2] || quad_last);
    assign page_end_w = frame_en && quad_r[1] && (&bufa_r[9:2] || quad_last);
    
    assign release_buf = page_end_w;
//    assign release_buf = page_end_w;
    assign release_buf = page_end_r;
    
    assign frame_finish_w = frame_finish_r[1] && !frame_finish_r[0];
    assign frames_pending = !frame_que_cntr[FRAME_QUEUE_WIDTH] && (|frame_que_cntr[FRAME_QUEUE_WIDTH-1:0]);
    
    assign frame_en_w = frame_en && frame_go;
    
    assign raw_prefb = buf_rd_r[0]; // delay if memory registered more. TODO Add parameter if it already used    
//    assign raw_prefb = buf_rd_r[0]; // delay if memory registered more. TODO Add parameter if it already used    
    assign raw_prefb = quad_r[1]; // delay if memory registered more. TODO Add parameter if it already used    
    
    assign raw_ts_copy = frame_en_r && rows_last[0] && !rows_last[1];

@@ -147,6 +154,13 @@ module cmprs_raw_buf_iface #(
        if   (reset_page_rd) next_valid <= 0;
        else if (page_ready) next_valid <=  next_valid + 1;
    
        if      (!frame_en)         mode_valid <= 0;
//        else if (frame_start_xclk) mode_valid <= frame_start_xclk;
        else if (frame_pre_start_r) mode_valid <= 1; // frame_pre_start_r sets remaining quads, rows
        
   
    
    
        cmprs_run_xclk <=     cmprs_run_mclk;
            
        frame_pre_start_r <= frame_pre_start_w; // same time as mb_pre_start
@@ -175,7 +189,8 @@ module cmprs_raw_buf_iface #(
        // page_run
        if      (!frame_pre_run)          page_run <= 0;
        else if (page_start)              page_run <= 1;
        else if (quad_r[2] && page_end_r) page_run <= 0;        
//        else if (quad_r[2] && page_end_r) page_run <= 0;        
        else if (page_end_r)              page_run <= 0;        
        
        if      (!frame_pre_run)          quad_r <=    0;
        else                              quad_r <= {quad_r[2:0], page_start | (quad_r[3] & page_run)}; 
@@ -189,17 +204,20 @@ module cmprs_raw_buf_iface #(
        if      (frame_pre_start_r || (quad_r[2] && quad_last)) quads_left <= {n_blocks_in_row_m1, 2'b11};
        else if (quad_r[2])                                     quads_left <= quads_left - 1;
        
        quad_last <= !(|quads_left); // valid from 2 after frame_pre_start_r or after quad_r[3]
        quad_last <= mode_valid && !(|quads_left); // valid from 2 after frame_pre_start_r or after quad_r[3]

        if      (frame_pre_start_r)                             rows_left <=  {n_block_rows_m1, 4'b1111};
        else if ((quad_r[2] && quad_last))                      rows_left <=  rows_left - 1;
        
        rows_last <= {rows_last[0], ~(|rows_left)};
        rows_last <= {rows_last[0], mode_valid & ~(|rows_left)};
        
        if (frame_pre_start_r) bufa_r[11:10] <= needed_page[1:0];
//        if (frame_pre_start_r) bufa_r[11:10] <= needed_page[1:0];
        if (page_start) bufa_r[11:10] <= needed_page[1:0];
        
        if (frame_pre_start_r) bufa_r[9:1] <= 0;
        else if (quad_r[3])    bufa_r[9:1] <= bufa_r[9:1] + 1;
        
//        if (frame_pre_start_r)           bufa_r[9:1] <= 0;
        if      (page_start)             bufa_r[9:1] <= 0;
        else if (quad_r[1] | quad_r[3])  bufa_r[9:1] <= bufa_r[9:1] + 1;
        
        if (frame_pre_start_r) bufa_r[0] <=  raw_be16;
        else if (buf_rd_r[0])  bufa_r[0] <= ~bufa_r[0];
@@ -207,6 +225,9 @@ module cmprs_raw_buf_iface #(
        if      (!frame_en || (!frames_pending && frame_finish_w)) frame_pre_run <= 0;
        else if (frame_pre_start_w)                                frame_pre_run <= 1;
        
        if      (!frame_en || frame_pre_start_r)      frame_done <= 0;
        else if (quad_r[2] && quad_last && rows_last) frame_done <= 1; // valid @ quad_r[3], when page_run is already == 0 
        
    end
    
    reg nmrst;
+2 −0
Original line number Diff line number Diff line
@@ -70,6 +70,7 @@ module huffman_stuffer_raw_meta(
    input              color_first, // @fradv_clk only used for timestamp 

    // RAW mode ports, all @ xclk
    input              compressed_mode,    // operating in raw mode (uncompressed)
    input              raw_mode,    // operating in raw mode (uncompressed)
    input              raw_be16,    // swap byte pairs to outut 16-bit big endian data
    input        [7:0] raw_bytes,   // raw bypass byte data in little endian order 
@@ -180,6 +181,7 @@ module huffman_stuffer_raw_meta(
        .in_stb         (escape_dv),          // input
        .flush          (escape_flush_out),   // input
        .abort          (abort_stuffer),      // input
        .compressed_mode(compressed_mode),    // input
        .raw_mode       (raw_mode),           // input
        .raw_be16       (raw_be16),           // input
        .raw_bytes      (raw_bytes),          // input[7:0] 
Loading