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

Subversion Repositories wf3d

[/] [wf3d/] [trunk/] [implement/] [rtl/] [fm_hvc/] [fm_afifo.v] - Diff between revs 2 and 4

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

Rev 2 Rev 4
Line 7... Line 7...
//
//
// Abstract:
// Abstract:
//   Asynchronus FIFO
//   Asynchronus FIFO
//
//
// Author:
// Author:
//   Kenji Ishimaru (kenji.ishimaru@prtissimo.com)
//   Kenji Ishimaru (info.wf3d@gmail.com)
//
//
//======================================================================
//======================================================================
//
//
// Copyright (c) 2015, Kenji Ishimaru
// Copyright (c) 2015, Kenji Ishimaru
// All rights reserved.
// All rights reserved.
Line 54... Line 54...
);
);
 
 
// set default parameters
// set default parameters
parameter P_RANGE = 7;
parameter P_RANGE = 7;
parameter P_DEPTH = 1 << P_RANGE;  // 128
parameter P_DEPTH = 1 << P_RANGE;  // 128
 
`ifdef PP_BUSWIDTH_64
 
localparam P_IB_DATA_WIDTH = 'd64;
 
`else
 
localparam P_IB_DATA_WIDTH = 'd32;
 
`endif
////////////////////////////
////////////////////////////
// I/O definition
// I/O definition
////////////////////////////
////////////////////////////
input         clk_core;       // system clock
input         clk_core;       // system clock
input         clk_vi;
input         clk_vi;
input         rst_x;          // system reset
input         rst_x;          // system reset
input  [1:0]  i_color_mode;
input  [1:0]  i_color_mode;
input         i_wstrobe;      // write strobe
input         i_wstrobe;      // write strobe
input  [31:0] i_dt;           // write data
input  [P_IB_DATA_WIDTH-1:0]
 
              i_dt;           // write data
output        o_full;         // write data full
output        o_full;         // write data full
input         i_renable;      // read enable
input         i_renable;      // read enable
output [15:0] o_dt;           // read data
output [15:0] o_dt;           // read data
output        o_empty;        // read data empty
output        o_empty;        // read data empty
output [P_RANGE:0] o_dnum;     // written data number
output [P_RANGE:0] o_dnum;     // written data number
Line 75... Line 81...
//  Register definition
//  Register definition
/////////////////////////
/////////////////////////
reg [P_RANGE-1:0] r_write_counter;
reg [P_RANGE-1:0] r_write_counter;
reg [P_RANGE-1:0] r_read_counter;
reg [P_RANGE-1:0] r_read_counter;
// data registers
// data registers
 
`ifdef PP_BUSWIDTH_64
 
reg [3:0]         r_select_hw;
 
`else
reg [2:0]         r_select_hw;
reg [2:0]         r_select_hw;
 
`endif
/////////////////////////
/////////////////////////
//  wire definition
//  wire definition
/////////////////////////
/////////////////////////
wire             o_full;
wire             o_full;
wire             o_empty;
wire             o_empty;
wire [15:0]      o_dt;
wire [15:0]      o_dt;
wire             w_we;
wire             w_we;
wire             w_re;
wire             w_re;
wire [31:0]      w_dt32;
wire [P_IB_DATA_WIDTH-1:0]
 
                 w_dt;
wire [P_RANGE-1:0] w_read_counter_inc;
wire [P_RANGE-1:0] w_read_counter_inc;
wire [P_RANGE-1:0] w_read_counter;
wire [P_RANGE-1:0] w_read_counter;
wire [15:0] w_dt16;
wire [15:0] w_dt16;
wire [7:0] w_dt8;
wire [7:0] w_dt8;
wire [3:0] w_dt4;
wire [3:0] w_dt4;
// /////////////////////////
// /////////////////////////
//  assign statement
//  assign statement
/////////////////////////
/////////////////////////
assign w_dt16 = (r_select_hw[0]) ? w_dt32[31:16] : w_dt32[15:0];
`ifdef PP_BUSWIDTH_64
assign w_dt8 = (r_select_hw[1:0] == 'd3) ? w_dt32[31:24] :
assign w_dt16 = (r_select_hw[1:0] == 'd3) ? w_dt[63:48] :
               (r_select_hw[1:0] == 'd2) ? w_dt32[23:16] :
                (r_select_hw[1:0] == 'd2) ? w_dt[47:32] :
               (r_select_hw[1:0] == 'd1) ? w_dt32[15:8] :
                (r_select_hw[1:0] == 'd1) ? w_dt[31:16] :
                                           w_dt32[7:0];
                                            w_dt[15:0];
 
 
assign w_dt4 = (r_select_hw[2:0] == 'd7) ? w_dt32[31:28] :
assign w_dt8 = (r_select_hw[2:0] == 'd7) ? w_dt[63:56] :
               (r_select_hw[2:0] == 'd6) ? w_dt32[27:24] :
               (r_select_hw[2:0] == 'd6) ? w_dt[55:48] :
               (r_select_hw[2:0] == 'd5) ? w_dt32[23:20] :
               (r_select_hw[2:0] == 'd5) ? w_dt[47:40] :
               (r_select_hw[2:0] == 'd4) ? w_dt32[19:16] :
               (r_select_hw[2:0] == 'd4) ? w_dt[39:32] :
               (r_select_hw[2:0] == 'd3) ? w_dt32[15:12] :
               (r_select_hw[2:0] == 'd3) ? w_dt[31:24] :
               (r_select_hw[2:0] == 'd2) ? w_dt32[11:8] :
               (r_select_hw[2:0] == 'd2) ? w_dt[23:16] :
               (r_select_hw[2:0] == 'd1) ? w_dt32[7:4] :
               (r_select_hw[2:0] == 'd1) ? w_dt[15:8] :
                                           w_dt32[3:0];
                                           w_dt[7:0];
 
 
 
assign w_dt4 = (r_select_hw[3:0] == 'd15) ? w_dt[63:60] :
 
               (r_select_hw[3:0] == 'd14) ? w_dt[59:56] :
 
               (r_select_hw[3:0] == 'd13) ? w_dt[55:52] :
 
               (r_select_hw[3:0] == 'd12) ? w_dt[51:48] :
 
               (r_select_hw[3:0] == 'd11) ? w_dt[47:44] :
 
               (r_select_hw[3:0] == 'd10) ? w_dt[43:40] :
 
               (r_select_hw[3:0] == 'd9) ? w_dt[39:36] :
 
               (r_select_hw[3:0] == 'd8) ? w_dt[35:32] :
 
               (r_select_hw[3:0] == 'd7) ? w_dt[31:28] :
 
               (r_select_hw[3:0] == 'd6) ? w_dt[27:24] :
 
               (r_select_hw[3:0] == 'd5) ? w_dt[23:20] :
 
               (r_select_hw[3:0] == 'd4) ? w_dt[19:16] :
 
               (r_select_hw[3:0] == 'd3) ? w_dt[15:12] :
 
               (r_select_hw[3:0] == 'd2) ? w_dt[11:8] :
 
               (r_select_hw[3:0] == 'd1) ? w_dt[7:4] :
 
                                           w_dt[3:0];
 
 
 
assign w_re = i_renable & ((i_color_mode == 'd3) ? (r_select_hw[3:0] == 'd15) :
 
                           (i_color_mode == 'd2) ? (r_select_hw[2:0] == 'd7) :
 
                                                   (r_select_hw[1:0] == 'd3)
 
                           );
 
`else
 
assign w_dt16 = (r_select_hw[0]) ? w_dt[31:16] : w_dt[15:0];
 
assign w_dt8 = (r_select_hw[1:0] == 'd3) ? w_dt[31:24] :
 
               (r_select_hw[1:0] == 'd2) ? w_dt[23:16] :
 
               (r_select_hw[1:0] == 'd1) ? w_dt[15:8] :
 
                                           w_dt[7:0];
 
 
 
assign w_dt4 = (r_select_hw[2:0] == 'd7) ? w_dt[31:28] :
 
               (r_select_hw[2:0] == 'd6) ? w_dt[27:24] :
 
               (r_select_hw[2:0] == 'd5) ? w_dt[23:20] :
 
               (r_select_hw[2:0] == 'd4) ? w_dt[19:16] :
 
               (r_select_hw[2:0] == 'd3) ? w_dt[15:12] :
 
               (r_select_hw[2:0] == 'd2) ? w_dt[11:8] :
 
               (r_select_hw[2:0] == 'd1) ? w_dt[7:4] :
 
                                           w_dt[3:0];
 
 
 
assign w_re = i_renable & ((i_color_mode == 'd3) ? (r_select_hw == 'd7) :
 
                           (i_color_mode == 'd2) ? (r_select_hw[1:0] == 'd3) :
 
                                                   (r_select_hw[0] == 'd1)
 
                           );
 
`endif
assign o_dt = (i_color_mode == 'd3) ? {12'd0,w_dt4} :
assign o_dt = (i_color_mode == 'd3) ? {12'd0,w_dt4} :
              (i_color_mode == 'd2) ? {8'd0,w_dt8} :
              (i_color_mode == 'd2) ? {8'd0,w_dt8} :
                                      w_dt16 ;
                                      w_dt16 ;
assign o_dnum = 0;
assign o_dnum = 0;
assign o_full = 1'b0;
assign o_full = 1'b0;
assign o_empty = 1'b0;
assign o_empty = 1'b0;
assign w_we = i_wstrobe;
assign w_we = i_wstrobe;
assign w_re = i_renable & ((i_color_mode == 'd3) ? (r_select_hw == 'd7) :
 
                           (i_color_mode == 'd2) ? (r_select_hw[1:0] == 'd3) :
 
                                                   (r_select_hw[0] == 'd1)
 
                           );
 
assign w_read_counter_inc = r_read_counter + 1'b1;
assign w_read_counter_inc = r_read_counter + 1'b1;
assign w_read_counter = (w_re) ? w_read_counter_inc : r_read_counter;
assign w_read_counter = (w_re) ? w_read_counter_inc : r_read_counter;
 
 
////////////////////////
////////////////////////
// always 
// always 
Line 150... Line 199...
  end
  end
 
 
  // select half word
  // select half word
  always @(posedge clk_vi or negedge rst_x) begin
  always @(posedge clk_vi or negedge rst_x) begin
    if (~rst_x) begin
    if (~rst_x) begin
      r_select_hw <= 3'b0;
      r_select_hw <= 'd0;
    end else begin
    end else begin
        if (i_renable) r_select_hw <= r_select_hw + 1'b1;
        if (i_renable) r_select_hw <= r_select_hw + 1'b1;
    end
    end
  end
  end
 
 
///////////////////
///////////////////
// module instance
// module instance
///////////////////
///////////////////
 
`ifdef PP_BUSWIDTH_64
 
    fm_cmn_ram #(.P_RAM_TYPE("TYPE_A"),.P_WIDTH(64),.P_RANGE( P_RANGE)) ram_00 (
 
`else
    fm_cmn_ram #(.P_RAM_TYPE("TYPE_A"),.P_WIDTH(32),.P_RANGE( P_RANGE)) ram_00 (
    fm_cmn_ram #(.P_RAM_TYPE("TYPE_A"),.P_WIDTH(32),.P_RANGE( P_RANGE)) ram_00 (
 
`endif
        .clka(clk_core),
        .clka(clk_core),
        .clkb(clk_vi),
        .clkb(clk_vi),
        .wea(w_we),
        .wea(w_we),
        .addra(r_write_counter),
        .addra(r_write_counter),
        .addrb(w_read_counter),
        .addrb(w_read_counter),
        .dia(i_dt),
        .dia(i_dt),
        .doa(),
        .doa(),
        .dob(w_dt32)
        .dob(w_dt)
    );
    );
 
 
endmodule
endmodule
 
 
 
 

powered by: WebSVN 2.1.0

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