64 lines
2.3 KiB
Scala
64 lines
2.3 KiB
Scala
package projet
|
|
import chisel3._
|
|
|
|
class GeneSync extends Module {
|
|
val io = IO(new Bundle {
|
|
val hsync = Output(Bool())
|
|
val vsync = Output(Bool())
|
|
val img = Output(Bool())
|
|
val x = Output(UInt(10.W))
|
|
val y = Output(UInt(9.W))
|
|
})
|
|
|
|
// Paramètres de synchronisation horizontale et verticale
|
|
val synchroX = VecInit(Seq(
|
|
95.U, // HS pulse width
|
|
47.U, // horizontal back porch
|
|
639.U, // horizontal display time
|
|
15.U // horizontal front porch
|
|
))
|
|
|
|
val synchroY = VecInit(Seq(
|
|
1.U, // VS pulse width
|
|
28.U, // vertical back porch
|
|
479.U, // vertical display time
|
|
9.U // vertical front porch
|
|
))
|
|
|
|
// Instanciation des compteurs
|
|
val compteurCLK = Module(new Compteur(3, hasMax = true)) // Compteur horloge (3 bits)
|
|
val comptX = Module(new Compteur(10, hasEnable = true, hasMax = true)) // Compteur horizontal (10 bits)
|
|
val comptY = Module(new Compteur(9, hasEnable = true, hasMax = true)) // Compteur vertical (9 bits)
|
|
val phaseH = Module(new Compteur(2, hasEnable = true)) // Phases horizontales (2 bits)
|
|
val phaseV = Module(new Compteur(2, hasEnable = true)) // Phases verticales (2 bits)
|
|
|
|
// Signaux d'activation
|
|
val en25 = compteurCLK.io.atMax.get // Activation à 25MHz quand compteurCLK atteint 4
|
|
val enPhaseH = en25 && comptX.io.atMax.get
|
|
val enY = enPhaseH && phaseH.io.out === 3.U // Nouvelle ligne
|
|
|
|
// Configuration compteur CLK (divise 125MHz par 5 pour avoir 25MHz)
|
|
compteurCLK.io.max.get := 4.U
|
|
|
|
// Configuration compteur X (horizontal)
|
|
comptX.io.en.get := en25
|
|
comptX.io.max.get := synchroX(phaseH.io.out)
|
|
|
|
// Configuration compteur Y (vertical)
|
|
comptY.io.en.get := enY
|
|
comptY.io.max.get := synchroY(phaseV.io.out)
|
|
|
|
// Configuration compteurs de phases
|
|
phaseH.io.en.get := enPhaseH
|
|
phaseV.io.en.get := enY && comptY.io.atMax.get
|
|
|
|
// Génération des signaux de sortie
|
|
io.hsync := phaseH.io.out.orR // true si phaseH != 0 (pas en phase pulse)
|
|
io.vsync := phaseV.io.out.orR // true si phaseV != 0 (pas en phase pulse)
|
|
io.img := (phaseH.io.out === 2.U) && (phaseV.io.out === 2.U) // Zone d'affichage
|
|
|
|
// Coordonnées pixel
|
|
io.x := comptX.io.out
|
|
io.y := comptY.io.out
|
|
}
|