This repository has been archived on 2021-01-21. You can view files and clone it, but cannot push or open issues or pull requests.
hdmi.old/async_fifo.v
2020-09-19 23:42:44 +02:00

117 lines
2.6 KiB
Verilog

`timescale 1ns / 1ps
/*
This file was generated automatically by Alchitry Labs version 1.2.0.
Do not edit this file directly. Instead edit the original Lucid source.
This is a temporary file and any changes made to it will be destroyed.
*/
/*
Parameters:
SIZE = DATA_IN_SIZE
DEPTH = 16
*/
module async_fifo (
input wclk,
input wrst,
input [29:0] din,
input wput,
output reg full,
input rclk,
input rrst,
output reg [29:0] dout,
input rget,
output reg empty
);
localparam SIZE = 5'h1e;
localparam DEPTH = 5'h10;
localparam ADDR_SIZE = 3'h4;
reg [3:0] M_waddr_d, M_waddr_q = 1'h0;
reg [7:0] M_wsync_d, M_wsync_q = 1'h0;
reg [3:0] M_raddr_d, M_raddr_q = 1'h0;
reg [7:0] M_rsync_d, M_rsync_q = 1'h0;
wire [30-1:0] M_ram_read_data;
reg [1-1:0] M_ram_wclk;
reg [4-1:0] M_ram_waddr;
reg [30-1:0] M_ram_write_data;
reg [1-1:0] M_ram_write_en;
reg [1-1:0] M_ram_rclk;
reg [4-1:0] M_ram_raddr;
simple_dual_ram #(.SIZE(5'h1e), .DEPTH(5'h10)) ram (
.wclk(M_ram_wclk),
.waddr(M_ram_waddr),
.write_data(M_ram_write_data),
.write_en(M_ram_write_en),
.rclk(M_ram_rclk),
.raddr(M_ram_raddr),
.read_data(M_ram_read_data)
);
reg [3:0] waddr_gray;
reg [3:0] wnext_gray;
reg [3:0] raddr_gray;
reg wrdy;
reg rrdy;
always @* begin
M_rsync_d = M_rsync_q;
M_wsync_d = M_wsync_q;
M_waddr_d = M_waddr_q;
M_raddr_d = M_raddr_q;
M_ram_wclk = wclk;
M_ram_rclk = rclk;
M_ram_write_en = 1'h0;
waddr_gray = (M_waddr_q >> 1'h1) ^ M_waddr_q;
wnext_gray = ((M_waddr_q + 1'h1) >> 1'h1) ^ (M_waddr_q + 1'h1);
raddr_gray = (M_raddr_q >> 1'h1) ^ M_raddr_q;
M_rsync_d = {M_rsync_q[0+3-:4], waddr_gray};
M_wsync_d = {M_wsync_q[0+3-:4], raddr_gray};
wrdy = wnext_gray != M_wsync_q[4+3-:4];
rrdy = raddr_gray != M_rsync_q[4+3-:4];
full = !wrdy;
empty = !rrdy;
M_ram_waddr = M_waddr_q;
M_ram_raddr = M_raddr_q;
M_ram_write_data = din;
if (wput && wrdy) begin
M_waddr_d = M_waddr_q + 1'h1;
M_ram_write_en = 1'h1;
end
if (rget && rrdy) begin
M_raddr_d = M_raddr_q + 1'h1;
M_ram_raddr = M_raddr_q + 1'h1;
end
dout = M_ram_read_data;
end
always @(posedge rclk) begin
if (rrst == 1'b1) begin
M_raddr_q <= 1'h0;
M_rsync_q <= 1'h0;
end else begin
M_raddr_q <= M_raddr_d;
M_rsync_q <= M_rsync_d;
end
end
always @(posedge wclk) begin
if (wrst == 1'b1) begin
M_waddr_q <= 1'h0;
M_wsync_q <= 1'h0;
end else begin
M_waddr_q <= M_waddr_d;
M_wsync_q <= M_wsync_d;
end
end
endmodule