VHDL

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.

formatting link

På forhånd tak!

Mvh Jan

Reply to
Jan Thogersen
Loading thread data ...

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.

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

Kai

--
Kai Harrekilde-Petersen
Reply to
Kai Harrekilde-Petersen

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
Reply to
Kai Harrekilde-Petersen

For det første kan jeg anbefale dig at bruge din 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

Reply to
Kai Harrekilde-Petersen

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

Bo //

Reply to
Bo Bjerre

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 (Architecture ). INFO:Xst:1304 - Contents of register in unit 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.
 Click to see the full signature
Reply to
Jan Thogersen

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.

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.

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

Reply to
Kai Harrekilde-Petersen

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 //

Reply to
Bo Bjerre

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

Reply to
Jan Thogersen

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

Reply to
Jan Thogersen

[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
Reply to
Kai Harrekilde-Petersen

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.