VHDL reset std_logic_vector

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • matthijs33
  • Registratie: Oktober 2010
  • Laatst online: 07:41
Ik wil met een Basys2 fpga een TLC5940NT IC aansturen. Daarvoor gebruik ik de data kanalen uit de fpga die ik met vhdl probeer te programmeren. (ik heb weinig ervaring met vhdl)

Nu heb ik een probleem met mijn code. een std_logic_vector moet terug op 0 gezet worden maar dit lijkt niet te werken.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.all;

entity Main is
    Port ( CLK: in std_logic;
            BUTTON: in std_logic;
            SIN : out  STD_LOGIC;
           SCLK : out  STD_LOGIC;
           XLAT : out  STD_LOGIC;
           BLANK : out  STD_LOGIC);
end Main;

architecture Behavioral of Main is
    signal counter: std_logic_vector(13 downto 0) := "00000000000000";
    signal prescaler: std_logic_vector(1 downto 0) := "00";
    signal ISIN, ISCLK, IXLAT, IBLANK : std_logic;
    signal program : std_logic := '1';
        
begin

counterProcess: process(CLK)
    begin
        if rising_edge(CLK) then
            if prescaler < "10" then
                prescaler <= prescaler +1;
            else
                prescaler <= (others => '0');
                if program ='1' then -----------------programmeren--------------------------
                    if counter = "00000000000000" then
                        ISIN <='0'; ISCLK <='0'; IXLAT <='0'; IBLANK <='0';
                    elsif counter = "00000000000001" then
                        ISIN <= '1';
                    elsif counter = "00000110000100" then
                        IBLANK <= '1';
                    elsif counter = "00000110000101" then
                        IXLAT <= '1';
                    elsif counter = "00000110000110" then
                        IXLAT <= '0';
                    elsif counter = "00000110000111" then
                        IBLANK <= '0';
                    elsif counter = "00000110001000" then
                        program <= '0';
                         counter <= (others => '0');-----------------------------------<-- dit lijkt niet te werken
                    else
                        IF ISCLK = '1' THEN
                            ISCLK <= '0'; 
                        ELSE
                            ISCLK <= '1';
                        END IF;     
                    end if;
                    if program = '1' then
                        counter <= counter +1;
                    end if;
                else -------------------gsclock----------------------------------
                    if counter < "10000000000000" then
                        IF ISCLK = '1' THEN
                            ISCLK <= '0'; 
                        ELSE
                            ISCLK <= '1';
                        END IF;
                        counter <= counter +1;
                    else
                        IF IBLANK = '1' THEN
                            IBLANK <= '0';
                            counter <= (others => '0');
                        ELSE
                            IBLANK <= '1';
                        END IF;
                    end if;
                end if;                 
            end if;
        end if;
    end process;
    
SIN <= ISIN;
SCLK <= ISCLK;
XLAT <= IXLAT;
BLANK <= IBLANK;        

end Behavioral;


Afbeeldingslocatie: http://img827.imageshack.us/img827/4276/simulatie.jpg

In de simulatie is te zien dat program wel op 0 komt maar dat de counter niet gereset wordt.
Ik zie vast iets over het hoofd, iemand die me kan helpen?

alvast bedankt

Acties:
  • 0 Henk 'm!

  • eekhoorn12
  • Registratie: Februari 2006
  • Niet online
Ik moest het even opzoeken, tijd geleden dat ik met vhdl heb gewerkt. Maar het heeft waarschijnlijk te maken met de update die je aan counter doet aan het eind van je programmeren block.

Omdat je met signalen werkt in een process wordt je signaal niet meteen aangepast op het moment dat jij het schrijft maar pas aan het eind van het process block. Dit is hier na te lezen: http://www.gmvhdl.com/signals.htm.

Dus omdat jij aan het eind van programmeren de counter verhoogt is je counter niet gereset. Ditzelfde geld voor de check die je doet waar je kijkt of program gelijk is aan 1. Die wijziging is nog niet doorgevoerd dus program is nog 0.

Dus omdat jij aan het eind van programmeren de counter verhoogt is je counter niet gereset.

Een belangrijk punt dat je moet onthouden bij vhdl is dat het niet werkt als een normale programmeer taal. Wil je net als bij een normale taal een waarde zetten en die er direct daarna weer uitlezen dan moet je niet met signals maar met variables werken.

[ Voor 26% gewijzigd door eekhoorn12 op 20-07-2012 11:42 . Reden: Dubbele tekst ]


Acties:
  • 0 Henk 'm!

  • matthijs33
  • Registratie: Oktober 2010
  • Laatst online: 07:41
Bedankt,
De simulatie loopt nu zoals ik wou.
Echter reageert de TLC5940NT niet zoals verwacht, maar vragen daarover passen hier waarschijnlijk niet?

Acties:
  • 0 Henk 'm!

  • nielskool
  • Registratie: Juli 2012
  • Laatst online: 18-09 12:43
Ik had ooit een probleem bij een kennis van mij dat iets niet werkte, in de simulatie zag alles er 100% goed uit.
Toen ging ik eens door zijn code kijken en kwam ik tegen dat hij in de fpga eigenlijk 1 verder telde dan dat hij wou.
Voorbeeld:
code:
1
2
3
4
counter <= counter +1
if(counter > 99) then
counter <= 0;
end if;

Hieruit zou je dus afleiden dat hij eigenlijk nooit 100 zou worden/blijven, echter gebeurde dit wel in de FPGA en niet in de simulatie. in de simulatie werd hij nooit 100, in de fpga stiekem wel(heel kort).

Als ik wat meer tijd had had ik je code even beter bekeken, misschien later deze dag.

Gr,
Niels

Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 00:16

Matis

Rubber Rocket

Wanneer counter gelijk is aan 00000110001000 is program ook nog 1, daarom wordt de reset op regel 44 overruled door de toewijzing op regel 53.
Maak er zoiets van
code:
1
2
3
4
5
if program = '1' then
  if counter < "00000110001000" then
    counter <= counter +1;
  end if;
end if;

En hoogstwaarschijnlijk zal het werken ;)

Daarnaast wil ik je nog als tip meegeven om geen elsif te gebruiken. Dit is namelijk een geprioriseerde vergelijking. Immers de bovenste vergelijking heeft de hoogste prio. Wanneer je dit in echte hardware gaat leggen, zal dit zeer veel geschakelde logica vreten en daardoor heel traag evalueren.
Aangezien je in je vergelijking alleen "is gelijk aan" checkt, kun je in dit specifieke geval veel beter een switch case statement gebruiken.

[ Voor 69% gewijzigd door Matis op 20-07-2012 15:03 ]

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

  • matthijs33
  • Registratie: Oktober 2010
  • Laatst online: 07:41
Bedankt voor de reacties
Aangezien de simulatie nu doet wat ik verwacht, en het nog steeds niet werkt heb ik een nieuw topic geopend(matthijs33 in "TLC5940NT aansturen") in het elektronica gedeelte.
Pagina: 1