Forum: FPGA, VHDL & Co. Problem beim Auslesen eines internen Signals


von Torben (Gast)


Lesenswert?

Hi Leute,
ich habe mal wieder eine Frage und zwar dreht es sich diesmal um den 
unten aufgeführten Code.
Wieso kann ich vom internen Signal „set_FTime“ keine Daten auslesen?
Meine Vermutung ist, dass das Programm beim umsetzen des Programmcodes 
die betreffende Stelle rausoptimiert.
Wenn ich den Eingang „hwdata“ direkt den Ausgang „tmp_set_FTime“ 
zuweise, geht es.
Was ich bereits ausprobiert habe ist folgendes um das Problem zu 
umgehen:
Die Zuweisung des Wertes von „set_FTime“ nach „tmp_set_FTime“ außerhalb 
des Prozesses zu machen, bloß leider kam da keine sinnvolle Ausgabe 
raus. (Da wo eine „1“ stehen sollte stand ein „X“)
1
reset, phase, clk2 : std_logic;
2
zwsp : type_ zwsp;
3
haddr : std_logic_vector (1 downto 0);
4
5
schreiben: process (reset, phase, zwsp.haddr, clk2)
6
begin
7
   if (reset = '1') then
8
      set_CTime <= (others =>'0');
9
      set_FTime <=(others =>'0');
10
      tmp_set_FTime <=(others =>'0');
11
      reg_ctrl <= (others =>'0');
12
   elsif(clk2 = '1' and clk2'event) then
13
      if (zwsp.hwrite = '1' and phase = '1') then
14
         if (zwsp.haddr = "01") then
15
               set_CTime <= hwdata;
16
         elsif (zwsp.haddr = "10") then
17
               set_FTime <= hwdata (m-1 downto 0);
18
               tmp_set_FTime <= set_FTime;
19
         elsif (zwsp.haddr = "00") then
20
               reg_ctrl <= hwdata(o-1 downto 0);
21
         end if;
22
      end if;
23
   end if;
24
end process schreiben;

von Philip K. (plip)


Lesenswert?

Was meinst Du mit internem Signal?

Zu Deiner Sensitivity-List, da sollte nur reset und clk drin stehen.

von Torben (Gast)


Lesenswert?

Hi,
mit meinem internen Signal meine ich in etwa ein Zwischenregister. Ich 
bekomme den Wert in der ersten Periode (Ende), speichere sich dann 
zwischen und in der zweiten Periode (Anfang) gebe ich Sie weiter um 
wieder Platz zu haben, den nächsten Datenstrom zu empfangen.

von Gast (Gast)


Lesenswert?

Wenn das rausoptimieren deine Vermutung ist, dann poste doch bitte den 
kompletten Code.

von Torben (Gast)


Lesenswert?

Hier der Quellcode soweit ich bislang bin. Er ist noch nicht fertig und 
das eine oder andere funktioniert noch nicht ganz so wie es sollte, aber 
ich kann den Zähler starten, stoppen und auch auslesen.
1
-- Typ Board TEWS TCP630-10
2
-- Clock auf dem Board 200kHz - 166MHz
3
4
5
library ieee ;
6
use ieee.std_logic_1164.all;
7
use IEEE.std_logic_unsigned.all;
8
library GRLIB;
9
use grlib.amba.all;
10
11
ENTITY register_rtc IS
12
    generic(n: natural :=32;
13
            m: natural :=16;
14
            o: natural :=8);
15
    PORT(clk, clk2, reset: in std_logic;
16
--         ahbso: out ahb_slv_out_type;
17
         hresp: out std_logic_vector(1 downto 0);
18
         hrdata: out std_logic_vector(31 downto 0);
19
         hready: out std_ulogic;
20
         
21
         tmp_set_FTime: out std_logic_vector(m-1 downto 0);  -- debug
22
         tmp_FTime: out std_logic_vector(m-1 downto 0);  -- debug
23
         tmp_reg_ctrl : out std_logic_vector (o-1 downto 0); -- debug
24
         tmp_ctr_haddr : out std_logic_vector (1 downto 0); -- debug
25
         tmp_haddr_zwsp : out std_logic_vector(1 downto 0); -- debug
26
         tmp_step1, tmp_step2, tmp_step3, tmp_step4, tmp_step5 : out std_logic; -- debug
27
         
28
--         ahbsi: in ahb_slv_in_type --(Sel, Trans, Addr, Write, Size, Burst, Prot, Ready)
29
         hsel: in std_logic_vector (0 to m-1);
30
         haddr: in std_logic_vector(31 downto 0);
31
         hwrite: in std_ulogic;
32
         htrans: in std_logic_vector(1 downto 0);
33
         hsize: in std_logic_vector(2 downto 0);
34
         hburst: in std_logic_vector(2 downto 0);
35
         hwdata: in std_logic_vector(31 downto 0);
36
         hprot: in std_logic_vector(3 downto 0)
37
         );
38
end register_rtc;
39
40
architecture behv of register_rtc is
41
42
type ctrl_type is record
43
   htrans : std_logic_vector (1 downto 0); 
44
   haddr : std_logic_vector (1 downto 0);
45
   hsize : std_logic_vector (2 downto 0); 
46
   hburst : std_logic_vector (2 downto 0);
47
   hprot : std_logic_vector (3 downto 0);
48
   hsel_rtc : std_logic_vector (0 to 15);
49
   hwrite : std_ulogic;
50
   hctrl : std_logic;
51
   hrdata : std_logic;
52
   hready : std_logic;
53
end record;
54
55
type zwsp_type is record
56
   htrans : std_logic_vector (1 downto 0); 
57
   haddr : std_logic_vector (1 downto 0);
58
   hsize : std_logic_vector (2 downto 0); 
59
   hburst : std_logic_vector (2 downto 0);
60
   hprot : std_logic_vector (3 downto 0);
61
   hwrite : std_ulogic;
62
end record;
63
64
signal Set_FTime, FTime: std_logic_vector(m-1 downto 0);
65
signal Set_CTime, CTime: std_logic_vector(n-1 downto 0);
66
signal Counter: std_logic_vector(o-1 downto 0);
67
signal reg_ctrl: std_logic_vector (o-1 downto 0); -- Controlregister
68
signal ctrl: ctrl_type;
69
signal zwsp: zwsp_type;
70
signal tmp_hrdata: std_logic_vector (n-1 downto 0);
71
signal speichern, gespeichert, phase, vormerker_ende, enduebertragung, readymerk, reset_signal: std_logic;
72
73
begin
74
75
76
connect: process(clk2, hsel, ctrl.hready)
77
begin
78
   if (reset = '1') then
79
      ctrl.hsel_rtc <= "0000000000000000";
80
   elsif (clk2 = '1' and clk2'event) then
81
      if (clk = '1') then
82
         if(hsel = "0000000000000001" and not ctrl.hready = '1') then
83
            ctrl.hsel_rtc <= "0000000000000001";
84
         else
85
            ctrl.hsel_rtc <= "0000000000000000";
86
         end if;
87
      end if;
88
   end if;
89
end process connect;
90
91
92
ctrl_p: process(clk2, ctrl.hsel_rtc, reset)
93
begin
94
   if (reset = '1') then
95
      ctrl.htrans <= (others =>'0');
96
      ctrl.hsize <= (others =>'0');
97
      ctrl.hburst <= (others =>'0');
98
      ctrl.haddr <= (others =>'0');
99
      ctrl.hwrite <= '0';
100
      ctrl.hctrl <= '0';
101
      speichern <= '0';
102
   elsif (clk2'event and clk2 = '0') then
103
      if(ctrl.hsel_rtc = "0000000000000001") then
104
         case htrans is
105
            when "01" => ctrl.htrans <= "01";
106
            when "10" => ctrl.htrans <= "10";
107
            when "11" => ctrl.htrans <= "11";
108
            when others => ctrl.htrans <= "00"; -- Statusmeldung und Fehlerbehandlung
109
         end case;
110
   
111
         case hsize is
112
            when "000" => ctrl.hsize <= "000";
113
            when "001" => ctrl.hsize <= "001";
114
            when "010" => ctrl.hsize <= "010"; -- Word 32-bit
115
            when "011" => ctrl.hsize <= "011";
116
            when "100" => ctrl.hsize <= "100";
117
            when others => ctrl.hsize <= "111";
118
         end case;
119
   
120
         case hburst is
121
            when "000" => ctrl.hburst <= "000"; -- single Mode
122
            when "001" => ctrl.hburst <= "001";
123
            when "010" => ctrl.hburst <= "010";
124
            when "011" => ctrl.hburst <= "011";
125
            when "100" => ctrl.hburst <= "100";
126
            when others => ctrl.hburst <= "111";
127
         end case;
128
   
129
         case haddr is
130
            when "00000000000000000000000000000000" => ctrl.haddr <= "00"; -- Controlregister
131
            when "00000000000000000000000000000001" => ctrl.haddr <= "01"; -- CTimeregister
132
            when "00000000000000000000000000000010" => ctrl.haddr <= "10"; -- FTimeregister
133
            when others => ctrl.haddr <= "11";
134
         end case;
135
   
136
         ctrl.hwrite <= hwrite;
137
         ctrl.hctrl <= '1';
138
         
139
--      case ahbsi.hprot is
140
--irgendwann mal anfangen zu implementieren
141
--      end case;
142
         
143
         if (gespeichert = '0') then
144
            speichern <= '1';
145
         else
146
            speichern <= '0';
147
         end if;
148
         
149
      end if;
150
   end if;
151
end process ctrl_p;
152
153
154
wert_zwsp: process (reset, ctrl.hsel_rtc, clk2)
155
begin
156
   if (reset = '1' or ((phase = '1') and (ctrl.hsel_rtc = "0000000000000001")) ) then
157
    zwsp.htrans <= (others =>'0');
158
    zwsp.hsize <= (others =>'0');
159
    zwsp.hburst <= (others =>'0');
160
    zwsp.haddr <= (others =>'0');
161
    zwsp.hwrite <= '0';
162
      gespeichert <= '0';
163
   elsif ((ctrl.hready = '0') and (hsel = "0000000000000001")) then
164
      if (clk2='1' and clk2'event) then
165
         if (speichern = '1') then
166
            zwsp.htrans <= ctrl.htrans;
167
            zwsp.hsize <= ctrl.hsize;
168
            zwsp.hburst <= ctrl.hburst;
169
            zwsp.haddr <= ctrl.haddr;
170
            zwsp.hwrite <= ctrl.hwrite;
171
            gespeichert <= '1';
172
         else
173
          gespeichert <= '0';
174
         end if;
175
      end if;
176
   end if;
177
end process wert_zwsp;
178
179
180
lesen: process(reset, hwrite, phase, reset_signal)
181
begin
182
   if ((reset = '1') or (reset_signal = '1')) then
183
      tmp_hrdata  <= (others =>'0');
184
      ctrl.hrdata <= '0';
185
   elsif (hwrite = '0' and phase = '1') then
186
      ctrl.hrdata <= '1';
187
      if (zwsp.haddr = "01") then
188
         tmp_hrdata <= CTime;
189
      elsif (zwsp.haddr = "10") then
190
         tmp_hrdata (15 downto 0) <= FTime;
191
         tmp_hrdata (n-1 downto 16) <= (others =>'0');
192
      elsif (zwsp.haddr = "00") then
193
         tmp_hrdata (o-1 downto 0) <= reg_ctrl;
194
         tmp_hrdata (n-1 downto o) <=(others =>'0');
195
      end if;
196
   end if;
197
end process lesen;
198
199
200
phasen: process (gespeichert, clk, reset_signal)
201
begin
202
   if (clk = '1' and clk'event) then
203
      if(gespeichert = '1' and not (reset_signal = '1')) then
204
         phase <= '1'; --Datenphase
205
      else
206
         phase <= '0'; --Adressphase
207
      end if;
208
   end if;
209
end process phasen;
210
211
212
ready: process (enduebertragung, readymerk)
213
begin
214
   if (reset = '1') or (enduebertragung = '1') then
215
      ctrl.hready <= '0';
216
   elsif (readymerk = '1') then
217
      ctrl.hready <= '1';
218
   end if;
219
end process ready;
220
221
222
start_ready: process (clk2, reset, Phase)
223
begin
224
   if (reset = '1') or (enduebertragung = '1') then
225
      readymerk <= '0';
226
   elsif ((clk2 = '1' and clk2'event) and (Phase = '1')) then
227
      readymerk <= '1';
228
   end if;
229
end process start_ready;
230
231
232
ende: process (clk, reset, vormerker_ende, reset_signal)
233
begin
234
   if ((reset = '1') or (reset_signal = '1')) then
235
      enduebertragung <= '0';
236
   elsif ((clk = '1' and clk'event) and (vormerker_ende = '1')) then
237
      enduebertragung <= '1';
238
   end if;
239
end process ende;
240
241
242
ruecksetzen: process (enduebertragung)
243
begin
244
      case enduebertragung is
245
         when '1' =>
246
            reset_signal <= '1';
247
         when others =>
248
            reset_signal <= '0';
249
      end case;
250
end process ruecksetzen;
251
252
253
response: process (clk, phase, reset_signal) -- noch zu Ergänzen
254
begin
255
   if ((reset = '1') or (reset_signal = '1')) then
256
      hresp <= "11"; --noch zu aendern
257
      vormerker_ende <= '0';
258
   elsif ((clk'event and clk = '0') and (phase = '1')) then
259
      hresp <= "00"; --Statusmeldung
260
      vormerker_ende <= '1';
261
   end if;
262
end process response;
263
264
265
schreiben: process (reset, clk2)
266
begin
267
   if (reset = '1') then
268
      set_CTime <= (others =>'0');
269
      set_FTime <=(others =>'0');
270
      tmp_set_FTime <=(others =>'0');
271
      reg_ctrl <= (others =>'0');
272
      tmp_step1 <= '0';
273
   elsif(clk2 = '1' and clk2'event) then
274
      if (zwsp.hwrite = '1' and phase = '1') then
275
         if (zwsp.haddr = "01") then
276
               set_CTime <= hwdata;
277
         elsif (zwsp.haddr = "10") then
278
               set_FTime <= hwdata (m-1 downto 0);
279
               tmp_set_FTime <= set_FTime;
280
               tmp_step1 <= '1';
281
         elsif (zwsp.haddr = "00") then
282
               reg_ctrl <= hwdata(o-1 downto 0);
283
         end if;
284
      end if;
285
   end if;
286
end process schreiben;
287
288
289
-- 200 kHz -> 0.005 ms  -> 1100 0111 fuer Counter
290
count: process(clk, reset)
291
begin
292
if (reset = '1') then
293
   FTime <= (others =>'0');
294
   CTime <= (others =>'0');
295
   Counter <= (others =>'0');
296
   tmp_FTime <= (others =>'0');
297
   tmp_step2 <= '0';
298
elsif (reg_ctrl(0) = '1') then
299
   FTime <= set_FTime;
300
   CTime <= set_CTime;
301
   Counter <=(others =>'0');
302
   tmp_step2 <= '1';
303
elsif (clk='1' and clk'event) then
304
   if (reg_ctrl = "00000010") then
305
      Counter <= Counter + 1;
306
      if Counter = "00000011" then
307
         FTime <= FTime + 1;
308
         tmp_FTime <= FTime; 
309
         Counter <=(others =>'0');
310
         if FTime = "0000000000000111" then
311
            CTime <= CTime + 1;
312
            FTime <= (others =>'0');
313
            Counter <= (others =>'0');
314
         end if;
315
      end if;
316
   end if;
317
end if;
318
end process count;
319
320
hready <= ctrl.hready;
321
hrdata <= tmp_hrdata;
322
323
tmp_reg_ctrl <= reg_ctrl;
324
tmp_haddr_zwsp <= zwsp.haddr;
325
end behv;

von Falk B. (falk)


Lesenswert?

@ Torben (Gast)

Netiquette!!!

Lange Quelltexte als Anhang!

MfG
Falk

von Rick Dangerus (Gast)


Lesenswert?

>      if(ctrl.hsel_rtc = "0000000000000001") then
>         case htrans is
>            when "01" => ctrl.htrans <= "01";

Kannst Du Dir für die langen (und kurzen) Bitfolgen nicht schöne 
Konstanten einfallen lassn?

Rick

von Torben (Gast)


Lesenswert?

@  Falk Brunner (falk)
okay, sry soll nicht wieder vorkommen

@  Rick Dangerus (Gast)
jo, kann ich aber zum Testen verwende ich erstmal die lange Version

von Gast (Gast)


Lesenswert?

Einige deiner Prozessbeschreibungen sind fehlerhaft. Zwar nicht auf 
VHDL-Sybtaxebene aber bei der Implementierung.
In getakteten Prozessen der Form
1
bla:process(clk, reset)
(und mehr kommt da auch nicht in die sensitivity list), darfst du nur 
auf reset und clk reagieren, wie folgt:
1
bla:process(clk, reset)
2
begin
3
if (reset='1') then
4
tu was
5
elsif (clk'event and clk='1') then
6
tu was (auch andere if anweisungen)
7
end process;

Das heisst, sowohl deine prozesse der Form
1
bla:process(clk, reset)
2
begin
3
if (reset='1') then
4
tu was
5
elsif ((clk'event and clk='1') and (irgendwas)) then
6
tu was (auch andere if anweisungen)
7
end process;
als auch
1
bla:process(clk, reset)
2
begin
3
if (reset='1') then
4
tu was
5
elsif(irgendwas) then
6
if (clk'event and clk='1') then
7
tu was (auch andere if anweisungen)
8
end process;
sind falsch (zumindest fuer FPGA-Beschreibungen). Das erstmal aendern 
und dann weiter sehen.

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Mit dem Code stimmt einiges nicht.

>   if (reset = '1') or (enduebertragung = '1') then
>      ctrl.hready <= '0';
>   elsif (readymerk = '1') then
>      ctrl.hready <= '1';
>   end if;

Was passiert wenn keiner der beiden Fälle zutrifft?

> elsif (clk='1' and clk'event) then

>   elsif (clk2 = '1' and clk2'event) then
>      if (clk = '1') then

Ein Signal ist entweder ein Takt, dann wird NUR die Taktflanke 
ausgewertet, oder ein Datensignal, dann wird der Zustand ausgewertet. 
Beides zu kombinieren führt ins Chaos.

Schau dir mal VHDL Grundregeln an. Nur wenn du die alle einhältst 
kann ein sauberes Design entstehen.

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.