@@ -4,6 +4,7 @@ import chisel3._
44import chisel3 .util ._
55import _root_ .circt .stage .ChiselStage
66
7+ // 320x240
78class VGAController extends Module {
89 val H_VISIBLE = 640
910 val H_FRONT = 16
@@ -26,52 +27,55 @@ class VGAController extends Module {
2627 val vsync = Output (Bool ())
2728 val rgb = Output (UInt (12 .W ))
2829 val blanking = Output (Bool ())
29- val hPos = Output (UInt (10 .W ))
30- val vPos = Output (UInt (10 .W ))
3130 })
3231
33- val memory = SyncReadMem (1024 , UInt (32 .W ))
32+ val memory = SyncReadMem (320 * 240 , UInt (8 .W ))
3433
35- val hCount = RegInit (0 .U (10 .W ))
36- val vCount = RegInit (0 .U (10 .W ))
37-
38- val pixel = WireInit (0 .U (12 .W ))
39- pixel := memory.read(0 .U , true .B )
40-
4134 when(io.write) {
4235 memory.write(io.address, io.write_value)
4336 }
4437
45- when(hCount === (H_TOTAL - 1 ).U ) {
46- hCount := 0 .U
47-
48- when(vCount === (V_TOTAL - 1 ).U ) {
49- vCount := 0 .U
38+ val v_pos = RegInit (0 .U (10 .W ))
39+ val h_pos = RegInit (0 .U (10 .W ))
40+
41+ when(h_pos === (H_TOTAL - 1 ).U ) {
42+ v_pos := 0 .U
43+
44+ when(v_pos === (V_TOTAL - 1 ).U ) {
45+ h_pos := 0 .U
5046 }.otherwise {
51- vCount := vCount + 1 .U
47+ v_pos := v_pos + 1 .U
5248 }
5349 }.otherwise {
54- hCount := hCount + 1 .U
50+ h_pos := h_pos + 1 .U
5551 }
5652
5753 val hSyncStart = (H_VISIBLE + H_FRONT ).U
5854 val hSyncEnd = (H_VISIBLE + H_FRONT + H_SYNC ).U
5955 val vSyncStart = (V_VISIBLE + V_FRONT ).U
6056 val vSyncEnd = (V_VISIBLE + V_FRONT + V_SYNC ).U
6157
62- io.hsync := ! (hCount >= hSyncStart && hCount < hSyncEnd)
63- io.vsync := ! (vCount >= vSyncStart && vCount < vSyncEnd)
58+ io.hsync := ! (h_pos >= hSyncStart && h_pos < hSyncEnd)
59+ io.vsync := ! (v_pos >= vSyncStart && v_pos < vSyncEnd)
6460
65- val hActive = hCount < H_VISIBLE .U
66- val vActive = vCount < V_VISIBLE .U
61+ val hActive = v_pos < H_VISIBLE .U
62+ val vActive = h_pos < V_VISIBLE .U
6763 val active = hActive && vActive
6864
6965 io.blanking := ! active
70- io.hPos := hCount
71- io.vPos := vCount
66+
67+ val read_address = WireInit (0 .U (32 .W ))
68+
69+ when(! active) {
70+ read_address := 0 .U
71+ }.otherwise {
72+ read_address := h_pos * 320 .U + v_pos
73+ }
74+
75+ val color = memory.read(read_address, true .B )
76+ val pixel := color(7 , 5 ) ## color(5 ) ## color(4 , 2 ) ## color(2 ) ## color(1 , 0 ) ## color(0 ) ## color(0 )
7277
7378 io.rgb := Mux (active, pixel, 0 .U )
74- // io.rgb := Mux(active, 0b111111111111.U, 0.U)
7579}
7680
7781object VGAMain extends App {
0 commit comments