From 7eaad3ce177b3d7a3cc218d6fcfd0c4ed0506139 Mon Sep 17 00:00:00 2001 From: Sylvain Lefebvre Date: Sat, 13 Jul 2024 15:18:02 +0200 Subject: [PATCH] improved vga controller --- frameworks/boards/brot/board.json | 21 +++++++++++++++ projects/common/vga.si | 44 +++++++++++++++++++------------ 2 files changed, 48 insertions(+), 17 deletions(-) diff --git a/frameworks/boards/brot/board.json b/frameworks/boards/brot/board.json index cea20448..36bae746 100644 --- a/frameworks/boards/brot/board.json +++ b/frameworks/boards/brot/board.json @@ -67,6 +67,27 @@ {"cmd" : "dfu-suffix", "args" : "-v 1d50 -p 6146 -a build.dfu"}, {"cmd" : "dfu-util", "args" : "-a 0 -D build.dfu"} ] + }, + { + "name": "edalize_no_abc9", + "builder" : "edalize", + "description": "Build using Edalize", + "tool": "icestorm", + "tool_options": [ + { + "icepack_options": ["-s"], + "yosys_synth_options": ["-dsp","-device u","-top top"], + "nextpnr_options": ["--up5k", "--freq 12", "--package sg48", "-r", "--opt-timing"], + "pnr": "next" + } + ], + "bitstream" : "build.bin", + "constraints": [{"name": "brot.pcf", "file_type": "PCF"}], + "program": [ + {"cmd" : "cp", "args" : "build.bin build.dfu"}, + {"cmd" : "dfu-suffix", "args" : "-v 1d50 -p 6146 -a build.dfu"}, + {"cmd" : "dfu-util", "args" : "-a 0 -D build.dfu"} + ] } ] } diff --git a/projects/common/vga.si b/projects/common/vga.si index 1df85ed1..84515061 100644 --- a/projects/common/vga.si +++ b/projects/common/vga.si @@ -86,31 +86,41 @@ $$VS_END = V_FRT_PORCH + V_SYNCH $$VA_START = V_FRT_PORCH + V_SYNCH + V_BCK_PORCH $$V_END = V_FRT_PORCH + V_SYNCH + V_BCK_PORCH + V_RES - uint12 xcount(0); - uint11 ycount(0); + int13 xcount(0); + int12 ycount(0); - uint12 pix_x <:: (xcount - $HA_START$); - uint11 pix_y <:: (ycount - $VA_START$); + uint1 active_h(0); + uint1 active_v(0); - uint1 active_h <:: (xcount >= $HA_START$ && xcount < $H_END$); - uint1 active_v <:: (ycount >= $VA_START$ && ycount < $VA_START + VGA_VA_END$); + always { - active := active_h && active_v; + active_h = xcount == 0 ? 1 + : xcount == $H_END-HA_START$ ? 0 + : active_h; + active_v = ycount == 0 ? 1 + : ycount == $VGA_VA_END$ ? 0 + : active_v; - vga_hs := ~((xcount >= $HS_START$ && xcount < $HS_END$)); - vga_vs := ~((ycount >= $VS_START$ && ycount < $VS_END$)); + // __display("%d %d h:%b v:%b",xcount,ycount,active_h,active_v); - vblank := (ycount < $VA_START$); + active = active_h && active_v; - always { + vga_x = active_h ? xcount : 0; + vga_y = active_v ? ycount : 0; + + vga_hs = xcount == $HS_START-HA_START$ ? 0 + : xcount == $HS_END-HA_START-1$ ? 1 + : vga_hs; + vga_vs = ycount == $VS_START-VA_START$ ? 0 + : ycount == $VS_END-VA_START-1$ ? 1 + : vga_vs; - vga_x = active_h ? pix_x : 0; - vga_y = active_v ? pix_y : 0; + vblank = ycount[11,1]; // sign bit - if (xcount == $H_END-1$) { - xcount = 0; - if (ycount == $V_END-1$) { - ycount = 0; + if (xcount == $H_END-HA_START$) { + xcount = __signed($-HA_START+1$); + if (ycount == $V_END-VA_START$) { + ycount = __signed($-VA_START+1$); } else { ycount = ycount + 1; }