Forum: FPGA, VHDL & Co. Verilog VGA-Text , 80x30 umgesetzt für das DE1.


von peter (Gast)


Angehängte Dateien:

Lesenswert?

Hallo, guten Tag.

Ich habe hier ein VGA-Text 80x30(Verilog) der von Micha stammt 
,umgesetzt auf dem DE1-Board. Im Test lasse ich den Bildschirm immer 
wieder neu beschreiben.
Die Datei Screen.hex ist der Inhalt der Angezeigt wird.
Es ist ein Charrom und ein Screenram vorhanden.

Diesen Screen im RAM beschreibe ich in einer Schleife immer wieder neu.
Die Schleife habe ich ausgebremst, sonst kann man es wegen der hohen 
Geschindigkeit nicht sehen.

Am Ende 80. Zeichen(rechte Rand), kann man die letzten 2 Pixelreihen 
nicht erkennen, sind abgeschnitten. Am linken Rand scheint es so, als 
wenn man das VGA-Bild noch nach rechts verschieben könnte vom Programm 
aus.
Bloss ich finde kein Anfang, an welcher Zeitschraube ich da drehen kann.

Wer kann an den Zeiten im Programm etwas drehen??

Anderes Thema:
Im VHDL kenne ich mich nicht so aus.
Es müsste auch zu VHDL umsetzbar sein?

Danke.
Gruss

Im Anhang ist ein Set den man  compilieren kann.
1
`include "rom.v"
2
`include "ram.v"
3
4
module vga_text(
5
 input  clock,      
6
 output hsync,
7
 output vsync,
8
 output reg[3:0] red,
9
 output reg [3:0] green,
10
 output reg [3:0] blue
11
);
12
13
wire clk;
14
wire [7:0] char;
15
wire [7:0] dat;
16
wire [9:0] charLin;
17
18
wire h_enable;
19
wire v_enable;
20
wire vid_enable;
21
22
reg [16:0] qc;
23
reg [32:0] cnt;
24
reg  Pixel;
25
reg [9:0]  CounterX; // 10 Bit, range 0..799
26
reg [9:0]  CounterY; //  10 Bit, range 0..524
27
reg [11:0] Basis;    // Adr. Zeilenanfang
28
reg [6:0]  Offs;     // Pos. in Zeile 
29
reg [11:0] ZPos;     // effektive Zeichenpos. in BWS  
30
reg [11:0] write_address;    
31
reg [7:0] dat_w;
32
reg we;
33
34
rom myRom (.addr_a(charLin), .clk(clk), .q_a(dat));   // Zeichensatz
35
ram myRam (.q(char), .read_address(ZPos), .clk(clk),.write_address(write_address), .d(dat_w),.we(we)); // Bildspeicher
36
37
wire CounterXmaxed = (CounterX==800);
38
wire CounterYmaxed = (CounterY==525);
39
40
always @(posedge clock)
41
begin
42
  if (cnt <= 10000)
43
    cnt = cnt + 1;
44
  else
45
  begin
46
    cnt =0; 
47
    we=1;
48
    
49
    write_address=write_address+1;    
50
    dat_w=dat_w+1;
51
    
52
    if (write_address==2399)
53
      write_address=0;
54
    if (dat_w==255)
55
      dat_w=0;    
56
  end  
57
end
58
 
59
always @(posedge clock)
60
begin
61
  qc <= qc + 1;
62
end
63
// 50Mhz  2^1 = 25MHz
64
assign clk = qc[0];
65
66
always @(posedge clk) begin 
67
// Zählen in horizontaler Richtung
68
  if(CounterXmaxed)
69
    CounterX <= 0;
70
  else begin 
71
    CounterX <= CounterX + 1;
72
    if (dat & (1 << CounterX[2:0])) 
73
      Pixel <= 1;
74
    else 
75
      Pixel <= 0;
76
  end
77
78
// Zählen in vertikaler Richtung
79
  if(CounterXmaxed) begin 
80
    if (CounterYmaxed) CounterY <= 0;
81
  else CounterY <= CounterY + 1;
82
  end
83
84
  if (CounterX[2:0] == 0) begin
85
    if (CounterX == 0 && CounterY == 0) Basis <= 0;
86
    else if (CounterX == 0 && CounterY[3:0]==0) Basis <= Basis + 80;
87
  end
88
  
89
  Offs <= CounterX[9:3];
90
  ZPos <= Basis + Offs;
91
end
92
93
always @(posedge clk)
94
begin
95
  if (vid_enable==1 && Pixel == 0)
96
    begin
97
      red = 4'b1111;
98
      blue = 4'b1111;
99
      green = 4'b1111;
100
    end 
101
    else
102
    begin
103
      red = 4'b0000;
104
      blue = 4'b0000;
105
      green = 4'b0000;
106
    end 
107
end
108
109
assign hsync = (CounterX < 655) || (CounterX > 751);
110
assign vsync = (CounterY < 489) || (CounterY > 491);  
111
112
assign charLin = {char,CounterY[3:1]};  // Zeiger fuer Zeichensatz
113
114
// Filter für video enable ableiten
115
assign h_enable = (CounterX > 3 && CounterX < 640);
116
assign v_enable = (CounterY < 480);
117
assign vid_enable = h_enable && v_enable;
118
119
endmodule

von peter (Gast)


Lesenswert?

----------------------------------------
wenn man das VGA-Bild noch nach rechts verschieben könnte vom Programm
aus.
----------------------------------------


natürlich nach links...

Gruss

von peter (Gast)


Angehängte Dateien:

Lesenswert?

Im Anhang habe ich mal das Charset und den Screenram ferig übersetzt für 
ein hineincopieren in einem Array für VHDL als Textdatei falls man mal 
dieses Verilog in VHDL umsetzen möchte. Im Screen steht schon ein Text 
drin, der auch angezeigt wird.

Wenn man die screen.dat zb im Hexeditor "HXD" im 80 Zeilenmodus öffnet, 
kann man schön sehen wie der Text auch auf dem Monitor erscheint. Und 
diese Zellen kann man einfach neu beschreiben während des Betriebes.

Gruss

von Gustl B. (-gb-)


Lesenswert?

Klar geht das auch in VHDL, du beschreibst nämlich Hardware.

Zu dem Code:

Welcher Pixeltakt, welche Auflösung? Und dann guckst du ob die Zeiten 
von HSync und VSync stimmen, danach richtet der Monitor den sichtbaren 
Bereich aus.

Da der Code aber auch korrekt sein könnte (hab ich nicht überprüft), 
reicht vielleicht auch eine neue Kalibrierung des Monitors, das geht oft 
durch Drücken der "Auto" Taste.

-gb-

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Gustl Buheitel schrieb:
> Klar geht das auch in VHDL, du beschreibst nämlich Hardware
Ein Dejavu. Wie schrieb ich schon im 
Beitrag "Re: synchrones Ram-Modul imit Verilog."
>>> Denn eines ist klar: wenn es mit Verilog geht,
>>> dann geht es auch mit VHDL. Es ist ja die selbe Hardware!

: Bearbeitet durch Moderator
von peter (Gast)


Lesenswert?

Jup, danke.

Beim Autokalibrieren rückt der Screen nach links, aber auch der 
sichtbare Bereich...die fehlende Pixelreihe wird mitgezogen.

Gruss

von peter (Gast)


Lesenswert?

--------------------------
Beitrag "Re: synchrones Ram-Modul imit Verilog."
-------------------------

Mit den RAM/ROM-Modulen klappt es jetzt wunderbar über Componenten.

Gruss

von Robert (Gast)


Lesenswert?

peter schrieb:
> --------------------------
> Beitrag "Re: synchrones Ram-Modul imit Verilog."
> -------------------------

Es gibt so etwas, das nennt sich Kommentarfunktion!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.