VHDL

Do you have a question? Post it now! No Registration Necessary

Translate This Thread From Danish to

Threaded View
Hej,

Jeg sidder med noget simpelt VHDL som driller lidt. Jeg er først for et
par dage siden gået i gang med at lære VHDL og jeg synes at det er mega
spændende. Men det volder altså problemer.

Nu er jeg løbet panden imod en mur, og kunne godt bruge et par expert øjne.

Er der en venlig sjæl, som gider prøve at kompile dette projekt og
fortælle mig hvorfor det ikke spiller. Eller rettere hvad jeg skal gøre
anderledes for at få det til at spille.

http://www.laser-events.dk/jan/stepstyring.zip

På forhånd tak!

Mvh
   Jan

Re: VHDL

Quoted text here. Click to load it

Jeg har ikke lige adgang til en VHDL oversætter, men hvis du fortæller
hvad den brokker sig over, kan vi sikkert finde ud af det.

Quoted text here. Click to load it

Jeg kan anbefale at spørge på news:comp.lang.vhdl istedet.


Kai
--
Kai Harrekilde-Petersen <khp(at)harrekilde(dot)dk>

Re: VHDL

Quoted text here. Click to load it

Der er 55 filer i den zip-fil! - hvad havde du egentlig tænkt dig? at
jeg skal lege detektiv for at hjælpe dig?

Skær det ned til de rå VHDL filer som skal bruges, og skriv så tilbage
med loggen fra kompileren.


Kai
--
Kai Harrekilde-Petersen <khp(at)harrekilde(dot)dk>

Re: VHDL

Quoted text here. Click to load it

For det første kan jeg anbefale dig at bruge din <Return> tast lidt
mere. Du skal kun skrive koden én gang, men du kommer til at læse den
mange gange.

For det andet skal du skrive din kombinatoriske process uden brug af
'event når du tester på inputs - dette gøres implicit af process()
linien.

For det tredje vil jeg anbefale dig at bruge "rising_edge(clk)"
fremfor "clk'event and clk='1'" i dine sekventielle processer - det
første er mere læsbart, og kan faktisk redde dig fra nogle af de mere
obskure problemer.

jeg har reformatteret din sekventielle process, og gentaget den her:

  -- Do the stepping
  process(Clk, reset, Stepping)
  begin
-- "A";
    if reset ='1' then
      Prescaler <=0;
      LED_Val <='0';
      Step_State <= 0;
      Stepping <= '0';
    elsif Clk='1' and Clk'event then
      if Prescaler = 500000 then    
        prescaler <=0;
        LED_Val <= not LED_Val;
        if Stepping = '1' then
          StepPos <= StepPos + 1;
          -- Track the moved distance
          if Stepping_dir = '1' then
            Step_State <= Step_State+1;
          else
            Step_State <= Step_State-1;
          end if;
        end if;
      else
        Prescaler <= Prescaler + 1;
      end if;
    end if;

-- "B"
    if Stepping = '0' and Stepping'Event then
      StepPos <= 0;
    end if;    -- Reset the position on stop

  end process;

Jeg har indsat kommentarerne "A" og "B". Bemærk at du har to
uafhængige halvdele i processen, og StepPos tildeles i dem begge. Del
"A" er en sekventiel del (køre på rising_edge(clk), mens del "B" er
kombinatorisk.

Lad være med det.


Kai
--
Kai Harrekilde-Petersen <khp(at)harrekilde(dot)dk>

Re: VHDL
Hej,

Sorry at det var hele projektet jeg lagde i den zip, men det var for at
man kunne loade projektet ind i Xilinx Webpack direkte og spare tid.
Tænkte at det var det nemmeste for jer...

Kompileren giver mig denne fejl:
Analyzing Entity <styring> (Architecture <behavioral>).
INFO:Xst:1304 - Contents of register <Stepping> in unit <styring> never
changes during circuit operation. The register is replaced by logic.
ERROR:Xst:827 - "C:/stepstyring/styring.vhd" line 52: Signal StepPos
cannot be synthesized, bad synchronous description.
-->

Jeg mener jo at koden vil ændre på registeret Stepping, men det gør
kompileren åbenbart ikke.
Flere steder i koden sætter jeg en værdi på <Stepping>, så hvorfor den
kommer til konklusionen at det ikke bliver brugt fatter jeg ikke.

En anden ting jeg ikke helt forstår er hvorfor at jeg ikke på tildele en
værdi til et register flere steder. Så giver kompileren mig også fejl.
Men det er jo noget man tit har brug for, altså at flere steder kunne
sætte en værdi til samme reg.

Du skriver at del "A" og "B" henholdsvis en sekventiel del og en
kombinatorisk. Det kan jeg godt se nu du siger det. Der mener du at jeg
skal lave en seperat process til hver?


Kai Harrekilde-Petersen wrote:
Quoted text here. Click to load it

Re: VHDL

Quoted text here. Click to load it

Well, jeg har ikke adgang til Xilinx eller andet - jeg læser blot din
VHDL kode direkte.

Mht Stepping, så prøv at fjerne dine 'event tests inde i processen.

Quoted text here. Click to load it

Det er fordi kompileren ikke kan gennemskue om process A eller process
B skal have prioritet, når de begge udføres - samtidigt!

En simulator vil udføre de to processer sekventielt, så dér vil der
være en afgørelse. I en chip vil der ikkke være noget til at
sekventiere dine processer. De er pr definition parallelle.

Det er dette som giver en forskel på et standard software
programmerings sprog, og the hardware beskrivelse sprog. Det eneste
software sprog, som jeg lige kan komme på, som opfører sig på samme
måde som VHDL, er parallelprogrammerings sproget Ada.

Sjovt nok er VHDL syntaks osv baseret direkte på Ada.

Quoted text here. Click to load it

Jeps. Men du ikke kan skrive til en FF fra mere end én process...
Ergo: Prøv at løs dit problem på en anden måde. F.eks. kan du flytte
"B" koden ind i slutningen af "A" koden, sådan at det hele er en
sekventiel process:

   process(Clk, reset, Stepping)
   begin
     if reset ='1' then
       Prescaler <=0;
       LED_Val <='0';
       Step_State <= 0;
       Stepping <= '0';
     elsif Clk='1' and Clk'event then
       if Prescaler = 500000 then    
         prescaler <=0;         LED_Val <= not LED_Val;
         if Stepping = '1' then
           StepPos <= StepPos + 1;
           -- Track the moved distance
           if Stepping_dir = '1' then
             Step_State <= Step_State+1;
           else
             Step_State <= Step_State-1;
           end if;
         end if;       else
         Prescaler <= Prescaler + 1;
       end if;
       if Stepping = '0' and Stepping'Event then
         StepPos <= 0;
       end if;    -- Reset the position on stop
     end if;
   end process;

Prøv at sætte dig ned, og tænk lidt over hvordan *du* ville sætte
tingene sammen i gates og FF'er. Det du laver nu er en gang misk-mask.


Kai
--
Kai Harrekilde-Petersen <khp(at)harrekilde(dot)dk>

Re: VHDL

Quoted text here. Click to load it

Hmmm... lægger du ikke op til at skrive noget, der er syntetiserbrat ?

-god ide..

btw. Er du ve Phase-one eller hvor ?
svar kun, hvos du vil, ellers direkte til min mail post-at-sidebanen-dot-dk

Bo //

Re: VHDL
Quoted text here. Click to load it
Haha. Jeg tror lige jeg prøver forfra på det VHDL projekt. Jeg kan godt
se hvad der går galt for mig. For med 12 års programmerings erfaring er
det ret svært at ligge den sekventielle tankegang bag mig.
Jeg har siddet og tænkt på hvad VHDL kompileren ville oversætte mit kode
til i gates og tror egentlig jeg har en ok forståelse for det. Men det
var også derfor jeg ikke kunne se problemet i at tildele et registre en
værdi flere steder fra. Jeg så det kompilet om til en række FF der kunne
latches fra flere steder. Men klart det vil gi problemer når de to ting
rammer lige oven i hinanden.

Indtil videre så tak for hjælpen... Jeg vender nok tilbage :-)

Mvh
   Jan


Re: VHDL
Så kom det til at virke. Her er hvad jeg endte op med.

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

--  Uncomment the following lines to use the declarations that are
--  provided for instantiating Xilinx primitive components.
--library UNISIM;
--use UNISIM.VComponents.all;

entity styring is
   Port (
     Clk, reset : in  std_logic;
     STEP         : out std_logic_vector(1 downto 0);
     LED_PORT    : out std_logic;
     STEP_RIGHT : in  std_logic;
     STEP_LEFT  : in  std_logic
   );
end styring;

architecture Behavioral of styring is
signal Prescaler         : integer range 0 to 2000000;           --
std_logic_vector(15 downto 0);
signal LED_Val          : std_logic;
signal Stepping        : std_logic;
signal Stepping_dir    : std_logic;
signal Step_State        : integer range 0 to 3;
signal StepPos              : integer range 0 to 4095;
begin

-- Do the stepping
process(Clk, reset, Stepping)
begin
    if Stepping = '0' or reset = '1' then
      StepPos <= 0;                                                                    -- Reset the position on stop
      end if;

    if reset ='1' then
      Prescaler     <=        0;
      LED_Val         <=     '0';
      Step_State     <=     0;
    elsif Stepping = '1' then
        if rising_edge(clk) then
           if Prescaler = 500000 then    
                Prescaler <=0;
                LED_Val <= not LED_Val;

                StepPos <= StepPos + 1;                             -- Track the moved distance
                if Stepping_dir = '1' then Step_State <= Step_State+1;
                                             else Step_State <= Step_State-1;
                end if;
       else
          Prescaler <= Prescaler + 1;
         end if;
    end if;
    end if;
end process;

    Stepping <= (STEP_RIGHT xor STEP_LEFT) and not reset;                    -- Only one
of them may be one
    Stepping_dir <= STEP_RIGHT;                                                    -- High if we go right

    LED_PORT <= LED_Val;

    with Step_State SELect
        STEP<= "00" when 0,   --0
              "01" when 1,   --1
              "11" when 2,   --2
              "10" when 3;   --3
end Behavioral;

Mvh
   Jan


Re: VHDL

Quoted text here. Click to load it

[snip]

Ikke tosset.  Jeg ville dog selv aldrig bruge et signal som /ikke/ er
reset, som et asynkront reset.

Mit dogme for en synkron process i VHDL ser således ud:

process(Clk, reset)
begin
  if reset = '0' then -- Denne reset er aktiv-lav, forståes
    ... -- reset alle dine FF'er.
  elsif rising_edge(Clk) then
    ... -- Klokning af alle ting der skal ske synkront

    -- Hvis du vil have at et signal skal synkront resette nogle andre
    -- signaler, gøres det helt til sidst:
    if synkron_reset = '1' then
      -- Tildel (others => '0') her
    end if;
  end if;
end process;

Om du vil beholde den asynkrone reset via Stepping signalet som du har
idag, eller du vil skrive det om til at bruge en synkron reset, må du
selv vælge. Det kan dog have en fordel indenfor bestemte
teknologier/værktøjer at du kun har den 'rigtige' reset som en
asynkron reset.


Kai
--
Kai Harrekilde-Petersen <khp(at)harrekilde(dot)dk>

Re: VHDL
Quoted text here. Click to load it

Du kan evt se på den newsgruppe, der hedder comp.lang.vhdl

Bo //

Site Timeline