gateware

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README

commit 5a19e93f85d56653aa5c62c9ce906795e4c0abbb
parent b8e750af8434a0880e8b64c878b75586213c45ee
Author: Brian Swetland <swetland@frotz.net>
Date:   Thu,  6 Feb 2020 15:09:55 -0800

ulx3s-sdram: setup hdmi display output

Diffstat:
Mhdl/ulx3s-sdram.sv | 94+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------
Mhdl/ulx3s.lpf | 20++++++++++----------
Mproject/ulx3s-sdram.def | 3+++
3 files changed, 100 insertions(+), 17 deletions(-)

diff --git a/hdl/ulx3s-sdram.sv b/hdl/ulx3s-sdram.sv @@ -3,9 +3,12 @@ `default_nettype none +`define HAS_SDRAM + module top( input wire clk_25mhz, +`ifdef HAS_SDRAM output wire [7:0]led, output sdram_clk, @@ -17,24 +20,100 @@ module top( output sdram_cke, output sdram_cs_n, - output [1:0]sdram_dqm + output [1:0]sdram_dqm, +`endif + + output [3:0]gpdi_dn, + output [3:0]gpdi_dp // C R G B ); +`ifdef HAS_SDRAM assign sdram_cke = 1; assign sdram_cs_n = 0; assign sdram_dqm = 2'b00; +`endif wire clk25m = clk_25mhz; -wire clk100m; +`ifdef SLOWCLOCK +wire clk100m; pll_25_100 pll( .clk25m_in(clk25m), .clk100m_out(clk100m), .locked() ); - wire testclk = clk100m; +`else +wire clk125m; +wire clk250m; +pll_25_125_250 pll( + .clk25m_in(clk25m), + .clk125m_out(clk125m), + .clk250m_out(clk250m), + .locked() +); +wire testclk = clk125m; +`endif +wire r,g,b; + +wire [7:0]red = {8{r}}; +wire [7:0]grn = {8{g}}; +wire [7:0]blu = {8{b}}; + +wire active; +wire hsync; +wire vsync; + +dvi_backend dvi0 ( + .pixclk(clk25m), + .pixclk5x(clk125m), + .pin_dvi_dp(gpdi_dp), + .pin_dvi_dn(gpdi_dn), + .hsync(hsync), + .vsync(vsync), + .active(active), + .red(red), + .grn(grn), + .blu(blu) +); + +wire [15:0]info; +wire info_e; + +reg [10:0]waddr = 11'd0; +wire [10:0]waddr_next = (waddr == 11'd1199) ? 11'd0 : (waddr + 11'd1); +always_ff @(posedge testclk) begin + waddr <= (info_e) ? waddr_next : waddr; +end + +display #( + .BPP(1), + .RGB(1), + .WIDE(0), + .HEXMODE(1) + ) display0 ( + .clk(clk25m), + .red(r), + .grn(g), + .blu(b), + .hsync(hsync), + .vsync(vsync), + .active(active), + .frame(), + .wclk(testclk), +`ifdef HAS_SDRAM + .waddr({waddr,1'b0}), + .wdata(info), + .we(info_e) +`else + .waddr(0), + .wdata(16'h0), + .we(0) +`endif +); + +`ifdef HAS_SDRAM wire [24:0]rd_addr; wire [15:0]rd_data; wire [3:0]rd_len; @@ -72,8 +151,8 @@ testbench #( .wr_req(wr_req), .wr_ack(wr_ack), - .info(), - .info_e() + .info(info), + .info_e(info_e) ); sdram #( @@ -83,8 +162,8 @@ sdram #( .T_PWR_UP(25000), .T_RI(750), .T_RCD(3), - .CLK_SHIFT(0), - .CLK_DELAY(127) + .CLK_SHIFT(1), + .CLK_DELAY(0) ) sdram0 ( .clk(testclk), .reset(0), @@ -115,6 +194,7 @@ sdram #( .wr_req(wr_req), .wr_ack(wr_ack) ); +`endif endmodule diff --git a/hdl/ulx3s.lpf b/hdl/ulx3s.lpf @@ -309,16 +309,16 @@ LOCATE COMP "gpdi_ethn" SITE "B20"; # Ethernet - LOCATE COMP "gpdi_cec" SITE "A18"; LOCATE COMP "gpdi_sda" SITE "B19"; # I2C shared with RTC LOCATE COMP "gpdi_scl" SITE "E12"; # I2C shared with RTC C12->E12 -IOBUF PORT "gpdi_dp[0]" IO_TYPE=LVCMOS33D DRIVE=4; -IOBUF PORT "gpdi_dn[0]" IO_TYPE=LVCMOS33D DRIVE=4; -IOBUF PORT "gpdi_dp[1]" IO_TYPE=LVCMOS33D DRIVE=4; -IOBUF PORT "gpdi_dn[1]" IO_TYPE=LVCMOS33D DRIVE=4; -IOBUF PORT "gpdi_dp[2]" IO_TYPE=LVCMOS33D DRIVE=4; -IOBUF PORT "gpdi_dn[2]" IO_TYPE=LVCMOS33D DRIVE=4; -IOBUF PORT "gpdi_dp[3]" IO_TYPE=LVCMOS33D DRIVE=4; -IOBUF PORT "gpdi_dn[3]" IO_TYPE=LVCMOS33D DRIVE=4; -IOBUF PORT "gpdi_ethp" IO_TYPE=LVCMOS33D DRIVE=4; -IOBUF PORT "gpdi_ethn" IO_TYPE=LVCMOS33D DRIVE=4; +IOBUF PORT "gpdi_dp[0]" IO_TYPE=LVCMOS33; +IOBUF PORT "gpdi_dn[0]" IO_TYPE=LVCMOS33; +IOBUF PORT "gpdi_dp[1]" IO_TYPE=LVCMOS33; +IOBUF PORT "gpdi_dn[1]" IO_TYPE=LVCMOS33; +IOBUF PORT "gpdi_dp[2]" IO_TYPE=LVCMOS33; +IOBUF PORT "gpdi_dn[2]" IO_TYPE=LVCMOS33; +IOBUF PORT "gpdi_dp[3]" IO_TYPE=LVCMOS33; +IOBUF PORT "gpdi_dn[3]" IO_TYPE=LVCMOS33; +IOBUF PORT "gpdi_ethp" IO_TYPE=LVCMOS33; +IOBUF PORT "gpdi_ethn" IO_TYPE=LVCMOS33; IOBUF PORT "gpdi_cec" PULLMODE=UP IO_TYPE=LVCMOS33 DRIVE=4; IOBUF PORT "gpdi_sda" PULLMODE=UP IO_TYPE=LVCMOS33 DRIVE=4; IOBUF PORT "gpdi_scl" PULLMODE=UP IO_TYPE=LVCMOS33 DRIVE=4; diff --git a/project/ulx3s-sdram.def b/project/ulx3s-sdram.def @@ -2,8 +2,11 @@ PROJECT_TYPE := nextpnr-ecp5 PROJECT_SRCS := hdl/ulx3s-sdram.sv hdl/ulx3s.lpf PROJECT_SRCS += hdl/lattice/ecp5_pll_25_100.v +PROJECT_SRCS += hdl/lattice/ecp5_pll_25_125_250.v PROJECT_SRCS += hdl/sdram/memtest1.sv PROJECT_SRCS += hdl/sdram/sdram.sv hdl/sdram/sdram_glue_ecp5.sv PROJECT_SRCS += hdl/xorshift.sv +PROJECT_SRCS += hdl/display/display.sv hdl/display/display_timing.sv +PROJECT_SRCS += hdl/display/dvi-encoder.sv hdl/display/dvi-backend.sv PROJECT_NEXTPNR_OPTS := --85k --package CABGA381 --speed 6