first commit
This commit is contained in:
commit
25032efc34
|
@ -0,0 +1,12 @@
|
||||||
|
`timescale 1 ns / 1 ps
|
||||||
|
`default_nettype none
|
||||||
|
|
||||||
|
module cfa
|
||||||
|
#(
|
||||||
|
parameter IM_WIDTH = 1936;
|
||||||
|
parameter IM_HEIGHT = 1088;
|
||||||
|
)(
|
||||||
|
|
||||||
|
);
|
||||||
|
|
||||||
|
endmodule
|
|
@ -0,0 +1,9 @@
|
||||||
|
async_fifo.v
|
||||||
|
fifomem.v
|
||||||
|
fifomem_dp.v
|
||||||
|
hdl.list
|
||||||
|
rptr_empty.v
|
||||||
|
sync_ptr.v
|
||||||
|
sync_r2w.v
|
||||||
|
sync_w2r.v
|
||||||
|
wptr_full.v
|
|
@ -0,0 +1,98 @@
|
||||||
|
// distributed under the mit license
|
||||||
|
// https://opensource.org/licenses/mit-license.php
|
||||||
|
|
||||||
|
`timescale 1 ns / 1 ps
|
||||||
|
`default_nettype none
|
||||||
|
|
||||||
|
module async_fifo
|
||||||
|
|
||||||
|
#(
|
||||||
|
parameter DSIZE = 8,
|
||||||
|
parameter ASIZE = 4,
|
||||||
|
parameter FALLTHROUGH = "TRUE" // First word fall-through without latency
|
||||||
|
)(
|
||||||
|
input wire wclk,
|
||||||
|
input wire wrst_n,
|
||||||
|
input wire winc,
|
||||||
|
input wire [DSIZE-1:0] wdata,
|
||||||
|
output wire wfull,
|
||||||
|
output wire awfull,
|
||||||
|
input wire rclk,
|
||||||
|
input wire rrst_n,
|
||||||
|
input wire rinc,
|
||||||
|
output wire [DSIZE-1:0] rdata,
|
||||||
|
output wire rempty,
|
||||||
|
output wire arempty
|
||||||
|
);
|
||||||
|
|
||||||
|
wire [ASIZE-1:0] waddr, raddr;
|
||||||
|
wire [ASIZE :0] wptr, rptr, wq2_rptr, rq2_wptr;
|
||||||
|
|
||||||
|
// The module synchronizing the read point
|
||||||
|
// from read to write domain
|
||||||
|
sync_r2w
|
||||||
|
#(ASIZE)
|
||||||
|
sync_r2w (
|
||||||
|
.wq2_rptr (wq2_rptr),
|
||||||
|
.rptr (rptr),
|
||||||
|
.wclk (wclk),
|
||||||
|
.wrst_n (wrst_n)
|
||||||
|
);
|
||||||
|
|
||||||
|
// The module synchronizing the write point
|
||||||
|
// from write to read domain
|
||||||
|
sync_w2r
|
||||||
|
#(ASIZE)
|
||||||
|
sync_w2r (
|
||||||
|
.rq2_wptr (rq2_wptr),
|
||||||
|
.wptr (wptr),
|
||||||
|
.rclk (rclk),
|
||||||
|
.rrst_n (rrst_n)
|
||||||
|
);
|
||||||
|
|
||||||
|
// The module handling the write requests
|
||||||
|
wptr_full
|
||||||
|
#(ASIZE)
|
||||||
|
wptr_full (
|
||||||
|
.awfull (awfull),
|
||||||
|
.wfull (wfull),
|
||||||
|
.waddr (waddr),
|
||||||
|
.wptr (wptr),
|
||||||
|
.wq2_rptr (wq2_rptr),
|
||||||
|
.winc (winc),
|
||||||
|
.wclk (wclk),
|
||||||
|
.wrst_n (wrst_n)
|
||||||
|
);
|
||||||
|
|
||||||
|
// The DC-RAM
|
||||||
|
fifomem
|
||||||
|
#(DSIZE, ASIZE, FALLTHROUGH)
|
||||||
|
fifomem (
|
||||||
|
.rclken (rinc),
|
||||||
|
.rclk (rclk),
|
||||||
|
.rdata (rdata),
|
||||||
|
.wdata (wdata),
|
||||||
|
.waddr (waddr),
|
||||||
|
.raddr (raddr),
|
||||||
|
.wclken (winc),
|
||||||
|
.wfull (wfull),
|
||||||
|
.wclk (wclk)
|
||||||
|
);
|
||||||
|
|
||||||
|
// The module handling read requests
|
||||||
|
rptr_empty
|
||||||
|
#(ASIZE)
|
||||||
|
rptr_empty (
|
||||||
|
.arempty (arempty),
|
||||||
|
.rempty (rempty),
|
||||||
|
.raddr (raddr),
|
||||||
|
.rptr (rptr),
|
||||||
|
.rq2_wptr (rq2_wptr),
|
||||||
|
.rinc (rinc),
|
||||||
|
.rclk (rclk),
|
||||||
|
.rrst_n (rrst_n)
|
||||||
|
);
|
||||||
|
|
||||||
|
endmodule
|
||||||
|
|
||||||
|
`resetall
|
|
@ -0,0 +1,52 @@
|
||||||
|
// distributed under the mit license
|
||||||
|
// https://opensource.org/licenses/mit-license.php
|
||||||
|
|
||||||
|
`timescale 1 ns / 1 ps
|
||||||
|
`default_nettype none
|
||||||
|
|
||||||
|
module fifomem
|
||||||
|
|
||||||
|
#(
|
||||||
|
parameter DATASIZE = 8, // Memory data word width
|
||||||
|
parameter ADDRSIZE = 4, // Number of mem address bits
|
||||||
|
parameter FALLTHROUGH = "TRUE" // First word fall-through
|
||||||
|
) (
|
||||||
|
input wire wclk,
|
||||||
|
input wire wclken,
|
||||||
|
input wire [ADDRSIZE-1:0] waddr,
|
||||||
|
input wire [DATASIZE-1:0] wdata,
|
||||||
|
input wire wfull,
|
||||||
|
input wire rclk,
|
||||||
|
input wire rclken,
|
||||||
|
input wire [ADDRSIZE-1:0] raddr,
|
||||||
|
output wire [DATASIZE-1:0] rdata
|
||||||
|
);
|
||||||
|
|
||||||
|
localparam DEPTH = 1<<ADDRSIZE;
|
||||||
|
|
||||||
|
reg [DATASIZE-1:0] mem [0:DEPTH-1];
|
||||||
|
reg [DATASIZE-1:0] rdata_r;
|
||||||
|
|
||||||
|
always @(posedge wclk) begin
|
||||||
|
if (wclken && !wfull)
|
||||||
|
mem[waddr] <= wdata;
|
||||||
|
end
|
||||||
|
|
||||||
|
generate
|
||||||
|
if (FALLTHROUGH == "TRUE")
|
||||||
|
begin : fallthrough
|
||||||
|
assign rdata = mem[raddr];
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin : registered_read
|
||||||
|
always @(posedge rclk) begin
|
||||||
|
if (rclken)
|
||||||
|
rdata_r <= mem[raddr];
|
||||||
|
end
|
||||||
|
assign rdata = rdata_r;
|
||||||
|
end
|
||||||
|
endgenerate
|
||||||
|
|
||||||
|
endmodule
|
||||||
|
|
||||||
|
`resetall
|
|
@ -0,0 +1,95 @@
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// Copyright 2017 Damien Pretet ThotIP
|
||||||
|
// Copyright 2018 Julius Baxter
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
`timescale 1 ns / 1 ps
|
||||||
|
`default_nettype none
|
||||||
|
|
||||||
|
module fifomem_dp
|
||||||
|
|
||||||
|
#(
|
||||||
|
parameter DATASIZE = 8, // Memory data word width
|
||||||
|
parameter ADDRSIZE = 4, // Number of mem address bits
|
||||||
|
parameter FALLTHROUGH = "TRUE" // First word fall-through
|
||||||
|
) (
|
||||||
|
input wire a_clk,
|
||||||
|
input wire [DATASIZE-1:0] a_wdata,
|
||||||
|
output wire [DATASIZE-1:0] a_rdata,
|
||||||
|
input wire [ADDRSIZE-1:0] a_addr,
|
||||||
|
input wire a_rinc,
|
||||||
|
input wire a_winc,
|
||||||
|
|
||||||
|
input wire b_clk,
|
||||||
|
input wire [DATASIZE-1:0] b_wdata,
|
||||||
|
output wire [DATASIZE-1:0] b_rdata,
|
||||||
|
input wire [ADDRSIZE-1:0] b_addr,
|
||||||
|
input wire b_rinc,
|
||||||
|
input wire b_winc
|
||||||
|
);
|
||||||
|
|
||||||
|
reg [DATASIZE-1:0] a_rdata_r;
|
||||||
|
reg [DATASIZE-1:0] b_rdata_r;
|
||||||
|
|
||||||
|
generate
|
||||||
|
|
||||||
|
localparam DEPTH = 1<<ADDRSIZE;
|
||||||
|
reg [DATASIZE-1:0] mem [0:DEPTH-1];
|
||||||
|
|
||||||
|
if (FALLTHROUGH == "TRUE") begin : fallthrough
|
||||||
|
|
||||||
|
always @(posedge a_clk)
|
||||||
|
if (a_winc)
|
||||||
|
mem[a_addr] <= a_wdata;
|
||||||
|
|
||||||
|
assign a_rdata = mem[a_addr];
|
||||||
|
|
||||||
|
always @(posedge b_clk)
|
||||||
|
if (b_winc)
|
||||||
|
mem[b_addr] <= b_wdata;
|
||||||
|
|
||||||
|
assign b_rdata = mem[b_addr];
|
||||||
|
|
||||||
|
end else begin : registered
|
||||||
|
|
||||||
|
wire a_en = a_rinc | a_winc;
|
||||||
|
|
||||||
|
always @(posedge a_clk)
|
||||||
|
if (a_en) begin
|
||||||
|
if (a_winc)
|
||||||
|
mem[a_addr] <= a_wdata;
|
||||||
|
a_rdata_r <= mem[a_addr];
|
||||||
|
end
|
||||||
|
|
||||||
|
assign a_rdata = a_rdata_r;
|
||||||
|
|
||||||
|
wire b_en = b_rinc | b_winc;
|
||||||
|
|
||||||
|
always @(posedge b_clk)
|
||||||
|
if (b_en) begin
|
||||||
|
if (b_winc)
|
||||||
|
mem[b_addr] <= b_wdata;
|
||||||
|
b_rdata_r <= mem[b_addr];
|
||||||
|
end
|
||||||
|
|
||||||
|
assign b_rdata = b_rdata_r;
|
||||||
|
|
||||||
|
end // block: registered
|
||||||
|
endgenerate
|
||||||
|
|
||||||
|
|
||||||
|
endmodule
|
||||||
|
|
||||||
|
`resetall
|
|
@ -0,0 +1,65 @@
|
||||||
|
// distributed under the mit license
|
||||||
|
// https://opensource.org/licenses/mit-license.php
|
||||||
|
|
||||||
|
`timescale 1 ns / 1 ps
|
||||||
|
`default_nettype none
|
||||||
|
|
||||||
|
module rptr_empty
|
||||||
|
|
||||||
|
#(
|
||||||
|
parameter ADDRSIZE = 4
|
||||||
|
)(
|
||||||
|
input wire rclk,
|
||||||
|
input wire rrst_n,
|
||||||
|
input wire rinc,
|
||||||
|
input wire [ADDRSIZE :0] rq2_wptr,
|
||||||
|
output reg rempty,
|
||||||
|
output reg arempty,
|
||||||
|
output wire [ADDRSIZE-1:0] raddr,
|
||||||
|
output reg [ADDRSIZE :0] rptr
|
||||||
|
);
|
||||||
|
|
||||||
|
reg [ADDRSIZE:0] rbin;
|
||||||
|
wire [ADDRSIZE:0] rgraynext, rbinnext, rgraynextm1;
|
||||||
|
wire arempty_val, rempty_val;
|
||||||
|
|
||||||
|
//-------------------
|
||||||
|
// GRAYSTYLE2 pointer
|
||||||
|
//-------------------
|
||||||
|
always @(posedge rclk or negedge rrst_n) begin
|
||||||
|
|
||||||
|
if (!rrst_n)
|
||||||
|
{rbin, rptr} <= 0;
|
||||||
|
else
|
||||||
|
{rbin, rptr} <= {rbinnext, rgraynext};
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
// Memory read-address pointer (okay to use binary to address memory)
|
||||||
|
assign raddr = rbin[ADDRSIZE-1:0];
|
||||||
|
assign rbinnext = rbin + (rinc & ~rempty);
|
||||||
|
assign rgraynext = (rbinnext >> 1) ^ rbinnext;
|
||||||
|
assign rgraynextm1 = ((rbinnext + 1'b1) >> 1) ^ (rbinnext + 1'b1);
|
||||||
|
|
||||||
|
//---------------------------------------------------------------
|
||||||
|
// FIFO empty when the next rptr == synchronized wptr or on reset
|
||||||
|
//---------------------------------------------------------------
|
||||||
|
assign rempty_val = (rgraynext == rq2_wptr);
|
||||||
|
assign arempty_val = (rgraynextm1 == rq2_wptr);
|
||||||
|
|
||||||
|
always @ (posedge rclk or negedge rrst_n) begin
|
||||||
|
|
||||||
|
if (!rrst_n) begin
|
||||||
|
arempty <= 1'b0;
|
||||||
|
rempty <= 1'b1;
|
||||||
|
end
|
||||||
|
else begin
|
||||||
|
arempty <= arempty_val;
|
||||||
|
rempty <= rempty_val;
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
endmodule
|
||||||
|
|
||||||
|
`resetall
|
|
@ -0,0 +1,30 @@
|
||||||
|
// distributed under the mit license
|
||||||
|
// https://opensource.org/licenses/mit-license.php
|
||||||
|
|
||||||
|
`timescale 1 ns / 1 ps
|
||||||
|
`default_nettype none
|
||||||
|
|
||||||
|
module sync_ptr
|
||||||
|
|
||||||
|
#(
|
||||||
|
parameter ASIZE = 4
|
||||||
|
)(
|
||||||
|
input wire dest_clk,
|
||||||
|
input wire dest_rst_n,
|
||||||
|
input wire [ASIZE:0] src_ptr,
|
||||||
|
output reg [ASIZE:0] dest_ptr
|
||||||
|
);
|
||||||
|
|
||||||
|
reg [ASIZE:0] ptr_x;
|
||||||
|
|
||||||
|
always @(posedge dest_clk or negedge dest_rst_n) begin
|
||||||
|
|
||||||
|
if (!dest_rst_n)
|
||||||
|
{dest_ptr,ptr_x} <= 0;
|
||||||
|
else
|
||||||
|
{dest_ptr,ptr_x} <= {ptr_x,src_ptr};
|
||||||
|
end
|
||||||
|
|
||||||
|
endmodule
|
||||||
|
|
||||||
|
`resetall
|
|
@ -0,0 +1,31 @@
|
||||||
|
// distributed under the mit license
|
||||||
|
// https://opensource.org/licenses/mit-license.php
|
||||||
|
|
||||||
|
`timescale 1 ns / 1 ps
|
||||||
|
`default_nettype none
|
||||||
|
|
||||||
|
module sync_r2w
|
||||||
|
|
||||||
|
#(
|
||||||
|
parameter ASIZE = 4
|
||||||
|
)(
|
||||||
|
input wire wclk,
|
||||||
|
input wire wrst_n,
|
||||||
|
input wire [ASIZE:0] rptr,
|
||||||
|
output reg [ASIZE:0] wq2_rptr
|
||||||
|
);
|
||||||
|
|
||||||
|
reg [ASIZE:0] wq1_rptr;
|
||||||
|
|
||||||
|
always @(posedge wclk or negedge wrst_n) begin
|
||||||
|
|
||||||
|
if (!wrst_n)
|
||||||
|
{wq2_rptr,wq1_rptr} <= 0;
|
||||||
|
else
|
||||||
|
{wq2_rptr,wq1_rptr} <= {wq1_rptr,rptr};
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
endmodule
|
||||||
|
|
||||||
|
`resetall
|
|
@ -0,0 +1,31 @@
|
||||||
|
// distributed under the mit license
|
||||||
|
// https://opensource.org/licenses/mit-license.php
|
||||||
|
|
||||||
|
`timescale 1 ns / 1 ps
|
||||||
|
`default_nettype none
|
||||||
|
|
||||||
|
module sync_w2r
|
||||||
|
|
||||||
|
#(
|
||||||
|
parameter ASIZE = 4
|
||||||
|
)(
|
||||||
|
input wire rclk,
|
||||||
|
input wire rrst_n,
|
||||||
|
output reg [ASIZE:0] rq2_wptr,
|
||||||
|
input wire [ASIZE:0] wptr
|
||||||
|
);
|
||||||
|
|
||||||
|
reg [ASIZE:0] rq1_wptr;
|
||||||
|
|
||||||
|
always @(posedge rclk or negedge rrst_n) begin
|
||||||
|
|
||||||
|
if (!rrst_n)
|
||||||
|
{rq2_wptr,rq1_wptr} <= 0;
|
||||||
|
else
|
||||||
|
{rq2_wptr,rq1_wptr} <= {rq1_wptr,wptr};
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
endmodule
|
||||||
|
|
||||||
|
`resetall
|
|
@ -0,0 +1,65 @@
|
||||||
|
// distributed under the mit license
|
||||||
|
// https://opensource.org/licenses/mit-license.php
|
||||||
|
|
||||||
|
`timescale 1 ns / 1 ps
|
||||||
|
`default_nettype none
|
||||||
|
|
||||||
|
module wptr_full
|
||||||
|
|
||||||
|
#(
|
||||||
|
parameter ADDRSIZE = 4
|
||||||
|
)(
|
||||||
|
input wire wclk,
|
||||||
|
input wire wrst_n,
|
||||||
|
input wire winc,
|
||||||
|
input wire [ADDRSIZE :0] wq2_rptr,
|
||||||
|
output reg wfull,
|
||||||
|
output reg awfull,
|
||||||
|
output wire [ADDRSIZE-1:0] waddr,
|
||||||
|
output reg [ADDRSIZE :0] wptr
|
||||||
|
);
|
||||||
|
|
||||||
|
reg [ADDRSIZE:0] wbin;
|
||||||
|
wire [ADDRSIZE:0] wgraynext, wbinnext, wgraynextp1;
|
||||||
|
wire awfull_val, wfull_val;
|
||||||
|
|
||||||
|
// GRAYSTYLE2 pointer
|
||||||
|
always @(posedge wclk or negedge wrst_n) begin
|
||||||
|
|
||||||
|
if (!wrst_n)
|
||||||
|
{wbin, wptr} <= 0;
|
||||||
|
else
|
||||||
|
{wbin, wptr} <= {wbinnext, wgraynext};
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
// Memory write-address pointer (okay to use binary to address memory)
|
||||||
|
assign waddr = wbin[ADDRSIZE-1:0];
|
||||||
|
assign wbinnext = wbin + (winc & ~wfull);
|
||||||
|
assign wgraynext = (wbinnext >> 1) ^ wbinnext;
|
||||||
|
assign wgraynextp1 = ((wbinnext + 1'b1) >> 1) ^ (wbinnext + 1'b1);
|
||||||
|
|
||||||
|
//------------------------------------------------------------------
|
||||||
|
// Simplified version of the three necessary full-tests:
|
||||||
|
// assign wfull_val=((wgnext[ADDRSIZE] !=wq2_rptr[ADDRSIZE] ) &&
|
||||||
|
// (wgnext[ADDRSIZE-1] !=wq2_rptr[ADDRSIZE-1]) &&
|
||||||
|
// (wgnext[ADDRSIZE-2:0]==wq2_rptr[ADDRSIZE-2:0]));
|
||||||
|
//------------------------------------------------------------------
|
||||||
|
|
||||||
|
assign wfull_val = (wgraynext == {~wq2_rptr[ADDRSIZE:ADDRSIZE-1],wq2_rptr[ADDRSIZE-2:0]});
|
||||||
|
assign awfull_val = (wgraynextp1 == {~wq2_rptr[ADDRSIZE:ADDRSIZE-1],wq2_rptr[ADDRSIZE-2:0]});
|
||||||
|
|
||||||
|
always @(posedge wclk or negedge wrst_n) begin
|
||||||
|
|
||||||
|
if (!wrst_n) begin
|
||||||
|
awfull <= 1'b0;
|
||||||
|
wfull <= 1'b0;
|
||||||
|
end else begin
|
||||||
|
awfull <= awfull_val;
|
||||||
|
wfull <= wfull_val;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
endmodule
|
||||||
|
|
||||||
|
`resetall
|
|
@ -0,0 +1,33 @@
|
||||||
|
`include "isp.v"
|
||||||
|
`default_nettype none
|
||||||
|
|
||||||
|
module tb_isp;
|
||||||
|
reg clk;
|
||||||
|
reg rst_n;
|
||||||
|
|
||||||
|
isp
|
||||||
|
(
|
||||||
|
.rst_n (rst_n),
|
||||||
|
.clk (clk),
|
||||||
|
);
|
||||||
|
|
||||||
|
localparam CLK_PERIOD = 10;
|
||||||
|
always #(CLK_PERIOD/2) clk=~clk;
|
||||||
|
|
||||||
|
// initial begin
|
||||||
|
// $dumpfile("tb_isp.vcd");
|
||||||
|
// $dumpvars(0, tb_isp);
|
||||||
|
// end
|
||||||
|
|
||||||
|
initial begin
|
||||||
|
#1 rst_n<=1'bx;clk<=1'bx;
|
||||||
|
#(CLK_PERIOD*3) rst_n<=1;
|
||||||
|
#(CLK_PERIOD*3) rst_n<=0;clk<=0;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
$finish(2);
|
||||||
|
end
|
||||||
|
|
||||||
|
endmodule
|
||||||
|
`default_nettype wire
|
Loading…
Reference in New Issue