Forum: FPGA, VHDL & Co. VHDL ERROR 10028


von Elvir È. (elvir)


Lesenswert?

Hallo liebe Community

In der Schule "bauen" wir gerade an einer VGA-Ansteuerung für einen 
Monitor in der Auflösung von 800x640. Dazu müssen wir zuerst ein timing 
bauen damit sich das Board und der Monitor "verstehen" ich glaube ihr 
wisst da eh mehr als ich :-)

Ich habe folgendes Design geschrieben:
1
------------------------------------------------------------------------------------
2
--Design  : Altera DE0 Board
3
------------------------------------------------------------------------------------
4
5
library ieee;
6
use ieee.std_logic_1164.ALL;
7
use ieee.std_logic_arith.ALL;
8
use ieee.std_logic_unsigned.ALL;
9
10
use work.de0_const_pkg.ALL;
11
12
entity vga is
13
  port (
14
  RESET_n : in std_logic;
15
        CLK     : in std_logic;
16
  Hsync   : out std_logic;
17
  Vsync   : out std_logic
18
    );
19
end vga;
20
21
architecture rtl of vga is 
22
  type state_type is (ST_E, ST_B, ST_C, ST_D, ST_P, ST_Q, ST_R, ST_S);
23
  signal state : state_type;
24
  
25
  signal var_b : integer range 0 to 188;
26
  signal var_c : integer range 0 to 94;
27
  signal var_d : integer range 0 to 1528;
28
  signal var_e : integer range 0 to 49;
29
  
30
  signal var_p : integer range 0 to 3;
31
  signal var_q : integer range 0 to 51;
32
  signal var_r : integer range 0 to 762;
33
  signal var_s : integer range 0 to 17;
34
  
35
  
36
begin
37
38
H_Counter: process(RESET_n,CLK)
39
  --          ______________________          ________
40
  -- ________|        VIDEO         |________| VIDEO (next line)
41
  -- |-C-|----------D-----------|-E-|
42
43
  -- __   ______________________________   ___________
44
  -- |_|                              |_|
45
  -- |B|
46
  -- |---------------A----------------|
47
48
  -- B.. Hsync (Sync pulse lenght)
49
  -- C.. Back porch
50
  -- D.. Active video time
51
  -- E.. Front porch
52
  
53
  begin
54
    
55
    if(RESET_n = '0') then  
56
      
57
    elsif(CLK'event and CLK = '1') then
58
    
59
60
      case state is
61
62
        when ST_B =>
63
        Hsync <= '1';
64
        if (var_b < 188) then
65
          var_b <= (var_b +1);
66
        end if;
67
        state <= ST_C;
68
69
        when ST_C =>
70
        Hsync <= '0';  
71
        if (var_c < 94) then
72
          var_c <= (var_c +1);
73
        end if;
74
        state <= ST_D;
75
76
        when ST_D =>
77
        Hsync <= '0'; 
78
        if (var_d < 1528) then
79
          var_d <= (var_d +1);
80
        end if;
81
        state <= ST_E;
82
83
        when ST_E =>
84
        Hsync <= '0'; 
85
        if (var_e < 49) then
86
          var_e <= (var_e +1);
87
        end if;
88
        state <= ST_B;
89
        
90
        when others => null;
91
        
92
    end case;
93
    end if;
94
  end process H_Counter;
95
96
V_Counter: process(RESET_n,CLK)
97
  --           ______________________          ________
98
  --  ________|        VIDEO         |________|  VIDEO (next frame)
99
  --      |-Q-|----------R-----------|-S-|
100
101
  --  __   ______________________________   ___________
102
  --    |_|                              |_|
103
  --    |P|
104
  --    |---------------O----------------|
105
  
106
  -- P.. Vsync (Sync length)
107
  -- Q.. Back porch
108
  -- R.. Active video time
109
  -- S.. Front porch
110
111
  begin    
112
    if(RESET_n = '0') then  
113
      
114
    elsif(CLK'event and CLK = '1') then
115
    
116
    case state is
117
118
      when ST_P =>
119
      Vsync <= '1';
120
      if (var_p < 3) then
121
        var_p <= (var_p +1);
122
      end if;
123
      state <= ST_Q;
124
125
      when ST_Q =>
126
      Vsync <= '0';  
127
      if (var_q < 51) then
128
        var_q <= (var_q +1);
129
      end if;
130
      state <= ST_R;
131
132
      when ST_R =>
133
      Vsync <= '0';   
134
      if (var_r < 762) then
135
        var_r <= (var_r +1);
136
      end if;
137
      state <= ST_S;
138
139
      when ST_S =>
140
      Vsync <= '0'; 
141
      if (var_s < 17) then
142
        var_s <= (var_s +1);
143
      end if;
144
      state <= ST_P;
145
      
146
      when others => null;
147
148
    end case;
149
    end if;
150
  end process V_Counter;
151
end rtl;

Ich bekomme folgenden Fehler:
VHDL Error (10028): Can't resolve multiple constant drivers for net 
"state.ST_B" at timing.vhd
und das für jedes state

Woran liegt das? Ich bitte um Lösungsvorschläge.

Mit freundlichen Grüßen

: Bearbeitet durch Moderator
von Leonard Lebewohl (Gast)


Lesenswert?

1
   -- ...
2
   if RESET_n = '0' then
3
    --hier fehlenn die inits für state , vsync, etc.
4
    elsif (CLK'event and CLK = '1') then
5
    case state is
6
   -- ...

von Sigi (Gast)


Lesenswert?

Du verwendest für beide Prozesse (h_count,v_count)
das Signal "state", erlaubt ist aber max. ein Prozess.
Führe einfach "hstate" bzw. "vstate" ein.

von Leonard Lebewohl (Gast)


Lesenswert?

Ihr habt zwei statemachines die jeweils von einem process (H_counter 
resp V_counter)  getrieben werden, aber nur ein signal für den 
Zustandsvektor


1
  type state_type is (ST_E, ST_B, ST_C, ST_D, ST_P, ST_Q, ST_R, ST_S);
2
  signal state : state_type;


Meines Erachtens braucht ihre zwei signal + typdeklaration
1
  type state_h_type is (ST_E, ST_B, ST_C, ST_D);
2
  type state_v_type is   (ST_P, ST_Q, ST_R, ST_S);
3
4
  signal state_h : state_h_type;
5
  signal state_v : state_v_type;


Dann sind die processe entsprechend umzuschreiben, das die nur das 
zugeordnete state_h resp state_v setzen.

MfG

von Elvir È. (elvir)


Lesenswert?

Danke für die schnellen Antworten!

Ich habe das jetzt so gemacht:
1
  type state_type is (ST_E, ST_B, ST_C, ST_D, ST_P, ST_Q, ST_R, ST_S);
2
  signal hstate : state_type;
3
  signal vstate : state_type;

Das Kompilieren funktioniert schon fehlerfrei :-)

Mit freundlichen Grüßen

von Leonard Lebewohl (Gast)


Lesenswert?

Eure zähler var_? werden nie zurückgesetzt. Üblicherweise bauten man 
zwei zahler v_count und hcount und eine handvoll komperatoren die 
entsprechenden die datenausgange, vsync und hsync treiben und die beiden 
counter zurücksetzen.

Da gibt es hunderte FPGA-VGA-controller im netz, wo ihr nachschauen 
könnt.

von Elvir È. (elvir)


Lesenswert?

Danke für deine Antwort

Ich habe es so geschrieben, jedoch funktioniert es nicht:
1
when ST_B =>
2
        Hsync <= '1';
3
        if (var_b < 188) then
4
          var_b <= (var_b +1);
5
        end if;
6
        var_b <= '0';
7
        hstate <= ST_C;

Wie geht es richtig?

Mit freundlichen Grüßen

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


Lesenswert?

Elvir Ègalo schrieb:
> Ich habe es so geschrieben, jedoch funktioniert es nicht:
Ist jetzt Ratestunde, oder wie? WAS funktioniert nicht?


VHDL ist keine so implizite "Programmiersprache" wie z.B. C, wo man fast 
ungestraft alles auf alles abbilden kann (sogar einen Float auf einen 
Bool). VHDL hat eine sehr strenge Typverwaltung.
1
        var_b <= '0';
Du kannst dem Integer var_b nicht ein einzelnes Bit '0' zuweisen...


Elvir Ègalo schrieb:
> Wie geht es richtig?
Nimm statt der alten
1
use ieee.std_logic_arith.ALL;
2
use ieee.std_logic_unsigned.ALL;
besser die
1
use ieee.numeric_std
Siehe den Beitrag "IEEE.STD_LOGIC_ARITH.ALL obsolete"
Und dann merk dir die Konvertierungen und du hast ausgesorgt:
http://www.lothar-miller.de/s9y/categories/16-Numeric_Std

: Bearbeitet durch Moderator
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.