OpenCores
URL https://opencores.org/ocsvn/qaz_libs/qaz_libs/trunk

Subversion Repositories qaz_libs

[/] [qaz_libs/] [trunk/] [BFM/] [src/] [video_frame/] [video_frame_pkg.sv] - Diff between revs 45 and 47

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 45 Rev 47
Line 24... Line 24...
//// from http://www.opencores.org/lgpl.shtml                     ////
//// from http://www.opencores.org/lgpl.shtml                     ////
////                                                              ////
////                                                              ////
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
 
 
package video_frame_pkg;
package video_frame_pkg;
 
 
import logger_pkg::*;
import logger_pkg::*;
 
 
 
  // --------------------------------------------------------------------
typedef struct
typedef struct
{
{
  int pixel[];
  int pixel[];
} line_s;
} line_s;
 
 
 
  // --------------------------------------------------------------------
typedef struct
typedef struct
{
{
  int x;
  int x;
  int y;
  int y;
} frame_coordinate_t;
} frame_coordinate_t;
 
 
 
  // --------------------------------------------------------------------
typedef int flattened_frame_t[];
typedef int flattened_frame_t[];
typedef int unsigned video_array_t[][];
typedef int unsigned video_array_t[][];
 
 
// --------------------------------------------------------------------
// --------------------------------------------------------------------
class video_frame_class;
  `include "video_frame_config.svh"
  logger_class log;
  `include "video_frame_class.svh"
  rand int  frame_id;
 
  rand int  pixels_per_line;
 
  rand int  lines_per_frame;
 
  rand int  bits_per_pixel;
 
  int bytes_per_pixel;
 
  rand int  pixels_per_clk;
 
  line_s    lines[];
 
  string    name = "";
 
  string    pattern = "";
 
 
 
  constraint default_pixels_per_line
 
  {
 
    pixels_per_line >= 4;
 
    pixels_per_line % 2 == 0;
 
    pixels_per_line <= 16384;
 
  }
 
 
 
  constraint default_lines_per_frame
 
  {
 
    lines_per_frame >= 4;
 
    lines_per_frame % 2 == 0;
 
    lines_per_frame <= 16384;
 
  }
 
 
 
  constraint default_bits_per_pixel
 
  {
 
    bits_per_pixel >= 1 && bits_per_pixel <= 32;
 
  }
 
 
 
  //--------------------------------------------------------------------
 
  function new;
 
    this.log = new;
 
    this.frame_id = 0;
 
  endfunction: new
 
 
 
  // --------------------------------------------------------------------
 
  function void init
 
  (
 
    int pixels_per_line,
 
    int lines_per_frame,
 
    int bits_per_pixel,
 
    int pixels_per_clk = 1,
 
    string name = ""
 
 );
 
    log.info($sformatf("%m"));
 
    this.pixels_per_line  = pixels_per_line;
 
    this.lines_per_frame  = lines_per_frame;
 
    this.bits_per_pixel   = bits_per_pixel;
 
    this.pixels_per_clk   = pixels_per_clk;
 
    this.name             = name;
 
    this.bytes_per_pixel  = (bits_per_pixel % 8 == 0)
 
                          ? (bits_per_pixel / 8)
 
                          : (bits_per_pixel / 8) + 1;
 
 
 
    this.make_constant(0);
 
  endfunction: init
 
 
 
  // --------------------------------------------------------------------
 
  task write_pixel(frame_coordinate_t coordinate, int pixel);
 
    this.lines[coordinate.y].pixel[coordinate.x] = pixel;
 
  endtask: write_pixel
 
 
 
  // --------------------------------------------------------------------
 
  function int read_pixel(frame_coordinate_t coordinate);
 
    read_pixel = this.lines[coordinate.y].pixel[coordinate.x];
 
  endfunction: read_pixel
 
 
 
  // --------------------------------------------------------------------
 
  function flattened_frame_t flatten_frame();
 
    int i = 0;
 
    log.info($sformatf("%m"));
 
    flatten_frame = new[lines_per_frame*pixels_per_line];
 
 
 
    foreach(this.lines[l])
 
      foreach(this.lines[l].pixel[p])
 
      begin
 
        flatten_frame[i] = this.lines[l].pixel[p];
 
        i++;
 
      end
 
  endfunction: flatten_frame
 
 
 
  // --------------------------------------------------------------------
 
  function void make_constant(int pixel);
 
    log.info($sformatf("%m"));
 
    this.lines = new[lines_per_frame];
 
 
 
    foreach(this.lines[l])
 
    begin
 
      this.lines[l].pixel = new[pixels_per_line];
 
 
 
      foreach(this.lines[l].pixel[p])
 
        this.lines[l].pixel[p] = pixel;
 
    end
 
 
 
    pattern = "constant";
 
  endfunction: make_constant
 
 
 
  // --------------------------------------------------------------------
 
  function void make_counting(int offset = 0);
 
    log.info($sformatf("%m"));
 
    this.lines = new[lines_per_frame];
 
 
 
    foreach(this.lines[l])
 
    begin
 
      this.lines[l].pixel = new[pixels_per_line];
 
 
 
      foreach(this.lines[l].pixel[p])
 
        this.lines[l].pixel[p] = (pixels_per_line * l) + p + offset;
 
    end
 
 
 
    pattern = "counting";
 
  endfunction: make_counting
 
 
 
  // --------------------------------------------------------------------
 
  function void make_horizontal();
 
    log.info($sformatf("%m"));
 
    this.lines = new[lines_per_frame];
 
 
 
    foreach(this.lines[l])
 
    begin
 
      this.lines[l].pixel = new[pixels_per_line];
 
 
 
      foreach(this.lines[l].pixel[p])
 
        this.lines[l].pixel[p] = p;
 
    end
 
 
 
    pattern = "horizontal";
 
  endfunction: make_horizontal
 
 
 
  // --------------------------------------------------------------------
 
  function void make_vertical();
 
    log.info($sformatf("%m"));
 
    this.lines = new[lines_per_frame];
 
 
 
    foreach(this.lines[l])
 
    begin
 
      this.lines[l].pixel = new[pixels_per_line];
 
 
 
      foreach(this.lines[l].pixel[p])
 
        this.lines[l].pixel[p] = l;
 
    end
 
 
 
    pattern = "vertical";
 
  endfunction: make_vertical
 
 
 
  // --------------------------------------------------------------------
 
  function void make_random();
 
    log.info($sformatf("%m"));
 
    this.lines = new[lines_per_frame];
 
 
 
    foreach(this.lines[l])
 
    begin
 
      this.lines[l].pixel = new[pixels_per_line];
 
 
 
      foreach(this.lines[l].pixel[p])
 
        this.lines[l].pixel[p] = $urandom_range(((2 ** bits_per_pixel) - 1), 0);
 
    end
 
 
 
    pattern = "random";
 
  endfunction: make_random
 
 
 
  // --------------------------------------------------------------------
 
  function void copy(video_frame_class from);
 
    log.info($sformatf("%m"));
 
    this.frame_id         = from.frame_id;
 
    this.pixels_per_line  = from.pixels_per_line;
 
    this.lines_per_frame  = from.lines_per_frame;
 
    this.bits_per_pixel   = from.bits_per_pixel;
 
    this.name             = from.name;
 
    this.lines            = new[this.lines_per_frame];
 
 
 
    foreach(this.lines[l])
 
    begin
 
      this.lines[l].pixel = new[this.pixels_per_line];
 
 
 
      foreach(this.lines[l].pixel[p])
 
        this.lines[l].pixel[p] = from.lines[l].pixel[p];
 
    end
 
  endfunction: copy
 
 
 
  // --------------------------------------------------------------------
 
  virtual function video_frame_class clone;
 
    log.info($sformatf("%m"));
 
    clone = new();
 
    clone.copy(this);
 
  endfunction: clone
 
 
 
  // --------------------------------------------------------------------
 
  function video_frame_class catenate_horizontally(video_frame_class tail);
 
    log.info($sformatf("%m"));
 
 
 
    if(this.lines_per_frame != tail.lines_per_frame)
 
      return(null);
 
 
 
    if(this.bits_per_pixel != tail.bits_per_pixel)
 
      return(null);
 
 
 
    catenate_horizontally = new();
 
    catenate_horizontally.pixels_per_line  = this.pixels_per_line + tail.pixels_per_line;
 
    catenate_horizontally.lines_per_frame  = this.lines_per_frame;
 
    catenate_horizontally.bits_per_pixel   = this.bits_per_pixel;
 
    catenate_horizontally.name             = this.name;
 
    catenate_horizontally.lines            = new[catenate_horizontally.lines_per_frame];
 
 
 
    foreach(catenate_horizontally.lines[l])
 
    begin
 
      catenate_horizontally.lines[l].pixel = new[catenate_horizontally.pixels_per_line];
 
 
 
      foreach(this.lines[l].pixel[p])
 
        catenate_horizontally.lines[l].pixel[p] = this.lines[l].pixel[p];
 
 
 
      foreach(tail.lines[l].pixel[p])
 
        catenate_horizontally.lines[l].pixel[p + this.pixels_per_line] = tail.lines[l].pixel[p];
 
    end
 
  endfunction: catenate_horizontally
 
 
 
  // --------------------------------------------------------------------
 
  function void shift_right(ref line_s column);
 
    log.info($sformatf("%m"));
 
 
 
    foreach(this.lines[l])
 
      for(int p = pixels_per_line - 1; p > 0; p--)
 
        this.lines[l].pixel[p] = this.lines[l].pixel[p - 1];
 
 
 
    foreach(this.lines[l])
 
      this.lines[l].pixel[0] = column.pixel[l];
 
  endfunction: shift_right
 
 
 
  // --------------------------------------------------------------------
 
  function int compare_line
 
  ( int line
 
  , int max_mismatches
 
  , video_frame_class to
 
  );
 
    int mismatch_count = 0;
 
 
 
    if(to.bits_per_pixel != this.bits_per_pixel)
 
    begin
 
      log.error($sformatf("to.bits_per_pixel != this.bits_per_pixel | %s", name));
 
      return(-3);
 
    end
 
 
 
      foreach(this.lines[line].pixel[p])
 
        if(to.lines[line].pixel[p] != this.lines[line].pixel[p])
 
        begin
 
 
 
          if(max_mismatches > 0)
 
            mismatch_count++;
 
 
 
            log.error($sformatf("mismatch @ frame[%4h][%4h] | to == %4h | this == %4h  | %s",
 
                      line, p, to.lines[line].pixel[p], this.lines[line].pixel[p], name));
 
 
 
          if(mismatch_count > max_mismatches)
 
            return(mismatch_count);
 
        end
 
 
 
      return(mismatch_count);
 
  endfunction: compare_line
 
 
 
  // --------------------------------------------------------------------
 
  function int compare(int max_mismatches, video_frame_class to);
 
    int mismatch_count = 0;
 
    log.info($sformatf("%m"));
 
 
 
    if(to.pixels_per_line != this.pixels_per_line)
 
    begin
 
      log.error($sformatf("to.pixels_per_line != this.pixels_per_line | %s", name));
 
      return(-1);
 
    end
 
 
 
    if(to.lines_per_frame != this.lines_per_frame)
 
    begin
 
      log.error($sformatf("to.lines_per_frame != this.lines_per_frame | %s", name));
 
      return(-2);
 
    end
 
 
 
    if(to.bits_per_pixel != this.bits_per_pixel)
 
    begin
 
      log.error($sformatf("to.bits_per_pixel != this.bits_per_pixel | %s", name));
 
      return(-3);
 
    end
 
 
 
      foreach(this.lines[l])
 
      begin
 
        foreach(this.lines[l].pixel[p])
 
          if(to.lines[l].pixel[p] != this.lines[l].pixel[p])
 
          begin
 
            if(max_mismatches > 0)
 
              mismatch_count++;
 
 
 
              log.error($sformatf("mismatch @ frame[%4h][%4h] | to == %4h | this == %4h  | %s", l, p, to.lines[l].pixel[p], this.lines[l].pixel[p], name));
 
 
 
            if(mismatch_count > max_mismatches)
 
              return(mismatch_count);
 
          end
 
      end
 
 
 
      return(mismatch_count);
 
  endfunction: compare
 
 
 
  // --------------------------------------------------------------------
 
  function void print_line(int line, int pixel, int count);
 
    log.info($sformatf("%m"));
 
 
 
    for(int i = 0; i < count; i++)
 
      log.display($sformatf("%4h @ frame[%4h][%4h] | %s", this.lines[line].pixel[(pixel + i)], line, (pixel + i), name));
 
  endfunction: print_line
 
 
 
  // --------------------------------------------------------------------
 
  function void print_config();
 
    log.display($sformatf("%m | frame_id         = %06d  | %s", frame_id, name));
 
    log.display($sformatf("%m | pixels_per_line  = %06d  | %s", pixels_per_line, name));
 
    log.display($sformatf("%m | lines_per_frame  = %06d  | %s", lines_per_frame, name));
 
    log.display($sformatf("%m | bits_per_pixel   = %06d  | %s", bits_per_pixel, name));
 
    log.display($sformatf("%m | pixels_per_clk   = %06d  | %s", pixels_per_clk, name));
 
    log.display($sformatf("%m | pattern          = %s    | %s", pattern, name));
 
  endfunction: print_config
 
 
 
  // --------------------------------------------------------------------
 
  function string convert2string();
 
    string s;
 
    string f ="";
 
    foreach(this.lines[l])
 
    begin
 
      s = $sformatf("[%4.d]", l);
 
      foreach(this.lines[l].pixel[p])
 
        s = {s, $sformatf("|%4.h", this.lines[l].pixel[p])};
 
      f = {f, s, "|\n"};
 
    end
 
    return f;
 
  endfunction: convert2string
 
 
 
// --------------------------------------------------------------------
 
endclass: video_frame_class
 
 
 
// --------------------------------------------------------------------
// --------------------------------------------------------------------
endpackage: video_frame_pkg
endpackage: video_frame_pkg

powered by: WebSVN 2.1.0

© copyright 1999-2020 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.