FPGA, VHDL & Co.
›
Thread
VHDL ERROR 10028
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
LL
Leonard Lebewohl
Gast
02.12.2013 13:55
#3428274
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 -- ...
S
Sigi
Gast
02.12.2013 13:58
#3428279
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.
LL
Leonard Lebewohl
Gast
02.12.2013 14:02
#3428284
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
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
LL
Leonard Lebewohl
Gast
02.12.2013 14:09
#3428299
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.
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
LM
Lothar M.
(lkmiller)
Moderator
(Firma: Titel)
Persönliche Seite
02.12.2013 15:58
#3428499
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.
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
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
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.
Noch kein Account?
Die Registrierung ist kostenlos und dauert nur eine Minute.
Jetzt registrieren