Forum: FPGA, VHDL & Co. Wert auf "Clock" aufmodulieren?


von vhstarter (Gast)


Lesenswert?

Hi,

ich spiele mich gerade etwas mit VHDL herum und versuche den Wert 0xab 
mit einem Clock signal darzustellen, irgendwie funktioniert es aber 
leider nicht...
Ich bin blutiger Anfänger damit, könnte mir hier jemand einen Tipp geben 
wie ich damit weiterkomme?

clockout2 ist immer das Gleiche wie clockout
1
LIBRARY IEEE;
2
USE IEEE.STD_LOGIC_1164.ALL;
3
USE IEEE.STD_LOGIC_ARITH.ALL;
4
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
5
6
ENTITY simulator1 IS
7
    PORT(clock: IN STD_LOGIC;
8
         clockout: OUT STD_LOGIC;
9
         clockout2: OUT STD_LOGIC;
10
         valid: out STD_LOGIC;
11
         start: out STD_LOGIC;
12
         dclock: out STD_LOGIC;
13
14
         data: out STD_LOGIC);
15
END simulator1;
16
17
ARCHITECTURE behavior OF simulator1 IS
18
     signal num : STD_LOGIC_VECTOR(7 downto 0);
19
20
BEGIN
21
PROCESS(clock)
22
     VARIABLE cnt: integer range 0 to 100;
23
     VARIABLE cnt2: integer range 0 to 255;
24
     variable cnt3: integer range 0 to 1;
25
    variable cnt4: integer range 0 to 7;
26
     variable num2: integer range 0 to 255;
27
28
--     variable number: integer range 0 to 7;
29
     
30
     begin
31
     num <= x"ab"; 
32
         if rising_edge(clock) then
33
34
              cnt := cnt+1;
35
              
36
         end if;
37
               if (cnt = 50) then
38
                  cnt4 := cnt4+1;
39
               end if;
40
               
41
               if (cnt > 50) then
42
                  clockout <= '1';
43
                  
44
                  cnt3 := 1;
45
              else
46
                  cnt3 := 0;
47
                  clockout <= '0';
48
              end if;  
49
             
50
              if (cnt3 = 1) then
51
                  data <= num(cnt4);
52
              else
53
                  data <= '0';
54
              end if;
55
56
              clockout2 <= clock; 
57
END PROCESS;
58
END behavior;

von Peter (Gast)


Lesenswert?

Hallo,

ich bin zwar auch noch am Anfang, aber kann glaube ich dennoch einige 
Kommentare beisteuern:

Als erstes habe ich weder aus dem Code, noch aus deiner Beschreibung 
verstanden, was du eigentlich vorhast. Kannst du das irgendwie genauer 
formulieren? "clock aufmodulieren"?!

Dann zum Code: Du hast nach der Beschreibung des synchronen Teils deines 
Prozesses (zwischen if rising_edge und end if) noch weiteren Code. 
Dieser Teil der Beschreibung wird nicht synchron ausgeführt, d.h. ist 
unabhängig vom Takt!

Du verwendest auch ziemlich viele Variablen. Ich habe gelernt, diese nur 
im Notfall und gut überlegt zu verwenden, da die Semantik ziemlich 
schnell zu Latches führen kann. Ist dir die Semantik von Variablen 
bewusst? Also, wann der Wert aktualisiert wird und welche Folgen das für 
die Hardware hat?

Gruß

Peter

von vhstarter (Gast)


Lesenswert?

Hi,

dort steckt halt noch viel vom experimentieren drinnen, jetzt klappt es 
danke!

1
LIBRARY IEEE;
2
USE IEEE.STD_LOGIC_1164.ALL;
3
USE IEEE.STD_LOGIC_ARITH.ALL;
4
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
5
6
ENTITY simulator1 IS
7
    PORT(clock: IN STD_LOGIC;
8
         clockout: OUT STD_LOGIC;
9
         clockout2: OUT STD_LOGIC;
10
         valid: out STD_LOGIC;
11
         start: out STD_LOGIC;
12
         dclock: out STD_LOGIC;
13
--         signal num : std_logic_vector(7 downto 0);
14
         data: out STD_LOGIC);
15
END simulator1;
16
17
ARCHITECTURE behavior OF simulator1 IS
18
     signal num : STD_LOGIC_VECTOR(7 downto 0);
19
20
BEGIN
21
PROCESS(clock)
22
     VARIABLE cnt: integer range 0 to 100;
23
     VARIABLE cnt2: integer range 0 to 255;
24
     variable cnt3: integer range 0 to 1;
25
    variable cnt4: integer range 0 to 255;
26
     variable num2: integer range 0 to 255;
27
28
--     variable number: integer range 0 to 7;
29
     
30
     begin
31
     num <= x"47"; 
32
         if rising_edge(clock) then
33
34
              cnt := cnt+1;
35
              if (cnt = 50) then
36
               cnt4 := cnt4+1;
37
              end if;
38
               
39
               if (cnt > 50) then
40
                  clockout <= '1';
41
                  
42
                  cnt3 := 1;
43
              else
44
                  cnt3 := 0;
45
                  clockout <= '0';
46
              end if;  
47
             
48
49
         end if;
50
                  if (cnt3 = 1) then
51
                  data <= num(cnt4);
52
              else
53
                  data <= '0';
54
              end if;
55
END PROCESS;
56
END behavior;

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.