Forum: FPGA, VHDL & Co. Integer in Logigwert umsetzen?


von peter (Gast)


Lesenswert?

Wie kann ich bitte dieses setzen counterx ="0000000001";
wenn es : signal Addr : integer range 0 to 800 :=800; ist

counterxmax <= "1" when counterx ="0000000001";

Danke.
Gruss

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


Lesenswert?

Welche Datentypen haben die ganzen angesprochenen Signale? Und was ist 
was und wird wofür verwendet?

von peter (Gast)


Lesenswert?

Hallo... das sind die Signale:

signal counterxmax : std_logic_vector (0 downto 0);
signal counterx : std_logic_vector (9 downto 0);
signal Addr : integer range 0 to 800 :=800;


counterxmax <= "1" when counterx =...addr...

Danke.Gruss

von Gustl B. (-gb-)


Lesenswert?

Wenn du jetzt noch schreibst was du machen willst dann können wir dir 
helfen. Du kannst da sehr viele Bedingungen formulieren aber je nach 
Anwendungsfall sind einige sinnlos. Also was soll das Ergebnis sein?

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


Lesenswert?

peter schrieb:
> signal counterxmax : std_logic_vector (0 downto 0);
Warum nimmst du da nicht einem einfachen std_logic?

Und wo ist jetzt nochmal das Problem?

von peter (Gast)


Lesenswert?

Weil ich später die bestimmten Bits wieder rausholen muss.

Quäle mich damit ab, unten das Verilog umzusetzen in Vhdl.
Für mich ist das Umsetzen ein Horror..., diese ganzen Umwandlungen.
Vielleicht ist das für Euch eine Leichtigkeit...?

Danke.
Gruss

1
module vga_text(
2
 input  clock,      
3
 output hsync,
4
 output vsync,
5
 output reg [3:0] red,
6
 output reg [3:0] green,
7
 output reg [3:0] blue
8
);
9
10
wire clk;
11
wire [7:0] char;
12
wire [7:0] dat;
13
wire [9:0] charLin;
14
15
wire CounterXmaxed;
16
wire CounterYmaxed;
17
wire h_enable;
18
wire v_enable;
19
wire vid_enable;
20
21
reg [16:0] qc;
22
reg  Pixel;
23
reg [9:0]  CounterX; // 10 Bit, range 0..799
24
reg [9:0]  CounterY; //  10 Bit, range 0..524
25
reg [11:0] Basis;    // Adr. Zeilenanfang
26
reg [6:0]  Offs;     // Pos. in Zeile 
27
reg [11:0] ZPos;     // effektive Zeichenpos. in BWS  
28
29
assign CounterXmaxed = (CounterX==800);
30
assign CounterYmaxed = (CounterY==525);
31
 
32
always @(posedge clock)
33
begin
34
  qc <= qc + 1;
35
end
36
// 50Mhz  2^1 = 25MHz
37
assign clk = qc[0];
38
39
always @(posedge clk) begin 
40
// Zählen in horizontaler Richtung
41
  if(CounterXmaxed)
42
    CounterX <= 0;
43
  else begin 
44
    CounterX <= CounterX + 1;
45
    if (dat & (1 << CounterX[2:0])) 
46
      Pixel <= 1;
47
    else 
48
      Pixel <= 0;
49
  end
50
51
// Zählen in vertikaler Richtung
52
  if(CounterXmaxed) begin 
53
    if (CounterYmaxed) CounterY <= 0;
54
  else CounterY <= CounterY + 1;
55
  end
56
57
  if (CounterX[2:0] == 0) begin
58
    if (CounterX == 0 && CounterY == 0) Basis <= 0;
59
    else if (CounterX == 0 && CounterY[3:0]==0) Basis <= Basis + 80;
60
  end
61
  
62
  Offs <= CounterX[9:3];
63
  ZPos <= Basis + Offs;
64
end
65
66
always @(posedge clk)
67
begin
68
  if (vid_enable==1 && Pixel == 1)
69
    begin
70
      red = 4'b1111;
71
      blue = 4'b1111;
72
      green = 4'b1111;
73
    end 
74
    else
75
    begin
76
      red = 4'b0000;
77
      blue = 4'b1111;
78
      green = 4'b0000;
79
    end 
80
end
81
82
assign hsync = (CounterX < 655) || (CounterX > 751);
83
assign vsync = (CounterY < 489) || (CounterY > 491);  
84
85
assign charLin = {char,CounterY[3:1]};  // Zeiger fuer Zeichensatz
86
87
// Filter für video enable ableiten
88
assign h_enable = (CounterX > 4 && CounterX < 640);
89
assign v_enable = (CounterY < 480);
90
assign vid_enable = h_enable && v_enable;
91
92
endmodule

von -gb- (Gast)


Lesenswert?

Ich kann dir da auch nicht helfen weil du zwar code postest, aber nicht 
beschreibst was wie seien oder funktionieren soll. Wie wäre es wenn du 
in ruhe VHDL lernst, das kostet etwas Zeit, aber dann kannst du deine 
Probleme auch selber Lösen, also ohne verilog anderer ohne eigenes 
Verständnis zu übersetzen.

von peter (Gast)


Lesenswert?

------------------------------------------
Ich kann dir da auch nicht helfen weil du zwar code postest, aber nicht
beschreibst was wie seien oder funktionieren soll. Wie wäre es wenn du
in ruhe VHDL lernst, das kostet etwas Zeit, aber dann kannst du deine
Probleme auch selber Lösen, also ohne verilog anderer ohne eigenes
Verständnis zu übersetzen.
------------------------------------------

Daran hat man sich schon die Zähne ausgebissen an dieser Textausgabe in 
VGA mit VHDL. Darum wollte ich es umsetzen. Aber diese Umwandlungen von 
int nach vec und wieder zurück usw ist eine Zumutung , so etwas kann man 
nicht in kurzer Zeit lernen. Ich bin kein Student mehr der das aus dem 
Hämdsärmeln schüttelt mit 65 Jahren, darum frage ich hier.

Danke.
Gruss

von peter (Gast)


Lesenswert?

Ps: Dieser Thread kann geschlossen werden bitte vom Mod.

Danke
Gruss

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


Lesenswert?

peter schrieb:
> reg [9:0]  CounterX; // 10 Bit, range 0..799
> ...
> assign CounterXmaxed = (CounterX==800);
Bei Verilog bekommst du die Umwandlung eines Vektors in eine Zahl 
(Vorzeichenlos oder Zweierkomplement?) ohne explizite Konvertierungen. 
Bei VHDL nimmst du am leichtesten einen Integer als Zähler und dann 
kannst du ebenfalls einfach mit klar leserlichen Integerzahlen 
hantieren.

peter schrieb:
> assign CounterXmaxed = (CounterX==800);
> ...
>   if(CounterXmaxed)
Das könntest du sicher auch in einer Zeile so schreiben:
  if(CounterX==800)

Und damit ist die Umsetzung in VHDL ein Leichtes. Wobei auch ich nicht 
verstehe, warum du mit Verilog UND VHDL rumhampelst. Mir reicht eine 
einzige Beschreibungssprache locker aus. Schreiben und Denken tue 
ich in VHDL, und Lesen und grob Verstehen kann ich Verilog auch...

peter schrieb:
> Daran hat man sich schon die Zähne ausgebissen an dieser Textausgabe in
> VGA mit VHDL. Darum wollte ich es umsetzen.
Ich noch nicht. Aber evtl. haben wir einen strengen Winter und ich ein 
paar Abende Zeit...
> Aber diese Umwandlungen von int nach vec und wieder zurück usw ist
> eine Zumutung , so etwas kann man nicht in kurzer Zeit lernen.
Das muss man eben einfach Üben. Und es gibt nur 4 
Konvertierungsfunktionen in der numeric_std. Da wird das ganz einfach:
http://www.lothar-miller.de/s9y/categories/16-Numeric_Std

peter schrieb:
> Ps: Dieser Thread kann geschlossen werden bitte vom Mod.
Peter, ein "Schließen" von Threads gibt es hier nicht. Geschlossen 
werden Threads nur, wenn Beleidigungen, Pöbeleien und Flamewares 
losgehen.

: Bearbeitet durch Moderator
von abc123 (Gast)


Lesenswert?

hier noch eine PDF wo die Umwandlungen von numeric_std und 
std_logic_arith verglichen werden. Mir hat diese PDF die Augen geöffnet, 
warum die numeric_std lib wirklich so gut ist! Ganz klare Regeln wie und 
weshalb man wie konvertieren und benutzen muss ;-)

http://www.synthworks.com/papers/vhdl_math_tricks_mapld_2003.pdf

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.