Ik ben pas begonnen met vhdl en ik zou graag een simpele and functie in VHDL programmeren. echter bij de simulatie geeft hij geen clock weer, alleen ik zou niet weten waarom. Misschien dat jullie mij verder kunnen helpen.

use library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;

entity simple is
Port ( inA : in STD_LOGIC;
inB : in STD_LOGIC;
clock : in STD_LOGIC;
output : out STD_LOGIC);
end simple;

architecture Behavioral of simple is

begin

process(clock)

begin

if (clock'event and clock = '1') then
if (inA = '0' and inB = '0' ) then
output <= '0';
elsif (inA = '1' and inB = '0' ) then
output <= '0';
elsif (inA = '0' and inB = '1' ) then
output <= '0' ;
elsif (inA = '1' and inB = '1' ) then
output <= '1';
end if;
end if;

end process;

end Behavioral;

Waarmee simuleer je? Heb je een testbench? Als je die gebruikt, laten zien.

Dat de clk niet getoond wordt ligt niet aan je vhdl code imho

Om het even makkelijker te maken:


process(clock)
begin
  if rising_edge(clock) then
    output <= inA AND inB;
  end if;
end process; 

Realiseer je wel doordat je alles synchroon op de klok doet, je een memory element (flipflop) aanmaakt voor "output". Het kan dus ook zonder de clock, dat scheelt resources en is ook nog eens sneller :)

Maar om terug te komen op je simulatie. Gebruik je de ISE simulator? Hoe heb je de testbench aangemaakt?
Je kunt signalen toevoegen in de ISE simulator, maar bij een standaard testbench zou deze al zichtbaar moeten zijn.

Op 6 september 2007 17:10:41 schreef KillerB the Supreme:
Om het even makkelijker te maken:


process(clock)
begin
  if rising_edge(clock) then
    output <= inA AND inB;
  end if;
end process; 

Realiseer je wel doordat je alles synchroon op de klok doet, je een memory element (flipflop) aanmaakt voor "output". Het kan dus ook zonder de clock, dat scheelt resources en is ook nog eens sneller :)

Mischien wil de TS helemaal geen AND poort maken, maar een synchrone AND gate... En dan wil je wel een output. En sneller... Ja het gebeurt "direct", niet op een klok. En doorgaans zijn de flanken van een flipflop mooier dan die van een ander logisch element. En op die ene flipflop komt het nu écht niet aan...

Maar om terug te komen op je simulatie. Gebruik je de ISE simulator? Hoe heb je de testbench aangemaakt?
Je kunt signalen toevoegen in de ISE simulator, maar bij een standaard testbench zou deze al zichtbaar moeten zijn.

zou me ook interesseren ja :)

Ik gebruik inderdaad gewoon de ISE simulator. (8.1) De testbench heb ik aangemaakt bij processes en dan create new source en vervolgens kies ik de optie test bench waveform.

Vervolgens komt er een scherm naar voren met een aantal parameters en vervolgens druk ik op ok (nadat ik de naam heb opgegeven etc).

Heb je bij dat scherm dat naar voren komt ook de clock juist gedefinieerd? Snelheid en op welke signal deze moet komen kun je instellen.

Als je dat allemaal gedaan hebt, dan krijg je een overzicht waarin je grafisch de signals kunt "stimuleren". Je ziet alle signals als platte lijntjes (nul waarde default) over de tijd. Je klok moet hier dus ook al zichtbaar zijn, en tevens moet de lijn al als blokgolf afgebeeld staan. Wellicht dat je met de tijden en frequentie een beetje moet spelen, anders zie je de klok niet namelijk.
Maagoed, hierna kun je met wat muisklikken de andere signals wijzigen over de tijdlijn. Wat jij wilt is alle mogelijke situaties van je beide ingangen creeren. Zal niet zo moeilijk zijn denk ik.

Als je dat allemaal gedaan hebt, kun je het venster afsluiten. Je testbench is dan klaar. Nu kun je die simuleren middels "behavioural" (alleen het vhdl gedrag) of "post-route" (de daadwerkelijke gemapte elementen met precieze doorlooptijden) simulatie. Je zult wel tegen wat bugs aanlopen, vastlopers enzo, dat hoort nu eenmaal bij deze gratis simulator. Je leert er mee leven zullen we maar zeggen ;)

Nog een opmerking voor stecj366:
Ik zeg niet dat het verkeerd is dat je een geheugen element aanmaakt. Sterker nog, dat is juist wat je wilt in bepaalde gevallen. Maar het is wel goed het inzicht te hebben wanneer er nu wel en niet een geheugen voor een signal gebruikt wordt.

Ik kijk ook niet op een flipflopje meer of minder, zeker niet met de resources van hedendaagse fpgas. Ik hou er van om alles lekker synchroon te doen, met zo min mogelijk tussenliggende combinatorische logica. Dat houdt de snelheid lekker hoog.

Ik denk dat ik het probleem had gevonden, bij de instelling van de testbench had ik in eerste instantie geen clock staan maar inA.

Ik weet niet of je de clock altijd als eerste moet definieren, maar in ieder geval bedankt voor de reacties, ik ken nu verder met het leren schrijven van vhdl.

'T is mij nog niet helemaal duidelijk hoe je de clock "definieert". Immers, op RTL nivo is de clock niks anders dan elk ander signaal, behalve dan dat ie een bepaald gedrag veroorzaakt door de manier hoe je je code schrijft. Pas bij synthese wordt het een clock-resource in de FPGA.

Nog iets over je code: gebruik aub identation (inspringen). Dat maakt het een stuk beter leesbaar. Dus zoals KillerB het doet.

[Bericht gewijzigd door flipflop op (19%)]

Een clock is inderdaad een gewoon signaal net als ieder ander signaal. Maar als je een flank van een signaal gebruikt om bepaalde events uit te voeren (flip flop inklokken bijv), dan ziet de synthese tool dit als een echte clock. Indien mogelijk zal er in de hardware dan ook een dedicated clock lijn gebruikt.

Een clock kan extern aangeboden worden op een ingangspin, vaak zijn hier dedicated pinnen voor. Maar een clock kan ook intern "ontstaan" na bijvoorbeeld een stukje logica. Voorbeeldje (een clockdivider): een 8bit teller die oneindig doortelt middels een extern aangeboden klok. Het hoogste bitje van de teller wordt nu gebruikt om wat data in een register in te klokken. Het hoogste bitje is dus nu feitelijk een ook een clock geworden.

Om het makkelijk te houden, ieder signaal waarvan je iets zegt als:


if rising_edge(...) then 
if falling_edge(...) then
if (...'event and ... = '1') then
if (...'event and ... = '0') then

kun je als een clock beschouwen.

Dat ze ik, pas bij synthese wordt het een echte clock. Maar TS heeft het nog over simulatie. Daar is de clock niet anders dan elk ander signaal en moet dus in de simulator gewoon zichtbaar zijn.

Nu ben ik met de code verder gegaan en heb ik een clock gekregen. Maar nu wil ik met twee pushbuttons een led laten branden op een ontwikkelboard. Echter bij de simulatie blijft alles ongedefinieerd, behalve de clock. Er komt inA en inB geen waarde! kan iemand mij vertellen waar dat aan kan liggen. Is de code niet in staat om deze signalen te simuleren en juist weer te geven?

Ik weet dat ik vrijwel nihil weet, maar op het moment dat ik wel alles weet zal ik jullie ook komen helpen.

Overigens heb ik t board wel goed ingesteld. Dus de juiste pushbuttons en led.

code:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;

entity simple is
Port ( inA : in STD_LOGIC;
inB : in STD_LOGIC;
clock : in STD_LOGIC;
output : out STD_LOGIC);
end simple;

architecture Behavioral of simple is

begin

process(clock)

begin

if (clock'event and clock = '1') then
if (inA = '0' and inB = '0' ) then
output <= '0';
elsif (inA = '1' and inB = '0' ) then
output <= '0';
elsif (inA = '0' and inB = '1' ) then
output <= '0' ;
elsif (inA = '1' and inB = '1' ) then
output <= '1';
end if;
end if;

end process;

end Behavioral;


library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;

entity simple is
  Port ( inA    : in STD_LOGIC;
         inB    : in STD_LOGIC;
         clock  : in STD_LOGIC;
         output : out STD_LOGIC);
end simple;

architecture rtl of simple is
begin

process(clock)
begin
  if (clock'event and clock = '1') then
    if (inA = '0' and inB = '0' ) then
      output <= '0';
    elsif (inA = '1' and inB = '0' ) then
      output <= '0'; 
    elsif (inA = '0' and inB = '1' ) then
      output <= '0' ;
    elsif (inA = '1' and inB = '1' ) then
      output <= '1';
    end if;
  end if; 
end process; 

end rtl; 

Zo, nu kan ik het weer lezen.

Omdat inA en inB ingangen zijn, moet je die in je testbench een waarde geven. Anders doet je simulatie niks. Ook de clock zul je in je testbench zelf moeten genereren.
In je simulatie zal output nog undefined blijven tot de eerste klokpuls. Immers, dat is het eerste moment dat output een waarde krijgt. Een reset in je proces zal dir voorkomen, maar in een FPGA wordt dit vaak achterwege gelaten.

Hoe kan ik die dan een waarde meegeven?
En is het ook noodzakelijk om het bordje te laten functioneren.

ps. Ik had geprobeerd om de code uit te lijnen, maar hij zette deze automatisch helemaal naar de linker zijde.

Een testbench heb je alleen nodig om te simuleren. Je maakt een soort "schil" om je ontwerp heen. Vanuit die schil zet je alle ingangen van je ontwerpt (dut) op de gewenste stand. Bv in jouw AND voorbeeld: je kunt een voor een alle combinaties van inA en inB aflopen en kijken of de uitgang daarbij de juiste waarde krijgt. Op internet zijn vast wel voorbeelden van een testbench te vinden.

Die testbench vervangt dus de knoppen die je op je testboard hebt.

Dat uitlijnen moet met een [ code ] en [ /code ] woord om je code heen. Dan krijg je precies wat je typed.

Om ze een waarde mee te geven kun je in je naam.tbw als het goed is de niveaus zelf veranderen door te klikken.
Deze staat links onder "behavioral simulation".

ISE maakt dan van die tbw file de testbench file.

Als je met naam.tbw geselecteerd op Processes klikt en dan op "View Generated testbench a HDL" krijg je te zien hoe die testbench eruit ziet.