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

Subversion Repositories pci

[/] [pci/] [tags/] [rel_8/] [apps/] [crt/] [rtl/] [verilog/] [ssvga_fifo.v] - Diff between revs 2 and 21

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

Rev 2 Rev 21
Line 43... Line 43...
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
//
//
// CVS Revision History
// CVS Revision History
//
//
// $Log: not supported by cvs2svn $
// $Log: not supported by cvs2svn $
 
// Revision 1.1.1.1  2001/10/02 15:33:33  mihad
 
// New project directory structure
 
//
//
//
 
 
// synopsys translate_off
// synopsys translate_off
`include "timescale.v"
`include "timescale.v"
// synopsys translate_on
// synopsys translate_on
 
 
module ssvga_fifo(
module ssvga_fifo(
        clk, crt_clk, rst, dat_i, wr_en, rd_en,
        clk, rst, dat_i, wr_en, rd_en,
        dat_o, full, empty, ssvga_en
        dat_o, full, empty, ssvga_en
);
);
 
 
//
//
// I/O ports
// I/O ports
//
//
input                   clk;            // Clock
input                   clk;            // Clock
input           crt_clk;    // Clock for monitor
 
input                   rst;            // Reset
input                   rst;            // Reset
input   [31:0]   dat_i;          // Input data
input   [31:0]   dat_i;          // Input data
input                   wr_en;          // Write enable
input                   wr_en;          // Write enable
input                   rd_en;          // Read enable
input                   rd_en;          // Read enable
output  [7:0]    dat_o;          // Output data
output  [7:0]    dat_o;          // Output data
Line 77... Line 79...
reg     [7:0]            wr_ptr_plus1;   // Write pointer
reg     [7:0]            wr_ptr_plus1;   // Write pointer
reg     [9:0]            rd_ptr;             // Read pointer
reg     [9:0]            rd_ptr;             // Read pointer
reg     [9:0]            rd_ptr_plus1;   // Read pointer plus1
reg     [9:0]            rd_ptr_plus1;   // Read pointer plus1
wire                    rd_en_int;          // FIFO internal read enable
wire                    rd_en_int;          // FIFO internal read enable
 
 
wire [9:0]      gray_rd_ptr;      // gray code of read pointer
 
wire [9:0]      gray_wr_ptr;      // gray code of write pointer
 
wire [7:0]      gray_wr_ptr_plus1;// gray code of write + 1 pointer
 
 
 
reg  [9:0]      gray_read_ptr;    // sinchronized gray read pointer on clk clock
 
wire [9:0]      sync_gray_rd_ptr; // intermediate sinc. of gray read pointer
 
 
 
reg             rd_ssvga_en;    // sinchronized ssvga enable on crt_clk clock
 
wire            sync_ssvga_en;  // intermediate sinc. of ssvga enable signal
 
 
 
//
//
// Write pointer + 1
// Write pointer + 1
//
//
 
 
always @(posedge clk or posedge rst)
always @(posedge clk or posedge rst)
Line 113... Line 105...
                wr_ptr <= #1 wr_ptr_plus1 ;
                wr_ptr <= #1 wr_ptr_plus1 ;
 
 
//
//
// Read pointer
// Read pointer
//
//
always @(posedge crt_clk or posedge rst)
always @(posedge clk or posedge rst)
        if (rst)
        if (rst)
                rd_ptr <= #1 10'b00_0000_0000;
                rd_ptr <= #1 10'b00_0000_0000;
    else if (~rd_ssvga_en)
    else if (~ssvga_en)
        rd_ptr <= #1 10'b00_0000_0000;
        rd_ptr <= #1 10'b00_0000_0000;
        else if (rd_en_int)
        else if (rd_en_int)
                rd_ptr <= #1 rd_ptr_plus1 ;
                rd_ptr <= #1 rd_ptr_plus1 ;
 
 
always @(posedge crt_clk or posedge rst)
always @(posedge clk or posedge rst)
        if (rst)
        if (rst)
                rd_ptr_plus1 <= #1 10'b00_0000_0001;
                rd_ptr_plus1 <= #1 10'b00_0000_0001;
    else if (~rd_ssvga_en)
    else if (~ssvga_en)
        rd_ptr_plus1 <= #1 10'b00_0000_0001;
        rd_ptr_plus1 <= #1 10'b00_0000_0001;
        else if (rd_en_int)
        else if (rd_en_int)
                rd_ptr_plus1 <= #1 rd_ptr_plus1 + 1 ;
                rd_ptr_plus1 <= #1 rd_ptr_plus1 + 1 ;
 
 
//
//
// Empty is asserted when both pointers match
// Empty is asserted when both pointers match
//
//
//assign empty = ( rd_ptr == {wr_ptr, 2'b00} ) ;
assign empty = ( rd_ptr == {wr_ptr, 2'b00} ) ;
assign empty = ( gray_wr_ptr == gray_read_ptr ) ;
 
 
 
//
//
// Full is asserted when both pointers match
// Full is asserted when both pointers match
// and wr_ptr did increment in previous clock cycle
// and wr_ptr did increment in previous clock cycle
//
//
//assign full = ( wr_ptr_plus1 == rd_ptr[9:2] ) ;
assign full = ( wr_ptr_plus1 == rd_ptr[9:2] ) ;
assign full = ( gray_wr_ptr_plus1 == gray_read_ptr[9:2] ) ;
 
 
 
wire valid_pix = 1'b1 ;
wire valid_pix = 1'b1 ;
 
 
//
//
// Read enable for FIFO
// Read enable for FIFO
Line 156... Line 146...
wire [7:0] dat_o_low ;
wire [7:0] dat_o_low ;
wire [7:0] dat_o_high ;
wire [7:0] dat_o_high ;
 
 
assign dat_o = rd_ptr[1] ? dat_o_high : dat_o_low ;
assign dat_o = rd_ptr[1] ? dat_o_high : dat_o_low ;
 
 
//#############################################################################
 
// binary to gray converters for counter of different clock domain comparison
 
assign gray_rd_ptr          = (rd_ptr >> 1)          ^ rd_ptr ;
 
assign gray_wr_ptr          = ({1'b0, wr_ptr, 1'b0}) ^ ({wr_ptr, 2'b00}) ;
 
assign gray_wr_ptr_plus1    = (wr_ptr_plus1 >> 1)    ^ wr_ptr_plus1 ;
 
 
 
//#############################################################################
 
// interemediate stage to clk synchronization flip - flops - this ones are prone to metastability
 
synchronizer_flop   #(10) read_ptr_sync
 
(
 
    .data_in        (gray_rd_ptr),
 
    .clk_out        (clk),
 
    .sync_data_out  (sync_gray_rd_ptr),
 
    .async_reset    (rst)
 
) ;
 
always@(posedge clk or posedge rst)
 
begin
 
    if (rst)
 
        gray_read_ptr <= #1 10'b0 ;
 
    else
 
        gray_read_ptr <= #1 sync_gray_rd_ptr ;
 
end
 
 
 
//##############################################################################
 
// interemediate stage ssvga_en synchronization flip - flop - this one is prone to metastability
 
synchronizer_flop   ssvga_enable_sync
 
(
 
    .data_in        (ssvga_en),
 
    .clk_out        (crt_clk),
 
    .sync_data_out  (sync_ssvga_en),
 
    .async_reset    (rst)
 
) ;
 
// crt side ssvga enable flip flop - gets a value from intermediate stage sync flip flop
 
always@(posedge crt_clk or posedge rst)
 
begin
 
    if (rst)
 
        rd_ssvga_en <= #1 1'b0 ;
 
    else
 
        rd_ssvga_en <= #1 sync_ssvga_en ;
 
end
 
 
 
 
 
RAMB4_S8_S16 ramb4_s8_0(
RAMB4_S8_S16 ramb4_s8_0(
        .CLKA(crt_clk),
        .CLKA(clk),
        .RSTA(rst),
        .RSTA(rst),
        .ADDRA(ram_pix_address),
        .ADDRA(ram_pix_address),
        .DIA(8'h00),
        .DIA(8'h00),
        .ENA(1'b1),
        .ENA(1'b1),
        .WEA(1'b0),
        .WEA(1'b0),
Line 217... Line 165...
        .WEB(wr_en),
        .WEB(wr_en),
        .DOB()
        .DOB()
);
);
 
 
RAMB4_S8_S16 ramb4_s8_1(
RAMB4_S8_S16 ramb4_s8_1(
        .CLKA(crt_clk),
        .CLKA(clk),
        .RSTA(rst),
        .RSTA(rst),
        .ADDRA(ram_pix_address),
        .ADDRA(ram_pix_address),
        .DIA(8'h00),
        .DIA(8'h00),
        .ENA(1'b1),
        .ENA(1'b1),
        .WEA(1'b0),
        .WEA(1'b0),

powered by: WebSVN 2.1.0

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