Verilog VGA-Text , 80x30 umgesetzt für das DE1.

Gast #3825810
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
Angehängte Dateien:
Gast #3825927
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
Angehängte Dateien:
#3826566
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-

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren