Kon W. schrieb:
> synthetisieren/ synthetisierbar für
> FPGAs genau bedeutet
Nun, VHDL ind Verilog können sehr viel, z. B. Text in Dateien schreiben.
Das sind aber dinge die es im FPGA so nicht gibt. Da gibt es keine
Hardware für und somit kann man diesen Teil aus VHDL dort nicht
verwenden. In der Simulation ist das fein, da will man gelegentlich Zeug
in Dateien schreiben.
Gebauso diese Warteanweisungen die eine bestimmte Zeit warten.
wait 10 ns;
Das geht im FPGA nicht weil es keine Hardware gibt die weiß was 10 ns
sind. Da kann man bis zu einer Taktflanke warten weil, die gibt es dort,
oder ein paar Takte zählen und währenddessen nichts tun.
In der Simulation ist das aber irre praktisch weil man da den
umgekehrten Fall hat, man hat keine Hardware. Also auch keinen
Taktgeber. Den baut man sich in der Testbench selber
clk <= not clk after 5 ns;
und hat eine 100 MHz Clock.
Tja, was ist eigentlich diese Testbench, nun, das kommt aus der Antike.
Man hat eine Hardware gebaut, viele unterschiedliche ICs einzeln als
einzelne Entitys, dann diese ICs auf eine Platine gesetzt und
untereinander verbunden. Das ist quasi die Top Entity, die Platine. Da
werden die einzelnen ICs als Components benannt und mit den Port Map
verbunden. Tja, dann hat man eine Platine (also die Top Entity) und weiß
nicht ob die das macht was man will, aber die hat IOs. Und dann legt man
die auf den Tisch auf dem man testet, die Test Bench. Und wie im Labor
üblich geht man dann an die IOs der Platine ran und macht damit Dinge.
An die Eingänge der Platine legt man Signale an, z. B. eine Clock und
die Ausgänge der Platine guckt man sich an. Z. B. mit einem
Logikanalyser.
Die Testbench als Datei ist wieder in VHDL/Verilog und beschreibt die
Hardware die man nur zum Testen an die Platine/Top Entity/DUT(Device
under Test) ranhängt. Also mit der Testbench baut man sich selber die
Testhardware zusammen mit allen Signalen die man später in der
Simulation sehen können möchte.
Beispiel:
Eine ganz einfache Schaltung wird gebaut:
1 | library IEEE;
|
2 | use IEEE.STD_LOGIC_1164.ALL;
|
3 |
|
4 | entity andgate is port (
|
5 | A : in STD_LOGIC:='0';
|
6 | B : in STD_LOGIC:='0';
|
7 | Y : out STD_LOGIC);
|
8 | end andgate;
|
9 |
|
10 | architecture Behavioral of andgate is
|
11 | begin
|
12 |
|
13 | Y <= A AND B;
|
14 |
|
15 | end Behavioral;
|
Diese Schaltung soll jetzt getestet werden. Dabei müssen für beide
Eingänge alle möglichen Kombinationen durchgegangen werden. Also 4
Stück. Eine Testbench könnte so aussehen:
1 | library IEEE;
|
2 | use IEEE.STD_LOGIC_1164.ALL;
|
3 |
|
4 | entity andgate_bench is
|
5 | end andgate_bench;
|
6 |
|
7 | architecture Behavioral of andgate_bench is
|
8 |
|
9 | component andgate is port(
|
10 | A : in STD_LOGIC:='0';
|
11 | B : in STD_LOGIC:='0';
|
12 | Y : out STD_LOGIC);
|
13 | end component;
|
14 |
|
15 | signal A: STD_LOGIC:='0';
|
16 | signal B: STD_LOGIC:='0';
|
17 | signal Y: STD_LOGIC:='0';
|
18 |
|
19 | begin
|
20 |
|
21 | DUT: andgate port map(
|
22 | A => A,
|
23 | B => B,
|
24 | Y => Y);
|
25 |
|
26 | process begin
|
27 | A <= '0';
|
28 | B <= '0';
|
29 | wait for 10 ns;
|
30 | A <= '1';
|
31 | B <= '0';
|
32 | wait for 10 ns;
|
33 | A <= '0';
|
34 | B <= '1';
|
35 | wait for 10 ns;
|
36 | A <= '1';
|
37 | B <= '1';
|
38 | wait for 10 ns;
|
39 | end process;
|
40 |
|
41 | end Behavioral;
|
Auch schön beschrieben ist das hier:
https://www.mikrocontroller.net/articles/VHDL_Testbench