Squelette du projet
This commit is contained in:
63
src/main/scala/projet/GeneSync.scala
Normal file
63
src/main/scala/projet/GeneSync.scala
Normal file
@@ -0,0 +1,63 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user