initial commit

This commit is contained in:
Steve Markgraf 2024-05-04 23:56:54 +02:00
commit 12fd93fa44
39 changed files with 8125 additions and 0 deletions

View file

@ -0,0 +1,99 @@
// https://github.com/dpretet/async_fifo
// 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

View file

@ -0,0 +1,53 @@
// https://github.com/dpretet/async_fifo
// 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

View file

@ -0,0 +1,66 @@
// https://github.com/dpretet/async_fifo
// 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

View file

@ -0,0 +1,32 @@
// https://github.com/dpretet/async_fifo
// 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

View file

@ -0,0 +1,32 @@
// https://github.com/dpretet/async_fifo
// 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

View file

@ -0,0 +1,66 @@
// https://github.com/dpretet/async_fifo
// 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

View file

@ -0,0 +1,80 @@
// Implementation of HDMI Auxiliary Video InfoFrame packet.
// By Sameer Puri https://github.com/sameer
// source: https://github.com/hdl-util/hdmi/
// Dual-licensed under Apache License 2.0 and MIT License.
// converted to Verilog and changed to YCbCr 4:2:2 for hsdaoh
// See Section 8.2.1
module auxiliary_video_information_info_frame (
header,
sub
);
parameter [1:0] VIDEO_FORMAT = 2'b01; // 00 = RGB, 01 = YCbCr 4:2:2, 10 = YCbCr 4:4:4
parameter [0:0] ACTIVE_FORMAT_INFO_PRESENT = 1'b0; // Not valid
parameter [1:0] BAR_INFO = 2'b00; // Not valid
parameter [1:0] SCAN_INFO = 2'b00; // No data
parameter [1:0] COLORIMETRY = 2'b00; // No data
parameter [1:0] PICTURE_ASPECT_RATIO = 2'b00; // No data, See CEA-CEB16 for more information about Active Format Description processing.
parameter [3:0] ACTIVE_FORMAT_ASPECT_RATIO = 4'b1000; // Not valid unless ACTIVE_FORMAT_INFO_PRESENT = 1'b1, then Same as picture aspect ratio
parameter [0:0] IT_CONTENT = 1'b0; // The IT content bit indicates when picture content is composed according to common IT practice (i.e. without regard to Nyquist criterion) and is unsuitable for analog reconstruction or filtering. When the IT content bit is set to 1, downstream processors should pass pixel data unfiltered and without analog reconstruction.
parameter [2:0] EXTENDED_COLORIMETRY = 3'b000; // Not valid unless COLORIMETRY = 2'b11. The extended colorimetry bits, EC2, EC1, and EC0, describe optional colorimetry encoding that may be applicable to some implementations and are always present, whether their information is valid or not (see CEA 861-D Section 7.5.5).
parameter [1:0] RGB_QUANTIZATION_RANGE = 2'b00; // Default. Displays conforming to CEA-861-D accept both a limited quantization range of 220 levels (16 to 235) anda full range of 256 levels (0 to 255) when receiving video with RGB color space (see CEA 861-D Sections 5.1, Section 5.2, Section 5.3 and Section 5.4). By default, RGB pixel data values should be assumed to have the limited range when receiving a CE video format, and the full range when receiving an IT format. The quantization bits allow the source to override this default and to explicitly indicate the current RGB quantization range.
parameter [1:0] NON_UNIFORM_PICTURE_SCALING = 2'b00; // None. The Nonuniform Picture Scaling bits shall be set if the source device scales the picture or has determined that scaling has been performed in a specific direction.
parameter [6:0] VIDEO_ID_CODE = 4; // Same as the one from the HDMI module
parameter [1:0] YCC_QUANTIZATION_RANGE = 2'b00; // 00 = Limited, 01 = Full
parameter [1:0] CONTENT_TYPE = 2'b00; // No data, becomes Graphics if IT_CONTENT = 1'b1.
parameter [3:0] PIXEL_REPETITION = 4'b0000; // None
output wire [23:0] header;
output wire [223:0] sub;
localparam [4:0] LENGTH = 5'd13;
localparam [7:0] VERSION = 8'd2;
localparam [6:0] TYPE = 7'd2;
assign header = {{3'b000, LENGTH}, VERSION, {1'b1, TYPE}};
// PB0-PB6 = sub0
// PB7-13 = sub1
// PB14-20 = sub2
// PB21-27 = sub3
wire [7:0] packet_bytes [27:0];
assign packet_bytes[0] = 8'd1 + ~(((((((((((((((header[23:16] + header[15:8]) + header[7:0]) + packet_bytes[13]) + packet_bytes[12]) + packet_bytes[11]) + packet_bytes[10]) + packet_bytes[9]) + packet_bytes[8]) + packet_bytes[7]) + packet_bytes[6]) + packet_bytes[5]) + packet_bytes[4]) + packet_bytes[3]) + packet_bytes[2]) + packet_bytes[1]);
assign packet_bytes[1] = {1'b0, VIDEO_FORMAT, ACTIVE_FORMAT_INFO_PRESENT, BAR_INFO, SCAN_INFO};
assign packet_bytes[2] = {COLORIMETRY, PICTURE_ASPECT_RATIO, ACTIVE_FORMAT_ASPECT_RATIO};
assign packet_bytes[3] = {IT_CONTENT, EXTENDED_COLORIMETRY, RGB_QUANTIZATION_RANGE, NON_UNIFORM_PICTURE_SCALING};
assign packet_bytes[4] = {1'b0, VIDEO_ID_CODE};
assign packet_bytes[5] = {YCC_QUANTIZATION_RANGE, CONTENT_TYPE, PIXEL_REPETITION};
genvar i;
generate
if (BAR_INFO != 2'b00) begin
assign packet_bytes[6] = 8'hff;
assign packet_bytes[7] = 8'hff;
assign packet_bytes[8] = 8'h00;
assign packet_bytes[9] = 8'h00;
assign packet_bytes[10] = 8'hff;
assign packet_bytes[11] = 8'hff;
assign packet_bytes[12] = 8'h00;
assign packet_bytes[13] = 8'h00;
end
else begin
assign packet_bytes[6] = 8'h00;
assign packet_bytes[7] = 8'h00;
assign packet_bytes[8] = 8'h00;
assign packet_bytes[9] = 8'h00;
assign packet_bytes[10] = 8'h00;
assign packet_bytes[11] = 8'h00;
assign packet_bytes[12] = 8'h00;
assign packet_bytes[13] = 8'h00;
end
for (i = 14; i < 28; i = i + 1) begin : pb_reserved
assign packet_bytes[i] = 8'd0;
end
for (i = 0; i < 4; i = i + 1) begin : pb_to_sub
assign sub[i * 56+:56] = {packet_bytes[6 + (i * 7)], packet_bytes[5 + (i * 7)], packet_bytes[4 + (i * 7)], packet_bytes[3 + (i * 7)], packet_bytes[2 + (i * 7)], packet_bytes[1 + (i * 7)], packet_bytes[i * 7]};
end
endgenerate
endmodule

306
common/hdmi/hdmi.v Normal file
View file

@ -0,0 +1,306 @@
// Implementation of HDMI Spec v1.4a
// By Sameer Puri https://github.com/sameer
// source: https://github.com/hdl-util/hdmi/
// Dual-licensed under Apache License 2.0 and MIT License.
// converted to Verilog and stripped down for hsdaoh,
// changed VIDEO_ID_CODE 16 to minimal timings the MS2130 accepts
module hdmi (
clk_pixel_x5,
clk_pixel,
reset,
rgb,
tmds,
tmds_clock,
cx,
cy,
frame_width,
frame_height,
screen_width,
screen_height
);
// Defaults to 640x480 which should be supported by almost if not all HDMI sinks.
// See README.md or CEA-861-D for enumeration of video id codes.
// Pixel repetition, interlaced scans and other special output modes are not implemented (yet).
parameter [6:0] VIDEO_ID_CODE = 1;
// The IT content bit indicates that image samples are generated in an ad-hoc
// manner (e.g. directly from values in a framebuffer, as by a PC video
// card) and therefore aren't suitable for filtering or analog
// reconstruction. This is probably what you want if you treat pixels
// as "squares". If you generate a properly bandlimited signal or obtain
// one from elsewhere (e.g. a camera), this can be turned off.
//
// This flag also tends to cause receivers to treat RGB values as full
// range (0-255).
parameter [0:0] IT_CONTENT = 1'b1;
// Defaults to minimum bit lengths required to represent positions.
// Modify these parameters if you have alternate desired bit lengths.
parameter [12:0] BIT_WIDTH = (VIDEO_ID_CODE < 4 ? 10 : (VIDEO_ID_CODE == 4 ? 11 : 12));
parameter [12:0] BIT_HEIGHT = (VIDEO_ID_CODE == 16 ? 11 : 10);
// A true HDMI signal sends auxiliary data (i.e. audio, preambles) which prevents it from being parsed by DVI signal sinks.
// HDMI signal sinks are fortunately backwards-compatible with DVI signals.
// Enable this flag if the output should be a DVI signal. You might want to do this to reduce resource usage or if you're only outputting video.
parameter [0:0] DVI_OUTPUT = 1'b0;
// **All parameters below matter ONLY IF you plan on sending auxiliary data (DVI_OUTPUT == 1'b0)**
// Starting screen coordinate when module comes out of reset.
//
// Setting these to something other than (0, 0) is useful when positioning
// an external video signal within a larger overall frame (e.g.
// letterboxing an input video signal). This allows you to synchronize the
// negative edge of reset directly to the start of the external signal
// instead of to some number of clock cycles before.
//
// You probably don't need to change these parameters if you are
// generating a signal from scratch instead of processing an
// external signal.
parameter [12:0] START_X = 0;
parameter [12:0] START_Y = 0;
input wire clk_pixel_x5;
input wire clk_pixel;
// synchronous reset back to 0,0
input wire reset;
input wire [23:0] rgb;
// These outputs go to your HDMI port
output wire [2:0] tmds;
output wire tmds_clock;
// All outputs below this line stay inside the FPGA
// They are used (by you) to pick the color each pixel should have
// i.e. always_ff @(posedge pixel_clk) rgb <= {8'd0, 8'(cx), 8'(cy)};
output reg [BIT_WIDTH - 1:0] cx = START_X;
output reg [BIT_HEIGHT - 1:0] cy = START_Y;
// The screen is at the upper left corner of the frame.
// 0,0 = 0,0 in video
// the frame includes extra space for sending auxiliary data
output wire [BIT_WIDTH - 1:0] frame_width;
output wire [BIT_HEIGHT - 1:0] frame_height;
output wire [BIT_WIDTH - 1:0] screen_width;
output wire [BIT_HEIGHT - 1:0] screen_height;
localparam signed [31:0] NUM_CHANNELS = 3;
reg hsync;
reg vsync;
wire [BIT_WIDTH - 1:0] hsync_pulse_start, hsync_pulse_size;
wire [BIT_HEIGHT - 1:0] vsync_pulse_start, vsync_pulse_size;
wire invert;
// See CEA-861-D for more specifics formats described below.
generate
case (VIDEO_ID_CODE)
16, 34: begin : genblk1
// Those are the patched, minimal timings for video mode 16 that
// work with the MS2130. The inactive video period has been reduced
// significantly. See below (mode 99) for the original timings for
// 1080p
assign frame_width = 1982;
assign frame_height = 1084;
assign screen_width = 1920;
assign screen_height = 1080;
assign hsync_pulse_start = 6;
assign hsync_pulse_size = 4;
assign vsync_pulse_start = 0;
assign vsync_pulse_size = 1;
assign invert = 0;
end
99: begin : genblk1
assign frame_width = 2200;
assign frame_height = 1125;
assign screen_width = 1920;
assign screen_height = 1080;
assign hsync_pulse_start = 88;
assign hsync_pulse_size = 44;
assign vsync_pulse_start = 4;
assign vsync_pulse_size = 5;
assign invert = 0;
end
endcase
endgenerate
always @(*) begin
hsync <= invert ^ ((cx >= (screen_width + hsync_pulse_start)) && (cx < ((screen_width + hsync_pulse_start) + hsync_pulse_size)));
// vsync pulses should begin and end at the start of hsync, so special
// handling is required for the lines on which vsync starts and ends
if (cy == ((screen_height + vsync_pulse_start) - 1))
vsync <= invert ^ (cx >= (screen_width + hsync_pulse_start));
else if (cy == (((screen_height + vsync_pulse_start) + vsync_pulse_size) - 1))
vsync <= invert ^ (cx < (screen_width + hsync_pulse_start));
else
vsync <= invert ^ ((cy >= (screen_height + vsync_pulse_start)) && (cy < ((screen_height + vsync_pulse_start) + vsync_pulse_size)));
end
// Wrap-around pixel position counters indicating the pixel to be generated by the user in THIS clock and sent out in the NEXT clock.
always @(posedge clk_pixel)
begin
if (reset) begin
cx <= START_X;
cy <= START_Y;
end
else begin
cx <= (cx == (frame_width - 1'b1) ? 0 : cx + 1'b1);
cy <= (cx == (frame_width - 1'b1) ? (cy == (frame_height - 1'b1) ? 0 : cy + 1'b1) : cy);
end
end
// See Section 5.2
reg video_data_period = 0;
always @(posedge clk_pixel)
begin
if (reset)
video_data_period <= 0;
else
video_data_period <= (cx < screen_width) && (cy < screen_height);
end
reg [2:0] mode = 3'd1;
reg [23:0] video_data = 24'd0;
reg [5:0] control_data = 6'd0;
reg [11:0] data_island_data = 12'd0;
function automatic [4:0] sv2v_cast_5;
input reg [4:0] inp;
sv2v_cast_5 = inp;
endfunction
generate
if (!DVI_OUTPUT) begin : true_hdmi_output
reg video_guard = 1;
reg video_preamble = 0;
always @(posedge clk_pixel)
begin
if (reset) begin
video_guard <= 1;
video_preamble <= 0;
end
else begin
video_guard <= ((cx >= (frame_width - 2)) && (cx < frame_width)) && ((cy == (frame_height - 1)) || (cy < (screen_height - 1)));
video_preamble <= ((cx >= (frame_width - 10)) && (cx < (frame_width - 2))) && ((cy == (frame_height - 1)) || (cy < (screen_height - 1)));
end
end
reg [4:0] num_packets_alongside = 1; // patched for hsdaoh: set to minimum required number
wire data_island_period_instantaneous;
assign data_island_period_instantaneous = ((num_packets_alongside > 0) && (cx >= (screen_width + 14))) && (cx < ((screen_width + 14) + (num_packets_alongside * 32)));
wire packet_enable;
assign packet_enable = data_island_period_instantaneous && (sv2v_cast_5((cx + screen_width) + 18) == 5'd0);
reg data_island_guard = 0;
reg data_island_preamble = 0;
reg data_island_period = 0;
always @(posedge clk_pixel)
begin
if (reset) begin
data_island_guard <= 0;
data_island_preamble <= 0;
data_island_period <= 0;
end
else begin
data_island_guard <= num_packets_alongside > 0 && (
(cx >= screen_width + 12 && cx < screen_width + 14) /* leading guard */ ||
(cx >= screen_width + 14 + num_packets_alongside * 32 && cx < screen_width + 14 + num_packets_alongside * 32 + 2) /* trailing guard */
);
data_island_preamble <= num_packets_alongside > 0 && cx >= screen_width + 4 && cx < screen_width + 12;
data_island_period <= data_island_period_instantaneous;
end
end
// See Section 5.2.3.4
wire [23:0] header;
wire [223:0] sub;
wire video_field_end;
assign video_field_end = (cx == (screen_width - 1'b1)) && (cy == (screen_height - 1'b1));
wire [4:0] packet_pixel_counter;
packet_picker #(
.VIDEO_ID_CODE(VIDEO_ID_CODE)
) packet_picker(
.clk_pixel(clk_pixel),
.reset(reset),
.video_field_end(video_field_end),
.packet_enable(packet_enable),
.packet_pixel_counter(packet_pixel_counter),
.header(header),
.sub(sub)
);
wire [8:0] packet_data;
packet_assembler packet_assembler(
.clk_pixel(clk_pixel),
.reset(reset),
.data_island_period(data_island_period),
.header(header),
.sub(sub),
.packet_data(packet_data),
.counter(packet_pixel_counter)
);
always @(posedge clk_pixel)
if (reset) begin
mode <= 3'd2;
video_data <= 24'd0;
control_data = 6'd0;
data_island_data <= 12'd0;
end
else begin
mode <= (data_island_guard ? 3'd4 : (data_island_period ? 3'd3 : (video_guard ? 3'd2 : (video_data_period ? 3'd1 : 3'd0))));
video_data <= rgb;
control_data <= {1'b0, data_island_preamble, 1'b0, video_preamble || data_island_preamble, vsync, hsync};
data_island_data[11:4] <= packet_data[8:1];
data_island_data[3] <= cx != 0;
data_island_data[2] <= packet_data[0];
data_island_data[1:0] <= {vsync, hsync};
end
end
else begin : genblk2 // DVI_OUTPUT = 1
reg video_guard = 1;
reg video_preamble = 0;
always @(posedge clk_pixel)
if (reset) begin
video_guard <= 1;
mode <= 3'd0;
video_data <= 24'd0;
control_data <= 6'd0;
end
else begin
video_guard <= ((cx >= (frame_width - 2)) && (cx < frame_width)) && ((cy == (frame_height - 1)) || (cy < (screen_height - 1)));
video_preamble <= ((cx >= (frame_width - 10)) && (cx < (frame_width - 2))) && ((cy == (frame_height - 1)) || (cy < (screen_height - 1)));
mode <= (video_data_period ? 3'd1 : (video_guard ? 3'd2 : 3'd0));
video_data <= rgb;
control_data <= {4'b0000, vsync, hsync}; // ctrl3, ctrl2, ctrl1, ctrl0, vsync, hsync
end
end
endgenerate
// All logic below relates to the production and output of the 10-bit TMDS code.
wire [29:0] tmds_internal;
genvar i;
generate
// TMDS code production.
for (i = 0; i < NUM_CHANNELS; i = i + 1) begin : tmds_gen
tmds_channel #(.CN(i)) tmds_channel(
.clk_pixel(clk_pixel),
.video_data(video_data[(i * 8) + 7:i * 8]),
.data_island_data(data_island_data[(i * 4) + 3:i * 4]),
.control_data(control_data[(i * 2) + 1:i * 2]),
.mode(mode),
.tmds(tmds_internal[i * 10+:10])
);
end
endgenerate
serializer #(
.NUM_CHANNELS(NUM_CHANNELS)
) serializer(
.clk_pixel(clk_pixel),
.clk_pixel_x5(clk_pixel_x5),
.reset(reset),
.tmds_internal(tmds_internal),
.tmds(tmds),
.tmds_clock(tmds_clock)
);
endmodule

View file

@ -0,0 +1,92 @@
// Implementation of HDMI packet ECC calculation.
// By Sameer Puri https://github.com/sameer
// source: https://github.com/hdl-util/hdmi/
// Dual-licensed under Apache License 2.0 and MIT License.
// converted to Verilog for hsdaoh
module packet_assembler (
clk_pixel,
reset,
data_island_period,
header, // See Table 5-8 Packet Types
sub,
packet_data, // See Figure 5-4 Data Island Packet and ECC Structure
counter
);
input wire clk_pixel;
input wire reset;
input wire data_island_period;
input wire [23:0] header;
input wire [223:0] sub;
output wire [8:0] packet_data;
output reg [4:0] counter = 5'd0;
// 32 pixel wrap-around counter. See Section 5.2.3.4 for further information.
always @(posedge clk_pixel)
begin
if (reset)
counter <= 5'd0;
else if (data_island_period)
counter <= counter + 5'd1;
end
// BCH packets 0 to 3 are transferred two bits at a time, see Section 5.2.3.4 for further information.
wire [5:0] counter_t2 = {counter, 1'b0};
wire [5:0] counter_t2_p1 = {counter, 1'b1};
// Initialize parity bits to 0
reg [39:0] parity = 40'h0000000000;
wire [63:0] bch [3:0];
assign bch[0] = {parity[0+:8], sub[0+:56]};
assign bch[1] = {parity[8+:8], sub[56+:56]};
assign bch[2] = {parity[16+:8], sub[112+:56]};
assign bch[3] = {parity[24+:8], sub[168+:56]};
wire [31:0] bch4 = {parity[32+:8], header};
assign packet_data = {bch[3][counter_t2_p1], bch[2][counter_t2_p1], bch[1][counter_t2_p1], bch[0][counter_t2_p1], bch[3][counter_t2], bch[2][counter_t2], bch[1][counter_t2], bch[0][counter_t2], bch4[counter]};
// See Figure 5-5 Error Correction Code generator. Generalization of a CRC with binary BCH.
// See https://web.archive.org/web/20190520020602/http://hamsterworks.co.nz/mediawiki/index.php/Minimal_HDMI#Computing_the_ECC for an explanation of the implementation.
// See https://en.wikipedia.org/wiki/BCH_code#Systematic_encoding:_The_message_as_a_prefix for further information.
function automatic [7:0] next_ecc;
input [7:0] ecc, next_bch_bit;
begin
next_ecc = (ecc >> 1) ^ (ecc[0] ^ next_bch_bit ? 8'b10000011 : 8'd0);
end
endfunction
wire [7:0] parity_next [4:0];
// The parity needs to be calculated 2 bits at a time for blocks 0 to 3.
// There's 56 bits being sent 2 bits at a time over TMDS channels 1 & 2, so the parity bits wouldn't be ready in time otherwise.
wire [31:0] parity_next_next;
genvar i;
generate
for (i = 0; i < 5; i = i + 1) begin : parity_calc
if (i == 4) begin : genblk1
assign parity_next[i] = next_ecc(parity[i * 8+:8], header[counter]);
end
else begin : genblk1
assign parity_next[i] = next_ecc(parity[i * 8+:8], sub[(i * 56) + counter_t2]);
assign parity_next_next[i * 8+:8] = next_ecc(parity_next[i], sub[(i * 56) + counter_t2_p1]);
end
end
endgenerate
always @(posedge clk_pixel)
begin
if (reset)
parity <= 40'h0000000000;
else if (data_island_period) begin
if (counter < 5'd28) begin // Compute ECC only on subpacket data, not on itself
parity[0+:32] <= parity_next_next;
if (counter < 5'd24) // Header only has 24 bits, whereas subpackets have 56 and 56 / 2 = 28.
parity[32+:8] <= parity_next[4];
end
else if (counter == 5'd31)
parity <= 40'h0000000000; // Reset ECC for next packet
end
else
parity <= 40'h0000000000;
end
endmodule

View file

@ -0,0 +1,81 @@
// Implementation of HDMI packet choice logic.
// By Sameer Puri https://github.com/sameer
// source: https://github.com/hdl-util/hdmi/
// Dual-licensed under Apache License 2.0 and MIT License.
// converted to Verilog and removed packets not required for hsdaoh
module packet_picker (
clk_pixel,
reset,
video_field_end,
packet_enable,
packet_pixel_counter,
header,
sub
);
parameter [6:0] VIDEO_ID_CODE = 4;
parameter [0:0] IT_CONTENT = 1'b0;
input wire clk_pixel;
input wire reset;
input wire video_field_end;
input wire packet_enable;
input wire [4:0] packet_pixel_counter;
output wire [23:0] header;
output wire [223:0] sub;
// Connect the current packet type's data to the output.
reg [7:0] packet_type = 8'd0;
wire [23:0] headers [255:0];
wire [223:0] subs [255:0];
assign header = headers[packet_type];
assign sub[0+:56] = subs[packet_type][0+:56];
assign sub[56+:56] = subs[packet_type][56+:56];
assign sub[112+:56] = subs[packet_type][112+:56];
assign sub[168+:56] = subs[packet_type][168+:56];
// NULL packet
// "An HDMI Sink shall ignore bytes HB1 and HB2 of the Null Packet Header and all bytes of the Null Packet Body."
assign headers[0] = 24'hxxxx00;
assign subs[0][0+:56] = 56'bxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx;
assign subs[0][56+:56] = 56'bxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx;
assign subs[0][112+:56] = 56'bxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx;
assign subs[0][168+:56] = 56'bxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx;
reg [7:0] frame_counter = 8'd0;
always @(posedge clk_pixel)
begin
if (reset)
frame_counter <= 8'd0;
else if ((packet_pixel_counter == 5'd31) && (packet_type == 8'h02)) begin
frame_counter = frame_counter + 8'd4;
if (frame_counter >= 8'd192)
frame_counter = frame_counter - 8'd192;
end
end
auxiliary_video_information_info_frame #(
.VIDEO_ID_CODE(VIDEO_ID_CODE),
.IT_CONTENT(IT_CONTENT)
) auxiliary_video_information_info_frame(
.header(headers[130]),
.sub(subs[130])
);
reg auxiliary_video_information_info_frame_sent = 1'b0;
always @(posedge clk_pixel)
begin
if (reset || video_field_end) begin
auxiliary_video_information_info_frame_sent <= 1'b0;
packet_type <= 8'bxxxxxxxx;
end
else if (packet_enable) begin
if (!auxiliary_video_information_info_frame_sent) begin
packet_type <= 8'h82;
auxiliary_video_information_info_frame_sent <= 1'b1;
end
else
packet_type <= 8'd0;
end
end
endmodule

75
common/hdmi/serializer.v Normal file
View file

@ -0,0 +1,75 @@
// TMDS serializer
// By Sameer Puri https://github.com/sameer
// source: https://github.com/hdl-util/hdmi/
// Dual-licensed under Apache License 2.0 and MIT License.
// converted to Verilog for hsdaoh
// currently only contains the GOWIN OSER10 primitives
// TODO: add back everything from https://github.com/hdl-util/hdmi/blob/master/src/serializer.sv
module serializer (
clk_pixel,
clk_pixel_x5,
reset,
tmds_internal,
tmds,
tmds_clock
);
parameter signed [31:0] NUM_CHANNELS = 3;
parameter real VIDEO_RATE = 0;
input wire clk_pixel;
input wire clk_pixel_x5;
input wire reset;
input wire [(NUM_CHANNELS * 10) - 1:0] tmds_internal;
output wire [2:0] tmds;
output wire tmds_clock;
OSER10 gwSer0(
.Q(tmds[0]),
.D0(tmds_internal[0]),
.D1(tmds_internal[1]),
.D2(tmds_internal[2]),
.D3(tmds_internal[3]),
.D4(tmds_internal[4]),
.D5(tmds_internal[5]),
.D6(tmds_internal[6]),
.D7(tmds_internal[7]),
.D8(tmds_internal[8]),
.D9(tmds_internal[9]),
.PCLK(clk_pixel),
.FCLK(clk_pixel_x5),
.RESET(reset)
);
OSER10 gwSer1(
.Q(tmds[1]),
.D0(tmds_internal[10]),
.D1(tmds_internal[11]),
.D2(tmds_internal[12]),
.D3(tmds_internal[13]),
.D4(tmds_internal[14]),
.D5(tmds_internal[15]),
.D6(tmds_internal[16]),
.D7(tmds_internal[17]),
.D8(tmds_internal[18]),
.D9(tmds_internal[19]),
.PCLK(clk_pixel),
.FCLK(clk_pixel_x5),
.RESET(reset)
);
OSER10 gwSer2(
.Q(tmds[2]),
.D0(tmds_internal[20]),
.D1(tmds_internal[21]),
.D2(tmds_internal[22]),
.D3(tmds_internal[23]),
.D4(tmds_internal[24]),
.D5(tmds_internal[25]),
.D6(tmds_internal[26]),
.D7(tmds_internal[27]),
.D8(tmds_internal[28]),
.D9(tmds_internal[29]),
.PCLK(clk_pixel),
.FCLK(clk_pixel_x5),
.RESET(reset)
);
assign tmds_clock = clk_pixel;
endmodule

161
common/hdmi/tmds_channel.v Normal file
View file

@ -0,0 +1,161 @@
// Implementation of HDMI Spec v1.4a Section 5.4: Encoding, Section 5.2.2.1: Video Guard Band, Section 5.2.3.3: Data Island Guard Bands.
// By Sameer Puri https://github.com/sameer
// source: https://github.com/hdl-util/hdmi/
// Dual-licensed under Apache License 2.0 and MIT License.
// converted to Verilog for hsdaoh
module tmds_channel (
clk_pixel,
video_data,
data_island_data,
control_data,
mode,
tmds
);
// TMDS Channel number.
// There are only 3 possible channel numbers in HDMI 1.4a: 0, 1, 2.
parameter [1:0] CN = 0;
input wire clk_pixel;
input wire [7:0] video_data;
input wire [3:0] data_island_data;
input wire [1:0] control_data;
input wire [2:0] mode; // Mode select (0 = control, 1 = video, 2 = video guard, 3 = island, 4 = island guard)
output reg [9:0] tmds = 10'b1101010100;
// See Section 5.4.4.1
// Below is a direct implementation of Figure 5-7, using the same variable names.
reg signed [4:0] acc = 5'sd0;
reg [8:0] q_m;
reg [9:0] q_out;
wire [9:0] video_coding;
assign video_coding = q_out;
reg [3:0] N1D;
reg signed [4:0] N1q_m07;
reg signed [4:0] N0q_m07;
always @(*) begin
N1D = video_data[0] + video_data[1] + video_data[2] + video_data[3] + video_data[4] + video_data[5] + video_data[6] + video_data[7];
case (q_m[0] + q_m[1] + q_m[2] + q_m[3] + q_m[4] + q_m[5] + q_m[6] + q_m[7])
4'b0000: N1q_m07 = 5'sd0;
4'b0001: N1q_m07 = 5'sd1;
4'b0010: N1q_m07 = 5'sd2;
4'b0011: N1q_m07 = 5'sd3;
4'b0100: N1q_m07 = 5'sd4;
4'b0101: N1q_m07 = 5'sd5;
4'b0110: N1q_m07 = 5'sd6;
4'b0111: N1q_m07 = 5'sd7;
4'b1000: N1q_m07 = 5'sd8;
default: N1q_m07 = 5'sd0;
endcase
N0q_m07 = 5'sd8 - N1q_m07;
end
reg signed [4:0] acc_add;
integer i;
always @(*) begin
if ((N1D > 4'd4) || ((N1D == 4'd4) && (video_data[0] == 1'd0))) begin
q_m[0] = video_data[0];
for (i = 0; i < 7; i = i + 1)
q_m[i + 1] = q_m[i] ~^ video_data[i + 1];
q_m[8] = 1'b0;
end
else begin
q_m[0] = video_data[0];
for (i = 0; i < 7; i = i + 1)
q_m[i + 1] = q_m[i] ^ video_data[i + 1];
q_m[8] = 1'b1;
end
if ((acc == 5'sd0) || (N1q_m07 == N0q_m07)) begin
if (q_m[8]) begin
acc_add = N1q_m07 - N0q_m07;
q_out = {~q_m[8], q_m[8], q_m[7:0]};
end
else begin
acc_add = N0q_m07 - N1q_m07;
q_out = {~q_m[8], q_m[8], ~q_m[7:0]};
end
end
else if (((acc > 5'sd0) && (N1q_m07 > N0q_m07)) || ((acc < 5'sd0) && (N1q_m07 < N0q_m07))) begin
q_out = {1'b1, q_m[8], ~q_m[7:0]};
acc_add = (N0q_m07 - N1q_m07) + (q_m[8] ? 5'sd2 : 5'sd0);
end
else begin
q_out = {1'b0, q_m[8], q_m[7:0]};
acc_add = (N1q_m07 - N0q_m07) - (~q_m[8] ? 5'sd2 : 5'sd0);
end
end
always @(posedge clk_pixel) acc <= (mode != 3'd1 ? 5'sd0 : acc + acc_add);
// See Section 5.4.2
reg [9:0] control_coding;
always @(*)
begin
case (control_data)
2'b00: control_coding = 10'b1101010100;
2'b01: control_coding = 10'b0010101011;
2'b10: control_coding = 10'b0101010100;
2'b11: control_coding = 10'b1010101011;
endcase
end
// See Section 5.4.3
reg [9:0] terc4_coding;
always @(*)
begin
case (data_island_data)
4'b0000: terc4_coding = 10'b1010011100;
4'b0001: terc4_coding = 10'b1001100011;
4'b0010: terc4_coding = 10'b1011100100;
4'b0011: terc4_coding = 10'b1011100010;
4'b0100: terc4_coding = 10'b0101110001;
4'b0101: terc4_coding = 10'b0100011110;
4'b0110: terc4_coding = 10'b0110001110;
4'b0111: terc4_coding = 10'b0100111100;
4'b1000: terc4_coding = 10'b1011001100;
4'b1001: terc4_coding = 10'b0100111001;
4'b1010: terc4_coding = 10'b0110011100;
4'b1011: terc4_coding = 10'b1011000110;
4'b1100: terc4_coding = 10'b1010001110;
4'b1101: terc4_coding = 10'b1001110001;
4'b1110: terc4_coding = 10'b0101100011;
4'b1111: terc4_coding = 10'b1011000011;
endcase
end
// See Section 5.2.2.1
wire [9:0] video_guard_band;
generate
if ((CN == 0) || (CN == 2)) begin : genblk1
assign video_guard_band = 10'b1011001100;
end
else begin : genblk1
assign video_guard_band = 10'b0100110011;
end
endgenerate
// See Section 5.2.3.3
wire [9:0] data_guard_band;
generate
if ((CN == 1) || (CN == 2)) begin : genblk2
assign data_guard_band = 10'b0100110011;
end
else begin : genblk2
assign data_guard_band = (control_data == 2'b00 ? 10'b1010001110 : (control_data == 2'b01 ? 10'b1001110001 : (control_data == 2'b10 ? 10'b0101100011 : 10'b1011000011)));
end
endgenerate
// Apply selected mode.
always @(posedge clk_pixel)
begin
case (mode)
3'd0: tmds <= control_coding;
3'd1: tmds <= video_coding;
3'd2: tmds <= video_guard_band;
3'd3: tmds <= terc4_coding;
3'd4: tmds <= data_guard_band;
endcase
end
endmodule

133
common/hsdaoh/hsdaoh_core.v Normal file
View file

@ -0,0 +1,133 @@
// hsdaoh - High Speed Data Acquisition over HDMI
// Implementation of data output
// Copyright (C) 2024 by Steve Markgraf <steve@steve-m.de>
// License: MIT
module hsdaoh_core
(
input wire rstn,
output wire tmds_clk_n,
output wire tmds_clk_p,
output wire [2:0] tmds_d_n,
output wire [2:0] tmds_d_p,
input wire clk_pixel_x5,
input wire clk_pixel,
input wire fifo_empty,
input wire fifo_aempty,
output reg fifo_read_en,
input wire [15:0] data_in
);
localparam [31:0] MAGIC = 32'hda7acab1;
reg [23:0] hdmi_data = 24'h000000;
reg [15:0] frame_cnt = 16'h0000;
reg [15:0] idle_counter = 16'h0000;
reg [15:0] line_word_cnt = 16'h00;
reg [3:0] status_nibble = 4'h0;
wire [11:0] cx;
wire [10:0] cy;
wire [11:0] frame_width;
wire [10:0] frame_height;
wire [11:0] screen_width;
wire [10:0] screen_height;
always @(posedge clk_pixel) begin
if ((cx == screen_width-1) && (cy < screen_height)) begin
// last word of line contains counter of words per line
hdmi_data <= {status_nibble[3:0], line_word_cnt[11:0], 8'h00};
end else if ((cx < screen_width) && (cy < screen_height)) begin
if (fifo_read_en && !fifo_empty) begin
// regular output of FIFO data
hdmi_data <= {data_in[15:0], 8'h00};
// increment line payload counter
line_word_cnt <= line_word_cnt + 1'b1;
end else begin
// output idle counter
hdmi_data <= {idle_counter[15:8], idle_counter[7:0], 8'h00};
// increment idle counter
idle_counter <= idle_counter + 1'b1;
end
end else
line_word_cnt <= 16'h0000;
// Enable reading before beginning of next line
if ((cx == frame_width-1) && (cy < screen_height-1) && !fifo_empty)
fifo_read_en = 1'b1;
// switch read off during blanking
if (cy > screen_height)
fifo_read_en = 1'b0;
// switch read off at end of line before sending the word counter
// -2 because the last word is reserved (line_word_cnt and metadata)
if ((cx == screen_width-2) && (cy < screen_height))
fifo_read_en = 1'b0;
// switch read off when FIFO has only one word remaining
if (fifo_aempty)
fifo_read_en = 1'b0;
// increment the frame counter at the end of the frame
if ((cx == frame_width-1) && (cy == frame_height-1)) begin
frame_cnt <= frame_cnt + 1'b1;
line_word_cnt <= 16'h0000;
// start FIFO readout
if (!fifo_empty)
fifo_read_en = 1'b1;
end
if (cx == 0) begin
case (cy)
0 : status_nibble <= MAGIC[3:0];
1 : status_nibble <= MAGIC[7:4];
2 : status_nibble <= MAGIC[11:8];
3 : status_nibble <= MAGIC[15:12];
4 : status_nibble <= MAGIC[19:16];
5 : status_nibble <= MAGIC[23:20];
6 : status_nibble <= MAGIC[27:24];
7 : status_nibble <= MAGIC[31:28];
8 : status_nibble <= frame_cnt[3:0];
9 : status_nibble <= frame_cnt[7:4];
10 : status_nibble <= frame_cnt[11:8];
11 : status_nibble <= frame_cnt[15:12];
default : status_nibble <= 4'h0;
endcase
end
end
wire tmds_clock;
wire [2:0] tmds;
hdmi #(
.VIDEO_ID_CODE(16),
.DVI_OUTPUT(0)
) hdmi(
.clk_pixel_x5(clk_pixel_x5),
.clk_pixel(clk_pixel),
.reset(!rstn),
.rgb(hdmi_data),
.tmds(tmds),
.tmds_clock(tmds_clock),
.cx(cx),
.cy(cy),
.frame_width(frame_width),
.frame_height(frame_height),
.screen_width(screen_width),
.screen_height(screen_height)
);
ELVDS_OBUF tmds_bufds[3:0](
.I({clk_pixel, tmds}),
.O({tmds_clk_p, tmds_d_p}),
.OB({tmds_clk_n, tmds_d_n})
);
endmodule

25
hsdaoh_nano20k_test.gprj Normal file
View file

@ -0,0 +1,25 @@
<?xml version="1" encoding="UTF-8"?>
<!DOCTYPE gowin-fpga-project>
<Project>
<Template>FPGA</Template>
<Version>5</Version>
<Device name="GW2AR-18C" pn="GW2AR-LV18QN88C8/I7">gw2ar18c-000</Device>
<FileList>
<File path="common/async_fifo/async_fifo.v" type="file.verilog" enable="1"/>
<File path="common/async_fifo/fifomem.v" type="file.verilog" enable="1"/>
<File path="common/async_fifo/rptr_empty.v" type="file.verilog" enable="1"/>
<File path="common/async_fifo/sync_r2w.v" type="file.verilog" enable="1"/>
<File path="common/async_fifo/sync_w2r.v" type="file.verilog" enable="1"/>
<File path="common/async_fifo/wptr_full.v" type="file.verilog" enable="1"/>
<File path="common/hdmi/auxiliary_video_information_info_frame.v" type="file.verilog" enable="1"/>
<File path="common/hdmi/hdmi.v" type="file.verilog" enable="1"/>
<File path="common/hdmi/packet_assembler.v" type="file.verilog" enable="1"/>
<File path="common/hdmi/packet_picker.v" type="file.verilog" enable="1"/>
<File path="common/hdmi/serializer.v" type="file.verilog" enable="1"/>
<File path="common/hdmi/tmds_channel.v" type="file.verilog" enable="1"/>
<File path="common/hsdaoh/hsdaoh_core.v" type="file.verilog" enable="1"/>
<File path="hsdaoh_nano20k_test/top.v" type="file.verilog" enable="1"/>
<File path="hsdaoh_nano20k_test/hsdaoh_nano20k_test.cst" type="file.cst" enable="1"/>
<File path="hsdaoh_nano20k_test/hsdaoh_nano20k_test.sdc" type="file.sdc" enable="1"/>
</FileList>
</Project>

View file

@ -0,0 +1,47 @@
//IO_LOC "led[5]" 15;
//IO_PORT "led[5]" IO_TYPE=LVCMOS18 PULL_MODE=UP DRIVE=8;
//IO_LOC "led[4]" 13;
//IO_PORT "led[4]" IO_TYPE=LVCMOS18 PULL_MODE=UP DRIVE=8;
//IO_LOC "led[3]" 10;
//IO_PORT "led[3]" IO_TYPE=LVCMOS18 PULL_MODE=UP DRIVE=8;
//IO_LOC "led[2]" 16;
//IO_PORT "led[2]" IO_TYPE=LVCMOS18 PULL_MODE=UP DRIVE=8;
//IO_LOC "led[1]" 14;
//IO_PORT "led[1]" IO_TYPE=LVCMOS18 PULL_MODE=UP DRIVE=8;
//IO_LOC "led[0]" 11;
//IO_PORT "led[0]" IO_TYPE=LVCMOS18 PULL_MODE=UP DRIVE=8;
IO_LOC "sys_resetn" 88;
IO_PORT "sys_resetn" PULL_MODE=UP;
IO_LOC "sys_clk" 4;
//IO_PORT "sys_clk" IO_TYPE=LVCMOS33 PULL_MODE=UP;
IO_PORT "sys_clk" PULL_MODE=UP;
IO_LOC "tmds_d_p[0]" 35,36;
IO_PORT "tmds_d_p[0]" PULL_MODE=NONE DRIVE=8;
IO_LOC "tmds_d_p[1]" 37,38;
IO_PORT "tmds_d_p[1]" PULL_MODE=NONE DRIVE=8;
IO_LOC "tmds_d_p[2]" 39,40;
IO_PORT "tmds_d_p[2]" PULL_MODE=NONE DRIVE=8;
IO_LOC "tmds_clk_p" 33,34;
IO_PORT "tmds_clk_p" PULL_MODE=NONE DRIVE=8;
// 20k example:
//IO_LOC "O_tmds_clk_p" 33,34;
//IO_PORT "O_tmds_clk_p" PULL_MODE=NONE DRIVE=8;
//IO_LOC "O_tmds_data_p[0]" 35,36;
//IO_PORT "O_tmds_data_p[0]" PULL_MODE=NONE DRIVE=8;
//IO_LOC "O_tmds_data_p[1]" 37,38;
//IO_PORT "O_tmds_data_p[1]" PULL_MODE=NONE DRIVE=8;
//IO_LOC "O_tmds_data_p[2]" 39,40;
//IO_PORT "O_tmds_data_p[2]" PULL_MODE=NONE DRIVE=8;
//IO_LOC "I_clk" 4;
//IO_PORT "I_clk" PULL_MODE=UP;

View file

@ -0,0 +1,2 @@
create_clock -name sys_clk -period 37.04 [get_ports {sys_clk}] -add
//create_clock -name adc_clkout -period 12.3 [get_ports {adc_clkout}] -add

157
hsdaoh_nano20k_test/top.v Normal file
View file

@ -0,0 +1,157 @@
// hsdaoh - High Speed Data Acquisition over HDMI
// Test top design for Tang Nano 20K
// Copyright (C) 2024 by Steve Markgraf <steve@steve-m.de>
// License: MIT
module top (
sys_clk,
sys_resetn,
enable,
tmds_clk_n,
tmds_clk_p,
tmds_d_n,
tmds_d_p
);
input sys_clk;
input sys_resetn;
input wire enable;
output wire tmds_clk_n;
output wire tmds_clk_p;
output wire [2:0] tmds_d_n;
output wire [2:0] tmds_d_p;
wire [2:0] tmds;
wire clk_pixel;
wire clk_pixel_x5;
wire hdmi_pll_lock;
wire clk_data;
wire data_pll_lock;
// 477 MHz, maximum that works with the nano 20K
// 477/5 = 95.4 MHz
localparam HDMI_PLL_IDIV = 2;
localparam HDMI_PLL_FBDIV = 52;
localparam HDMI_PLL_ODIV = 2;
// PLL for HDMI clock
rPLL #(
.FCLKIN (27),
.IDIV_SEL (HDMI_PLL_IDIV),
.FBDIV_SEL (HDMI_PLL_FBDIV),
.ODIV_SEL (HDMI_PLL_ODIV),
.DEVICE ("GW2AR-18C")
) hdmi_pll (
.CLKIN (sys_clk),
.CLKFB (1'b0),
.RESET (1'b0),
.RESET_P (1'b0),
.FBDSEL (6'b0),
.IDSEL (6'b0),
.ODSEL (6'b0),
.DUTYDA (4'b0),
.PSDA (4'b0),
.FDLY (4'b0),
.CLKOUT (clk_pixel_x5),
.LOCK (hdmi_pll_lock),
.CLKOUTP (),
.CLKOUTD (),
.CLKOUTD3 ()
);
CLKDIV #(
.DIV_MODE(5),
.GSREN("false")
) div_5 (
.CLKOUT(clk_pixel),
.HCLKIN(clk_pixel_x5),
.RESETN(hdmi_pll_lock),
.CALIB(1'b0)
);
// 91.8 MHz clock for data
localparam DATA_PLL_IDIV = 4;
localparam DATA_PLL_FBDIV = 16;
localparam DATA_PLL_ODIV = 8;
// PLL for data clock
rPLL #(
.FCLKIN (27),
.IDIV_SEL (DATA_PLL_IDIV),
.FBDIV_SEL (DATA_PLL_FBDIV),
.ODIV_SEL (DATA_PLL_ODIV),
.DEVICE ("GW2AR-18C")
) data_pll (
.CLKIN(sys_clk),
.CLKFB(1'b0),
.RESET(rst),
.RESET_P(1'b0),
.FBDSEL(6'b0),
.IDSEL(6'b0),
.ODSEL(6'b0),
.DUTYDA(4'b0),
.PSDA(4'b0),
.FDLY(4'b0),
.CLKOUT(clk_data),
.LOCK(data_pll_lock),
.CLKOUTP(),
.CLKOUTD(),
.CLKOUTD3()
);
reg [15:0] counter = 16'h0000;
reg [15:0] fifo_in;
wire write_enable;
wire [15:0] fifo_out;
wire fifo_empty;
wire fifo_aempty;
wire Full_o;
wire FifoHalfFull;
wire FifoFull;
wire fifo_rd_en_i;
async_fifo #(
.DSIZE(16),
.ASIZE($clog2(8192)), // 3 + (1982 * 4) = 7931 => at least 8K entries to buffer 4 lines during VSYNC
.FALLTHROUGH("FALSE")
) fifo (
.wclk(clk_data),
.wrst_n(hdmi_pll_lock),
.winc(write_enable),
.wdata(fifo_in),
.wfull(FifoFull),
.awfull(FifoHalfFull), //fixme
.rclk(clk_pixel),
.rrst_n(hdmi_pll_lock),
.rinc(fifo_rd_en_i),
.rdata(fifo_out),
.rempty(fifo_empty),
.arempty(fifo_aempty)
);
hsdaoh_core hsdaoh (
.rstn(hdmi_pll_lock),
.tmds_clk_n(tmds_clk_n),
.tmds_clk_p(tmds_clk_p),
.tmds_d_n(tmds_d_n),
.tmds_d_p(tmds_d_p),
.clk_pixel_x5(clk_pixel_x5),
.clk_pixel(clk_pixel),
.fifo_empty(fifo_empty),
.fifo_aempty(fifo_aempty),
.fifo_read_en(fifo_rd_en_i),
.data_in(fifo_out)
);
assign write_enable = 1'b1;
always @(posedge clk_data) begin
fifo_in <= counter[15:0];
counter <= counter + 1'b1;
end
endmodule

26
hsdaoh_nano4k_test.gprj Normal file
View file

@ -0,0 +1,26 @@
<?xml version="1" encoding="UTF-8"?>
<!DOCTYPE gowin-fpga-project>
<Project>
<Template>FPGA</Template>
<Version>5</Version>
<Device name="GW1NSR-4C" pn="GW1NSR-LV4CQN48PC6/I5">gw1nsr4c-000</Device>
<FileList>
<File path="common/async_fifo/async_fifo.v" type="file.verilog" enable="0"/>
<File path="common/async_fifo/fifomem.v" type="file.verilog" enable="0"/>
<File path="common/async_fifo/rptr_empty.v" type="file.verilog" enable="0"/>
<File path="common/async_fifo/sync_r2w.v" type="file.verilog" enable="0"/>
<File path="common/async_fifo/sync_w2r.v" type="file.verilog" enable="0"/>
<File path="common/async_fifo/wptr_full.v" type="file.verilog" enable="0"/>
<File path="common/hdmi/auxiliary_video_information_info_frame.v" type="file.verilog" enable="1"/>
<File path="common/hdmi/hdmi.v" type="file.verilog" enable="1"/>
<File path="common/hdmi/packet_assembler.v" type="file.verilog" enable="1"/>
<File path="common/hdmi/packet_picker.v" type="file.verilog" enable="1"/>
<File path="common/hdmi/serializer.v" type="file.verilog" enable="1"/>
<File path="common/hdmi/tmds_channel.v" type="file.verilog" enable="1"/>
<File path="common/hsdaoh/hsdaoh_core.v" type="file.verilog" enable="1"/>
<File path="hsdaoh_nano4k_test/fifo_hs/fifo_hs.v" type="file.verilog" enable="1"/>
<File path="hsdaoh_nano4k_test/top.v" type="file.verilog" enable="1"/>
<File path="hsdaoh_nano4k_test/hsdaoh_nano4k_test.cst" type="file.cst" enable="1"/>
<File path="hsdaoh_nano4k_test/hsdaoh_nano4k_test.sdc" type="file.sdc" enable="1"/>
</FileList>
</Project>

View file

@ -0,0 +1,35 @@
[General]
ipc_version=4
file=fifo_hs
module=FIFO_HS_Top
target_device=gw1nsr4c-000
type=fifo_hs
version=1.0
[Config]
AlmostEmptyFlag=true
AlmostEmptyFlagItem=Empty_Single Threshold Constant Parameter
AlmostFullFlag=false
AlmostFullFlagItem=Full_Single Threshold Constant Parameter
BSRAM=true
ControlledByRdEn=false
ECCSelected=false
EmptyClear=1
EmptySet=1
EnReset=false
FirstWordFallThrough=false
FullClear=1
FullSet=1
LANG=0
OutputRegistersSelected=false
REG=false
ReadDataNum=false
ReadDataWidth=16
ReadDepth=8192
ResetSynchronization=false
SSRAM=false
StandardFIFO=true
Synthesis_tool=GowinSynthesis
WriteDataNum=false
WriteDataWidth=16
WriteDepth=8192

View file

@ -0,0 +1,841 @@
//
//Written by GowinSynthesis
//Product Version "V1.9.9 Beta-4 Education"
//Tue Apr 30 20:19:43 2024
//Source file index table:
//file0 "\/home/miracle/Downloads/Gowin_V1.9.9Beta-4_Education/IDE/ipcore/FIFO_HS/data/fifo_hs.v"
//file1 "\/home/miracle/Downloads/Gowin_V1.9.9Beta-4_Education/IDE/ipcore/FIFO_HS/data/fifo_hs_top.v"
`pragma protect begin_protected
`pragma protect version="2.3"
`pragma protect author="default"
`pragma protect author_info="default"
`pragma protect encrypt_agent="GOWIN"
`pragma protect encrypt_agent_info="GOWIN Encrypt Version 2.3"
`pragma protect encoding=(enctype="base64", line_length=76, bytes=256)
`pragma protect key_keyowner="GOWIN",key_keyname="GWK2023-09",key_method="rsa"
`pragma protect key_block
VEph5u3aRUgSaPwsLzLqIKmeDSZVNdeBR/6deETr/c33teBjsHK70yIaDOGd0AHGCZgPD6os2FLK
rL7IWcTZ27w+IRzk9HAAuMdlG8Y8t10QED2nb/m1RLah2mNEwxizcochksfW8MtO8A/3gFV/Lz77
7iZoHhQTTZLe2LAFWNcNvmuYeSXmy6vz0MWa19M5dQrN7L8+/nWccZOF0mJBvoXD2TwZCiVqSmMr
pzZKuA5AoR3xsYnT64pATxM8TW4VW9BrJNIgmTWnhZR7yoehioLR6OputkAuoQiwPnEmh76OAf5k
LOcomW6jfNIGrU4ZCqewiKx8ZMp9I9xQtqASDA==
`pragma protect encoding=(enctype="base64", line_length=76, bytes=46176)
`pragma protect data_keyowner="default-ip-vendor"
`pragma protect data_keyname="default-ip-key"
`pragma protect data_method="aes128-cfb"
`pragma protect data_block
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
Mgic4/PD
`pragma protect end_protected

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,12 @@
IO_LOC "sys_resetn" 14;
IO_PORT "sys_resetn" PULL_MODE=UP;
IO_LOC "sys_clk" 45;
IO_PORT "sys_clk" IO_TYPE=LVCMOS33 PULL_MODE=UP;
IO_LOC "tmds_d_p[0]" 30,29;
IO_PORT "tmds_d_p[0]" PULL_MODE=NONE DRIVE=4;
IO_LOC "tmds_d_p[1]" 32,31;
IO_PORT "tmds_d_p[1]" PULL_MODE=NONE DRIVE=4;
IO_LOC "tmds_d_p[2]" 35,34;
IO_PORT "tmds_d_p[2]" PULL_MODE=NONE DRIVE=4;
IO_LOC "tmds_clk_p" 28,27;
IO_PORT "tmds_clk_p" PULL_MODE=NONE DRIVE=4;

View file

@ -0,0 +1 @@
create_clock -name sys_clk -period 37.04 [get_ports {sys_clk}] -add

176
hsdaoh_nano4k_test/top.v Normal file
View file

@ -0,0 +1,176 @@
// hsdaoh - High Speed Data Acquisition over HDMI
// Test top design for Tang Nano 4K
// Copyright (C) 2024 by Steve Markgraf <steve@steve-m.de>
// License: MIT
module top (
sys_clk,
sys_resetn,
tmds_clk_n,
tmds_clk_p,
tmds_d_n,
tmds_d_p
);
input sys_clk;
input sys_resetn;
output wire tmds_clk_n;
output wire tmds_clk_p;
output wire [2:0] tmds_d_n;
output wire [2:0] tmds_d_p;
wire [2:0] tmds;
wire clk_pixel;
wire clk_pixel_x5;
wire hdmi_pll_lock;
wire clk_data;
wire data_pll_lock;
// https://juj.github.io/gowin_fpga_code_generators/pll_calculator.html
// 345.6 MHz, maximum that works with my nano 4K
// 345.6/5 = 69.12 MHz
localparam HDMI_PLL_IDIV = 4;
localparam HDMI_PLL_FBDIV = 63;
localparam HDMI_PLL_ODIV = 2;
wire rst;
assign rst = ~sys_resetn;
// PLL for HDMI clock
PLLVR #(
.FCLKIN (27),
.IDIV_SEL (HDMI_PLL_IDIV),
.FBDIV_SEL (HDMI_PLL_FBDIV),
.ODIV_SEL (HDMI_PLL_ODIV),
.DEVICE ("GW1NSR-4C")
) hdmi_pll (
.CLKIN(sys_clk),
.CLKFB(1'b0),
.RESET(rst),
.RESET_P(1'b0),
.FBDSEL(6'b0),
.IDSEL(6'b0),
.ODSEL(6'b0),
.DUTYDA(4'b0),
.PSDA(4'b0),
.FDLY(4'b0),
.CLKOUT(clk_pixel_x5),
.LOCK(hdmi_pll_lock),
.CLKOUTP(),
.CLKOUTD(),
.CLKOUTD3(),
.VREN(1'b1)
);
CLKDIV #(
.DIV_MODE(5),
.GSREN("false")
) div_5 (
.CLKOUT(clk_pixel),
.HCLKIN(clk_pixel_x5),
.RESETN(hdmi_pll_lock),
.CALIB(1'b0)
);
// 59.4 MHz (4/10/16) data clock (with proprietary, encrypted FIFO)
localparam DATA_PLL_IDIV = 4;
localparam DATA_PLL_FBDIV = 10;
localparam DATA_PLL_ODIV = 16;
// PLL for data clock
PLLVR #(
.FCLKIN (27),
.IDIV_SEL (DATA_PLL_IDIV),
.FBDIV_SEL (DATA_PLL_FBDIV),
.ODIV_SEL (DATA_PLL_ODIV),
.DEVICE ("GW1NSR-4C")
) data_pll (
.CLKIN (sys_clk),
.CLKFB (1'b0),
.RESET (rst),
.RESET_P (1'b0),
.FBDSEL (6'b0),
.IDSEL (6'b0),
.ODSEL (6'b0),
.DUTYDA (4'b0),
.PSDA (4'b0),
.FDLY (4'b0),
.CLKOUT (clk_data),
.LOCK (data_pll_lock),
.CLKOUTP (),
.CLKOUTD (),
.CLKOUTD3 (),
.VREN (1'b1)
);
reg [15:0] counter = 16'h0000;
reg [15:0] fifo_in;
wire write_enable;
wire [15:0] fifo_out;
wire fifo_empty;
wire fifo_aempty;
wire Full_o;
wire FifoHalfFull;
wire FifoFull;
wire fifo_rd_en_i;
/*
async_fifo #(
.DSIZE(16),
.ASIZE($clog2(8192*2)), // 3 + (1982 * 4) = 7931 => at least 8K entries to buffer 4 lines during VSYNC
.FALLTHROUGH("FALSE")
) fifo (
.wclk(clk_data),
.wrst_n(hdmi_pll_lock),
.winc(write_enable),
.wdata(fifo_in),
.wfull(FifoFull),
.awfull(FifoHalfFull), //fixme
.rclk(clk_pixel),
.rrst_n(hdmi_pll_lock),
.rinc(fifo_rd_en_i),
.rdata(fifo_out),
.rempty(fifo_empty),
.arempty(fifo_aempty)
);
*/
FIFO_HS_Top fifo(
.Data(fifo_in), //input [0:0] Data
.WrClk(clk_data), //input WrClk
.RdClk(clk_pixel), //input RdClk
.WrEn(write_enable), //input WrEn
.RdEn(fifo_rd_en_i), //input RdEn
.Almost_Empty(fifo_aempty), //output Almost_Empty
.Q(fifo_out), //output [0:0] Q
.Empty(fifo_empty), //output Empty
.Full(FifoFull) //output Full
);
hsdaoh_core hsdaoh (
.rstn(hdmi_pll_lock),
.tmds_clk_n(tmds_clk_n),
.tmds_clk_p(tmds_clk_p),
.tmds_d_n(tmds_d_n),
.tmds_d_p(tmds_d_p),
.clk_pixel_x5(clk_pixel_x5),
.clk_pixel(clk_pixel),
.fifo_empty(fifo_empty),
.fifo_aempty(fifo_aempty),
.fifo_read_en(fifo_rd_en_i),
.data_in(fifo_out)
);
assign write_enable = 1'b1;
always @(posedge clk_data) begin
fifo_in <= counter[15:0];
counter <= counter + 1'b1;
end
endmodule

26
hsdaoh_nano9k_test.gprj Normal file
View file

@ -0,0 +1,26 @@
<?xml version="1" encoding="UTF-8"?>
<!DOCTYPE gowin-fpga-project>
<Project>
<Template>FPGA</Template>
<Version>5</Version>
<Device name="GW1NR-9C" pn="GW1NR-LV9QN88PC6/I5">gw1nr9c-004</Device>
<FileList>
<File path="common/async_fifo/async_fifo.v" type="file.verilog" enable="0"/>
<File path="common/async_fifo/fifomem.v" type="file.verilog" enable="0"/>
<File path="common/async_fifo/rptr_empty.v" type="file.verilog" enable="0"/>
<File path="common/async_fifo/sync_r2w.v" type="file.verilog" enable="0"/>
<File path="common/async_fifo/sync_w2r.v" type="file.verilog" enable="0"/>
<File path="common/async_fifo/wptr_full.v" type="file.verilog" enable="0"/>
<File path="common/hdmi/auxiliary_video_information_info_frame.v" type="file.verilog" enable="1"/>
<File path="common/hdmi/hdmi.v" type="file.verilog" enable="1"/>
<File path="common/hdmi/packet_assembler.v" type="file.verilog" enable="1"/>
<File path="common/hdmi/packet_picker.v" type="file.verilog" enable="1"/>
<File path="common/hdmi/serializer.v" type="file.verilog" enable="1"/>
<File path="common/hdmi/tmds_channel.v" type="file.verilog" enable="1"/>
<File path="common/hsdaoh/hsdaoh_core.v" type="file.verilog" enable="1"/>
<File path="hsdaoh_nano9k_test/fifo_hs/fifo_hs.v" type="file.verilog" enable="1"/>
<File path="hsdaoh_nano9k_test/top.v" type="file.verilog" enable="1"/>
<File path="hsdaoh_nano9k_test/hsdaoh_nano9k_test.cst" type="file.cst" enable="1"/>
<File path="hsdaoh_nano9k_test/hsdaoh_nano9k_test.sdc" type="file.sdc" enable="1"/>
</FileList>
</Project>

View file

@ -0,0 +1,35 @@
[General]
ipc_version=4
file=fifo_hs
module=FIFO_HS_Top
target_device=gw1nr9c-004
type=fifo_hs
version=1.0
[Config]
AlmostEmptyFlag=true
AlmostEmptyFlagItem=Empty_Single Threshold Constant Parameter
AlmostFullFlag=false
AlmostFullFlagItem=Full_Single Threshold Constant Parameter
BSRAM=true
ControlledByRdEn=false
ECCSelected=false
EmptyClear=1
EmptySet=1
EnReset=false
FirstWordFallThrough=false
FullClear=1
FullSet=1
LANG=0
OutputRegistersSelected=false
REG=false
ReadDataNum=false
ReadDataWidth=16
ReadDepth=8192
ResetSynchronization=false
SSRAM=false
StandardFIFO=true
Synthesis_tool=GowinSynthesis
WriteDataNum=false
WriteDataWidth=16
WriteDepth=8192

View file

@ -0,0 +1,811 @@
//
//Written by GowinSynthesis
//Product Version "V1.9.9 Beta-4 Education"
//Tue Apr 30 01:00:04 2024
//Source file index table:
//file0 "\/home/miracle/Downloads/Gowin_V1.9.9Beta-4_Education/IDE/ipcore/FIFO_HS/data/fifo_hs.v"
//file1 "\/home/miracle/Downloads/Gowin_V1.9.9Beta-4_Education/IDE/ipcore/FIFO_HS/data/fifo_hs_top.v"
`pragma protect begin_protected
`pragma protect version="2.3"
`pragma protect author="default"
`pragma protect author_info="default"
`pragma protect encrypt_agent="GOWIN"
`pragma protect encrypt_agent_info="GOWIN Encrypt Version 2.3"
`pragma protect encoding=(enctype="base64", line_length=76, bytes=256)
`pragma protect key_keyowner="GOWIN",key_keyname="GWK2023-09",key_method="rsa"
`pragma protect key_block
cFD6mgVY1usg3+48x9owyCEr+bdaJ29++StKKKabGFKo4aHUuJA3v9bgkwKAsDNUzhGfEEBDqjav
0sIOyrvvg5a9bc1Au6EWitkoSHP477PR2uwW3+Nqofiw9de9t4V3CZUOjGpf7i0h6U+2idzYnr2p
wu2lcZ1yLsYPtI3SZf+/8B8QTApNO+GKJhhUaKzqoxQmvycd8zu2mNnlTrgQynv+VcjDr7NuIgPy
CXYlOjz7YYND/4VvllKEqzYC+cOZF1/QLn/IBZWo88COe2r1HnWc4TvBUNA8Pmctj7AY/55YPKbX
CIE40q7O2knfx5yGqXnQsl1AJdeAMJs41TBAhQ==
`pragma protect encoding=(enctype="base64", line_length=76, bytes=44512)
`pragma protect data_keyowner="default-ip-vendor"
`pragma protect data_keyname="default-ip-key"
`pragma protect data_method="aes128-cfb"
`pragma protect data_block
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
`pragma protect end_protected

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,12 @@
IO_LOC "sys_resetn" 4;
IO_PORT "sys_resetn" PULL_MODE=UP;
IO_LOC "sys_clk" 52;
IO_PORT "sys_clk" IO_TYPE=LVCMOS33 PULL_MODE=UP;
IO_LOC "tmds_d_p[0]" 71,70;
IO_PORT "tmds_d_p[0]" PULL_MODE=NONE DRIVE=8;
IO_LOC "tmds_d_p[1]" 73,72;
IO_PORT "tmds_d_p[1]" PULL_MODE=NONE DRIVE=8;
IO_LOC "tmds_d_p[2]" 75,74;
IO_PORT "tmds_d_p[2]" PULL_MODE=NONE DRIVE=8;
IO_LOC "tmds_clk_p" 69,68;
IO_PORT "tmds_clk_p" PULL_MODE=NONE DRIVE=8;

View file

@ -0,0 +1 @@
create_clock -name sys_clk -period 37.04 [get_ports {sys_clk}] -add

172
hsdaoh_nano9k_test/top.v Normal file
View file

@ -0,0 +1,172 @@
// hsdaoh - High Speed Data Acquisition over HDMI
// Test top design for Tang Nano 9K
// Copyright (C) 2024 by Steve Markgraf <steve@steve-m.de>
// License: MIT
module top (
sys_clk,
sys_resetn,
tmds_clk_n,
tmds_clk_p,
tmds_d_n,
tmds_d_p
);
input sys_clk;
input sys_resetn;
output wire tmds_clk_n;
output wire tmds_clk_p;
output wire [2:0] tmds_d_n;
output wire [2:0] tmds_d_p;
wire [2:0] tmds;
wire clk_pixel;
wire clk_pixel_x5;
wire hdmi_pll_lock;
wire clk_data;
wire data_pll_lock;
// https://juj.github.io/gowin_fpga_code_generators/pll_calculator.html
// 337.5 MHz, maximum that works with my nano 9K
// 337.5/5 = 67.5 MHz
localparam HDMI_PLL_IDIV = 1;
localparam HDMI_PLL_FBDIV = 24;
localparam HDMI_PLL_ODIV = 2;
// PLL for HDMI clock
rPLL #(
.FCLKIN (27),
.IDIV_SEL (HDMI_PLL_IDIV),
.FBDIV_SEL (HDMI_PLL_FBDIV),
.ODIV_SEL (HDMI_PLL_ODIV),
.DEVICE ("GW1NR-9C")
) hdmi_pll (
.CLKIN(sys_clk),
.CLKFB(1'b0),
.RESET(1'b0),
.RESET_P(1'b0),
.FBDSEL(6'b0),
.IDSEL(6'b0),
.ODSEL(6'b0),
.DUTYDA(4'b0),
.PSDA(4'b0),
.FDLY(4'b0),
.CLKOUT(clk_pixel_x5),
.LOCK(hdmi_pll_lock),
.CLKOUTP(),
.CLKOUTD(),
.CLKOUTD3()
);
CLKDIV #(
.DIV_MODE(5),
.GSREN("false")
) div_5 (
.CLKOUT(clk_pixel),
.HCLKIN(clk_pixel_x5),
.RESETN(hdmi_pll_lock),
.CALIB(1'b0)
);
// 40.5 MHz (1/2/16) is maximum that works with 'open source' fifo
// 51 MHz (8/16/8) data clock (with proprietary, encrypted FIFO)
localparam DATA_PLL_IDIV = 8;
localparam DATA_PLL_FBDIV = 16;
localparam DATA_PLL_ODIV = 8;
// PLL for data clock
rPLL #(
.FCLKIN (27),
.IDIV_SEL (DATA_PLL_IDIV),
.FBDIV_SEL (DATA_PLL_FBDIV),
.ODIV_SEL (DATA_PLL_ODIV),
.DEVICE ("GW1NR-9C")
) data_pll (
.CLKIN (sys_clk),
.CLKFB (1'b0),
.RESET (rst),
.RESET_P (1'b0),
.FBDSEL (6'b0),
.IDSEL (6'b0),
.ODSEL (6'b0),
.DUTYDA (4'b0),
.PSDA (4'b0),
.FDLY (4'b0),
.CLKOUT (clk_data),
.LOCK (data_pll_lock),
.CLKOUTP (),
.CLKOUTD (),
.CLKOUTD3 ()
);
reg [15:0] counter = 16'h0000;
reg [15:0] fifo_in;
wire write_enable;
wire [15:0] fifo_out;
wire fifo_empty;
wire fifo_aempty;
wire Full_o;
wire FifoHalfFull;
wire FifoFull;
wire fifo_rd_en_i;
/*
async_fifo #(
.DSIZE(16),
.ASIZE($clog2(8192*2)), // 3 + (1982 * 4) = 7931 => at least 8K entries to buffer 4 lines during VSYNC
.FALLTHROUGH("FALSE")
) fifo (
.wclk(clk_data),
.wrst_n(hdmi_pll_lock),
.winc(write_enable),
.wdata(fifo_in),
.wfull(FifoFull),
.awfull(FifoHalfFull), //fixme
.rclk(clk_pixel),
.rrst_n(hdmi_pll_lock),
.rinc(fifo_rd_en_i),
.rdata(fifo_out),
.rempty(fifo_empty),
.arempty(fifo_aempty)
);
*/
FIFO_HS_Top fifo(
.Data(fifo_in), //input [0:0] Data
.WrClk(clk_data), //input WrClk
.RdClk(clk_pixel), //input RdClk
.WrEn(write_enable), //input WrEn
.RdEn(fifo_rd_en_i), //input RdEn
.Almost_Empty(fifo_aempty), //output Almost_Empty
.Q(fifo_out), //output [0:0] Q
.Empty(fifo_empty), //output Empty
.Full(FifoFull) //output Full
);
hsdaoh_core hsdaoh (
.rstn(hdmi_pll_lock),
.tmds_clk_n(tmds_clk_n),
.tmds_clk_p(tmds_clk_p),
.tmds_d_n(tmds_d_n),
.tmds_d_p(tmds_d_p),
.clk_pixel_x5(clk_pixel_x5),
.clk_pixel(clk_pixel),
.fifo_empty(fifo_empty),
.fifo_aempty(fifo_aempty),
.fifo_read_en(fifo_rd_en_i),
.data_in(fifo_out)
);
assign write_enable = 1'b1;
always @(posedge clk_data) begin
fifo_in <= counter[15:0];
counter <= counter + 1'b1;
end
endmodule

View file

@ -0,0 +1,25 @@
<?xml version="1" encoding="UTF-8"?>
<!DOCTYPE gowin-fpga-project>
<Project>
<Template>FPGA</Template>
<Version>5</Version>
<Device name="GW2A-18C" pn="GW2A-LV18PG256C8/I7">gw2a18c-011</Device>
<FileList>
<File path="common/async_fifo/async_fifo.v" type="file.verilog" enable="1"/>
<File path="common/async_fifo/fifomem.v" type="file.verilog" enable="1"/>
<File path="common/async_fifo/rptr_empty.v" type="file.verilog" enable="1"/>
<File path="common/async_fifo/sync_r2w.v" type="file.verilog" enable="1"/>
<File path="common/async_fifo/sync_w2r.v" type="file.verilog" enable="1"/>
<File path="common/async_fifo/wptr_full.v" type="file.verilog" enable="1"/>
<File path="common/hdmi/auxiliary_video_information_info_frame.v" type="file.verilog" enable="1"/>
<File path="common/hdmi/hdmi.v" type="file.verilog" enable="1"/>
<File path="common/hdmi/packet_assembler.v" type="file.verilog" enable="1"/>
<File path="common/hdmi/packet_picker.v" type="file.verilog" enable="1"/>
<File path="common/hdmi/serializer.v" type="file.verilog" enable="1"/>
<File path="common/hdmi/tmds_channel.v" type="file.verilog" enable="1"/>
<File path="common/hsdaoh/hsdaoh_core.v" type="file.verilog" enable="1"/>
<File path="hsdaoh_primer20k_test/top.v" type="file.verilog" enable="1"/>
<File path="hsdaoh_primer20k_test/hsdaoh_primer20k_test.cst" type="file.cst" enable="1"/>
<File path="hsdaoh_primer20k_test/hsdaoh_primer20k_test.sdc" type="file.sdc" enable="1"/>
</FileList>
</Project>

View file

@ -0,0 +1,13 @@
IO_LOC "sys_resetn" T10;
IO_PORT "sys_resetn" IO_TYPE=LVCMOS33 PULL_MODE=UP;
IO_LOC "sys_clk" H11;
//IO_PORT "sys_clk" IO_TYPE=LVCMOS33 PULL_MODE=UP;
IO_PORT "sys_clk" PULL_MODE=UP;
IO_LOC "tmds_d_p[0]" H14,H16;
IO_PORT "tmds_d_p[0]" PULL_MODE=NONE DRIVE=8;
IO_LOC "tmds_d_p[1]" J15,K16;
IO_PORT "tmds_d_p[1]" PULL_MODE=NONE DRIVE=8;
IO_LOC "tmds_d_p[2]" K14,K15;
IO_PORT "tmds_d_p[2]" PULL_MODE=NONE DRIVE=8;
IO_LOC "tmds_clk_p" G16,H15;
IO_PORT "tmds_clk_p" PULL_MODE=NONE DRIVE=8;

View file

@ -0,0 +1,2 @@
create_clock -name sys_clk -period 37.04 [get_ports {sys_clk}] -add
//create_clock -name adc_clkout -period 12.3 [get_ports {adc_clkout}] -add

157
hsdaoh_primer20k_test/top.v Normal file
View file

@ -0,0 +1,157 @@
// hsdaoh - High Speed Data Acquisition over HDMI
// Test top design for Tang Primer 20K
// Copyright (C) 2024 by Steve Markgraf <steve@steve-m.de>
// License: MIT
module top (
sys_clk,
sys_resetn,
enable,
tmds_clk_n,
tmds_clk_p,
tmds_d_n,
tmds_d_p
);
input sys_clk;
input sys_resetn;
input wire enable;
output wire tmds_clk_n;
output wire tmds_clk_p;
output wire [2:0] tmds_d_n;
output wire [2:0] tmds_d_p;
wire [2:0] tmds;
wire clk_pixel;
wire clk_pixel_x5;
wire hdmi_pll_lock;
wire clk_data;
wire data_pll_lock;
// 477 MHz, maximum that works with the primer 20K
// 477/5 = 95.4 MHz
localparam HDMI_PLL_IDIV = 2;
localparam HDMI_PLL_FBDIV = 52;
localparam HDMI_PLL_ODIV = 2;
// PLL for HDMI clock
rPLL #(
.FCLKIN (27),
.IDIV_SEL (HDMI_PLL_IDIV),
.FBDIV_SEL (HDMI_PLL_FBDIV),
.ODIV_SEL (HDMI_PLL_ODIV),
.DEVICE ("GW2A-18C")
) hdmi_pll (
.CLKIN(sys_clk),
.CLKFB(1'b0),
.RESET(1'b0),
.RESET_P(1'b0),
.FBDSEL(6'b0),
.IDSEL(6'b0),
.ODSEL(6'b0),
.DUTYDA(4'b0),
.PSDA(4'b0),
.FDLY(4'b0),
.CLKOUT(clk_pixel_x5),
.LOCK(hdmi_pll_lock),
.CLKOUTP(),
.CLKOUTD(),
.CLKOUTD3()
);
CLKDIV #(
.DIV_MODE(5),
.GSREN("false")
) div_5 (
.CLKOUT(clk_pixel),
.HCLKIN(clk_pixel_x5),
.RESETN(hdmi_pll_lock),
.CALIB(1'b0)
);
// 91.8 MHz clock for data
localparam DATA_PLL_IDIV = 4;
localparam DATA_PLL_FBDIV = 16;
localparam DATA_PLL_ODIV = 8;
// PLL for data clock
rPLL #(
.FCLKIN (27),
.IDIV_SEL (DATA_PLL_IDIV),
.FBDIV_SEL (DATA_PLL_FBDIV),
.ODIV_SEL (DATA_PLL_ODIV),
.DEVICE ("GW2A-18C")
) data_pll (
.CLKIN (sys_clk),
.CLKFB (1'b0),
.RESET (rst),
.RESET_P (1'b0),
.FBDSEL (6'b0),
.IDSEL (6'b0),
.ODSEL (6'b0),
.DUTYDA (4'b0),
.PSDA (4'b0),
.FDLY (4'b0),
.CLKOUT (clk_data),
.LOCK (data_pll_lock),
.CLKOUTP (),
.CLKOUTD (),
.CLKOUTD3 ()
);
reg [15:0] counter = 16'h0000;
reg [15:0] fifo_in;
wire write_enable;
wire [15:0] fifo_out;
wire fifo_empty;
wire fifo_aempty;
wire Full_o;
wire FifoHalfFull;
wire FifoFull;
wire fifo_rd_en_i;
async_fifo #(
.DSIZE(16),
.ASIZE($clog2(16384)), // 3 + (1982 * 4) = 7931 => at least 8K entries to buffer 4 lines during VSYNC
.FALLTHROUGH("FALSE")
) fifo (
.wclk(clk_data),
.wrst_n(hdmi_pll_lock),
.winc(write_enable),
.wdata(fifo_in),
.wfull(FifoFull),
.awfull(FifoHalfFull), //fixme
.rclk(clk_pixel),
.rrst_n(hdmi_pll_lock),
.rinc(fifo_rd_en_i),
.rdata(fifo_out),
.rempty(fifo_empty),
.arempty(fifo_aempty)
);
hsdaoh_core hsdaoh (
.rstn(hdmi_pll_lock),
.tmds_clk_n(tmds_clk_n),
.tmds_clk_p(tmds_clk_p),
.tmds_d_n(tmds_d_n),
.tmds_d_p(tmds_d_p),
.clk_pixel_x5(clk_pixel_x5),
.clk_pixel(clk_pixel),
.fifo_empty(fifo_empty),
.fifo_aempty(fifo_aempty),
.fifo_read_en(fifo_rd_en_i),
.data_in(fifo_out)
);
assign write_enable = 1'b1;
always @(posedge clk_data) begin
fifo_in <= counter[15:0];
counter <= counter + 1'b1;
end
endmodule

View file

@ -0,0 +1,25 @@
<?xml version="1" encoding="UTF-8"?>
<!DOCTYPE gowin-fpga-project>
<Project>
<Template>FPGA</Template>
<Version>5</Version>
<Device name="GW5A-25A" pn="GW5A-LV25MG121NC1/I0">gw5a25a-002</Device>
<FileList>
<File path="common/async_fifo/async_fifo.v" type="file.verilog" enable="1"/>
<File path="common/async_fifo/fifomem.v" type="file.verilog" enable="1"/>
<File path="common/async_fifo/rptr_empty.v" type="file.verilog" enable="1"/>
<File path="common/async_fifo/sync_r2w.v" type="file.verilog" enable="1"/>
<File path="common/async_fifo/sync_w2r.v" type="file.verilog" enable="1"/>
<File path="common/async_fifo/wptr_full.v" type="file.verilog" enable="1"/>
<File path="common/hdmi/auxiliary_video_information_info_frame.v" type="file.verilog" enable="1"/>
<File path="common/hdmi/hdmi.v" type="file.verilog" enable="1"/>
<File path="common/hdmi/packet_assembler.v" type="file.verilog" enable="1"/>
<File path="common/hdmi/packet_picker.v" type="file.verilog" enable="1"/>
<File path="common/hdmi/serializer.v" type="file.verilog" enable="1"/>
<File path="common/hdmi/tmds_channel.v" type="file.verilog" enable="1"/>
<File path="common/hsdaoh/hsdaoh_core.v" type="file.verilog" enable="1"/>
<File path="hsdaoh_primer25k_test/top.v" type="file.verilog" enable="1"/>
<File path="hsdaoh_primer25k_test/hsdaoh_primer25k_test.cst" type="file.cst" enable="1"/>
<File path="hsdaoh_primer25k_test/hsdaoh_primer25k_test.sdc" type="file.sdc" enable="1"/>
</FileList>
</Project>

View file

@ -0,0 +1,15 @@
IO_LOC "sys_resetn" H11;
IO_PORT "sys_resetn" IO_TYPE=LVCMOS33 PULL_MODE=DOWN DRIVE=OFF BANK_VCCIO=3.3;
// middle PMOD connector for HDMI
IO_LOC "tmds_clk_p" L5,K5;
IO_PORT "tmds_clk_p" IO_TYPE=LVCMOS33D PULL_MODE=NONE DRIVE=8 BANK_VCCIO=3.3;
IO_LOC "tmds_d_p[0]" K11,L11;
IO_PORT "tmds_d_p[0]" IO_TYPE=LVCMOS33D PULL_MODE=NONE DRIVE=8 BANK_VCCIO=3.3;
IO_LOC "tmds_d_p[1]" E11,E10;
IO_PORT "tmds_d_p[1]" IO_TYPE=LVCMOS33D PULL_MODE=NONE DRIVE=8 BANK_VCCIO=3.3;
IO_LOC "tmds_d_p[2]" A11,A10;
IO_PORT "tmds_d_p[2]" IO_TYPE=LVCMOS33D PULL_MODE=NONE DRIVE=8 BANK_VCCIO=3.3;
IO_LOC "sys_clk" E2;
IO_PORT "sys_clk" IO_TYPE=LVCMOS33 PULL_MODE=NONE DRIVE=OFF BANK_VCCIO=3.3;

View file

@ -0,0 +1 @@
create_clock -name sys_clk -period 20 [get_ports {sys_clk}] -add

195
hsdaoh_primer25k_test/top.v Normal file
View file

@ -0,0 +1,195 @@
// hsdaoh - High Speed Data Acquisition over HDMI
// Test top design for Tang Primer 25K
// Copyright (C) 2024 by Steve Markgraf <steve@steve-m.de>
// License: MIT
module top (
sys_clk,
sys_resetn,
tmds_clk_n,
tmds_clk_p,
tmds_d_n,
tmds_d_p
);
input sys_clk;
input sys_resetn;
output wire tmds_clk_n;
output wire tmds_clk_p;
output wire [2:0] tmds_d_n;
output wire [2:0] tmds_d_p;
wire [2:0] tmds;
wire clk_pixel;
wire clk_pixel_x5;
wire pll_lock;
wire clk_data;
// 475 MHz, maximum that works with the primer 25K
// 475/5 = 95 MHz
// Data PLL output is 89.0625 MHz
PLLA #(
.FCLKIN ("50"),
.IDIV_SEL (2),
.FBDIV_SEL (1),
.CLKFB_SEL ("INTERNAL"),
.ODIV0_SEL (3),
.ODIV0_FRAC_SEL (0),
.ODIV1_SEL (16),
.ODIV2_SEL (8),
.ODIV3_SEL (8),
.ODIV4_SEL (8),
.ODIV5_SEL (8),
.ODIV6_SEL (8),
.MDIV_SEL (57),
.MDIV_FRAC_SEL (0),
.CLKOUT0_EN ("TRUE"),
.CLKOUT1_EN ("TRUE"),
.CLKOUT2_EN ("FALSE"),
.CLKOUT3_EN ("FALSE"),
.CLKOUT4_EN ("FALSE"),
.CLKOUT5_EN ("FALSE"),
.CLKOUT6_EN ("FALSE"),
.CLKOUT0_DT_DIR (1'b1),
.CLKOUT0_DT_DIR (1'b1),
.CLKOUT1_DT_DIR (1'b1),
.CLKOUT2_DT_DIR (1'b1),
.CLKOUT3_DT_DIR (1'b1),
.CLK0_IN_SEL (1'b0),
.CLK0_OUT_SEL (1'b0),
.CLK1_IN_SEL (1'b0),
.CLK1_OUT_SEL (1'b0),
.CLK2_IN_SEL (1'b0),
.CLK2_OUT_SEL (1'b0),
.CLK3_IN_SEL (1'b0),
.CLK3_OUT_SEL (1'b0),
.CLK4_IN_SEL (2'b00),
.CLK4_OUT_SEL (1'b0),
.CLK5_IN_SEL (1'b0),
.CLK5_OUT_SEL (1'b0),
.CLK6_IN_SEL (1'b0),
.CLK6_OUT_SEL (1'b0),
.CLKOUT0_PE_COARSE (0),
.CLKOUT0_PE_FINE (0),
.CLKOUT1_PE_COARSE (0),
.CLKOUT1_PE_FINE (0),
.CLKOUT2_PE_COARSE (0),
.CLKOUT2_PE_FINE (0),
.CLKOUT3_PE_COARSE (0),
.CLKOUT3_PE_FINE (0),
.CLKOUT4_PE_COARSE (0),
.CLKOUT4_PE_FINE (0),
.CLKOUT5_PE_COARSE (0),
.CLKOUT5_PE_FINE (0),
.CLKOUT6_PE_COARSE (0),
.CLKOUT6_PE_FINE (0),
.DE0_EN ("FALSE"),
.DE1_EN ("FALSE"),
.DE2_EN ("FALSE"),
.DE3_EN ("FALSE"),
.DE4_EN ("FALSE"),
.DE5_EN ("FALSE"),
.DE6_EN ("FALSE"),
.DYN_DPA_EN ("FALSE"),
.DYN_PE0_SEL ("FALSE"),
.DYN_PE1_SEL ("FALSE"),
.DYN_PE2_SEL ("FALSE"),
.DYN_PE3_SEL ("FALSE"),
.DYN_PE4_SEL ("FALSE"),
.DYN_PE5_SEL ("FALSE"),
.DYN_PE6_SEL ("FALSE"),
.RESET_I_EN ("FALSE"),
.RESET_O_EN ("FALSE"),
.ICP_SEL (6'bXXXXXX),
.LPF_RES (3'bXXX),
.LPF_CAP (2'b00),
.SSC_EN ("FALSE"),
.CLKOUT0_DT_STEP (0),
.CLKOUT1_DT_STEP (0),
.CLKOUT2_DT_STEP (0),
.CLKOUT3_DT_STEP (0)
) pll (
.LOCK(pll_lock),
.CLKOUT0(clk_pixel_x5),
.CLKOUT1(clk_data),
.CLKIN(sys_clk),
.CLKFB(1'b0),
.RESET(1'b0),
.PLLPWD(1'b0),
.RESET_I(1'b0),
.RESET_O(1'b0),
.PSSEL(3'b0),
.PSDIR(1'b0),
.PSPULSE(1'b0),
.SSCPOL(1'b0),
.SSCON(1'b0),
.SSCMDSEL(7'b0),
.SSCMDSEL_FRAC(3'b0),
.MDCLK(1'b0),
.MDOPC(2'b0),
.MDAINC(1'b0),
.MDWDI(8'b0)
);
CLKDIV #(
.DIV_MODE(5)
) div_5 (
.CLKOUT(clk_pixel),
.HCLKIN(clk_pixel_x5),
.RESETN(1'b1),
.CALIB(1'b0)
);
reg [15:0] counter = 16'h0000;
reg [15:0] fifo_in;
wire write_enable;
wire [15:0] fifo_out;
wire fifo_empty;
wire fifo_aempty;
wire Full_o;
wire FifoHalfFull;
wire FifoFull;
wire fifo_rd_en_i;
async_fifo #(
.DSIZE(16),
.ASIZE($clog2(16384)), // 3 + (1982 * 4) = 7931 => at least 8K entries to buffer 4 lines during VSYNC
.FALLTHROUGH("FALSE")
) fifo (
.wclk(clk_data),
.wrst_n(pll_lock),
.winc(write_enable),
.wdata(fifo_in),
.wfull(FifoFull),
.awfull(FifoHalfFull),
.rclk(clk_pixel),
.rrst_n(pll_lock),
.rinc(fifo_rd_en_i),
.rdata(fifo_out),
.rempty(fifo_empty),
.arempty(fifo_aempty)
);
hsdaoh_core hsdaoh (
.rstn(pll_lock),
.tmds_clk_n(tmds_clk_n),
.tmds_clk_p(tmds_clk_p),
.tmds_d_n(tmds_d_n),
.tmds_d_p(tmds_d_p),
.clk_pixel_x5(clk_pixel_x5),
.clk_pixel(clk_pixel),
.fifo_empty(fifo_empty),
.fifo_aempty(fifo_aempty),
.fifo_read_en(fifo_rd_en_i),
.data_in(fifo_out)
);
assign write_enable = 1'b1;
always @(posedge clk_data) begin
fifo_in <= counter[15:0];
counter <= counter + 1'b1;
end
endmodule