Skip to content
Snippets Groups Projects
Commit 03a5723d authored by Ghazi Hemdi's avatar Ghazi Hemdi
Browse files

test

parent 96e254d7
No related branches found
No related tags found
No related merge requests found
#!/bin/bash
#nimmt den ersten Parameter und hängt .vhdl an,da Leute faul sind und wir sonst .vhdl bei -e und -r entfernen muessen
for var in "$@" #bei >1 Parametern momentan wird bis zum schliessen von GTKWave gewartet,kann aber auch parallel ausgefuehrt werden
do
echo "Die Datei $var.vhdl wird wenn moeglich in ein .vcd Format gebracht und ausgefuehrt"
echo "Syntax-check"
ghdl -s $var.vhdl #Syntax-check
if [ $? -ne 0 ] #catch all Fehler prüfung für letzten Befehl kann verbessert werden,ist aber bei Fehlern die in der Konsole schreiben nicht wichtig
then
echo "Failed"
exit #bei Fehler wird Failed raus gegeben und beendet
fi
echo "OK" #bei keinen Fehler wird OK raus gegeben
echo "Analysis"
ghdl -a $var.vhdl #Analysis
if [ $? -ne 0 ] #s.o
then
echo "Failed"
exit
fi
echo "OK"
echo "Build"
ghdl -e $var #Build
if [ $? -ne 0 ] #s.o
then
echo "Failed"
exit
fi
echo "OK"
echo "VCD-Dump"
ghdl -r $var --vcd=testbench$var.vcd #VCD-Dump wird als testbench.vcd gespeichert
if [ $? -ne 0 ] #s.o
then
echo "Failed"
exit
fi
echo "OK"
echo "Starting GTKWave"
gtkwave testbench$var.vcd # oeffnet den VCD-Dump in GTKWave
if [ $? -ne 0 ] #s.o
then
echo "Failed"
exit
fi
echo "OK"
done
---------------------------------------------------------------------------------------
----------------------------------Package Definition-----------------------------------
---------------------------------------------------------------------------------------
-- 1. Please create the package "ram_pack" by completing the following codes.
-- 1. Bitte erstellt ein Package "ram_pack" indem Ihr den folgenden Code vervollständigt.
-- 2. Please check Chapter 4 in the "VHDL script" on Moodle to learn how to create a subtype,
-- and then complete the subtype "BYTE_4", that consists of 4 BYTE (32 bits).
-- 2. Guckt Euch Kapitel 4 im VHDL Skript im Moodle an. Dort wird subtype erklärt.
-- Vervollständigt den subtype "BYTE_4" der aus 4 BYTE (32 Bits) besteht.
-- 3. Please check Chapter 4 in the "VHDL script" on Moodle to learn how to create a type,
-- and then complete the type "SPEICHER_MATRIX", which is the storage units of RAM and
-- belongs to "BYTE_4".
-- 3. Guckt Euch Kapitel 4 im VHDL Skript im Moodle an. Dort wird type erläutert.
-- Vervollständigt den type "SPEICHER_MATRIX" der den Speicher des RAM darstellt und zu "BYTE 4" gehört.
package ram_pack is
subtype BYTE_4 is BIT_VECTOR (31 downto 0);--a
type SPEICHER_MATRIX is array (NATURAL range <>) of BYTE_4;-- b
end ram_pack;
---------------------------------------------------------------------------------------
----------------------------------Entity Definition------------------------------------
---------------------------------------------------------------------------------------
-- 1. The way of recalling "ram_pack" is similar to the way of recalling other packages.
-- 1. Das package "ram_pack" wird wie andere packages aufgerufen.
-- 2. "adr_breite" is an adjustable integer, that describes the length of the address,
-- "adr" is the address, "din" is the input, "do" is the output, "read_write" controls
-- whether signals need to be read or written, the rising edge indicates "read" while the
-- falling edge indicates "write".
-- 2. Der Integer "adr_breite" ist die Laenge der Addresse, "adr" die Addresse, "din" der Input,
-- "do" der output und "read_write" bestimmt ob Signale gelesen oder geschrieben werden. Die
-- steigende Flanke fuer "read", die fallende Flanke fuer "write".
use work.ram_pack.ALL;
entity ram is
generic (adr_breite : INTEGER :=4); -- Je nach verwendetem script bricht die Kompilierung mit "ghdl-mcode:error: overflow detected" ab wenn hier der Wert nicht bereits gesetzt wird.
-- In diesem Fall kann die ram_tb manuell ausgeführt werden. Alternativ kann im Rahmen der Aufgabe hier (adr_breite : INTEGER := 4) verwendet werden.
port (adr : in BIT_VECTOR (0 to adr_breite-1);
din : in BYTE_4;
do : out BYTE_4;
read_write : in BIT);
end ram;
architecture ram_behave of ram is
---------------------------------------------------------------------------------------
-----------------------------BitsToInteger Function------------------------------------
---------------------------------------------------------------------------------------
-- 1. You can directly use the function "to_integer", that can convert address fed
-- as bits into an integer.
-- 1. Die Funktion "to_integer" konvertiert eine in Bit angegebene Adresse in ein Integer.
-- 2. With this converted integer, you can specify the position in SPEICHER_MATRIX
-- where the data are read or written.
-- 2. Dieses Integer kann die Position in SPEICHER_MATRIX gelesen/geschrieben werden angeben.
function to_integer (constant i : in BIT_VECTOR) return INTEGER is
-- Funktion: Umwandeln eines Bit-Vektor-Wertes in eine Integer-Zahl
variable i_tmp : BIT_VECTOR (0 to i'length-1);
variable int_tmp : INTEGER := 0;
begin
i_tmp := i;
for m in 0 to i'length-1 loop
if i_tmp(m) = '1' then
int_tmp := int_tmp + 2**(i'length-1 - m);
end if;
end loop;
return int_tmp;
end to_integer;
-----------------------------------------------------------------------------------------
-----------------------------Lesezugriff Process-----------------------------------------
-----------------------------------------------------------------------------------------
-- 1. The signal "ram_m" is an instance of SPEICHER_MATRIX.
-- 1. Das Signal "ram_m" ist eine Instanz von SPEICHER_MATRIX.
-- 2. In the "Lesezugriff process", data are extracted from RAM (SPEICHER_MATRIX).
-- 2. Im Prozess "Lesezugriff" werden Daten aus dem RAM gelesen (SPEICHER_MATRIX).
-- 3. In the "Lesezugriff process", we need to check whether the signals satisfy the
-- requirements (time constraints) in the assignments.
-- 3. Dabei muss ueberprueft werden ob die Signale die zeitlichen Voraussetzungen in aus
-- der Aufgabenstellung erfuellen.
-- 4. If the above requirements (time constraints) are not satisfied, "Fehler beim Lesen"
-- is reported.
-- 4. Wenn diese nicht erfuellt sind, wird "Fehler beim Lesen" ausgegeben.
-- 5. The following codes demonstrates how the "Lesezugriff process" works, please read them
-- carefully.
-- 5. Der nachfolgende Code zeigt wie der "Lesezugriff" process funktioniert. Bitte studiert diesen genau.
signal ram_m : SPEICHER_MATRIX (0 to (2**adr_breite)-1);
begin
Lesezugriff: process
variable t_read, t_akt : TIME;
begin
wait on adr;
wait for 6 ns;
if read_write = '1' then
do <= ram_m(to_integer(adr));
end if;
t_akt:= adr'last_event;
if t_akt>25 ns then
report "Lesen hat laenger als 25 ns gedauert"
severity WARNING;
end if;
wait for 44 ns;
t_read := read_write'last_event;
if t_read < 44 ns then
report "Fehler beim Lesen"
severity WARNING;
end if;
end process;
-----------------------------------------------------------------------------------------
-----------------------------Schreibzugriff Process--------------------------------------
-----------------------------------------------------------------------------------------
-- 1. According to the requirements in the assignment, please complete the "Schreibzugriff"
-- process where the data are fed into RAM (SPEICHER_MATRIX).
-- 1. Vervollstaendigt den Prozess "Schreibzugriff" in dem Daten in dem RAM gespeichert werden.
-- Beachtet dabei die Voraussetzungen die auf dem Uebungsblatt angegeben werden.
-- 2. In the "Schreibzugriff process", different time constraints should be satisfied.
-- E.g., the data input should be shorter than 25ns after the address signal changed, and
-- longer than 20ns before the read_write signal changes from "high" to "low".
-- 2. Im "Schreibzugriff" Prozess muessen verschiedene zeitliche Bedingungen erfuelt werden.
-- Zum Beispiel sollen die Daten weniger als 25ns gehalten werden nachdem das Adresssignal
-- veraendert wurde und sollten für mindestens 20ns stabil anliegen bevor Read/Write auf 0 sinkt.
-- 3. If the data input is shorter than 20ns before the read_write changes from "high" to "low", please report
-- "Daten liegen noch nicht lang genug an".
-- 3. Wenn die Daten nicht mindestens 20ns vor dem Wechsel von read_write von "high" nach "low"
-- anlagen, gebt bitte "Daten liegen noch nicht lang genug an" aus.
-- 4. If the data input is longer than 25ns after the address changed,
-- please report "Daten lagen nicht schnell genug an".
-- 4. Wenn die Daten mehr als 25ns nach dem Adresswechsel noch anliegen, gebt bitte
-- "Daten lagen nicht schnell genug an" aus.
Schreibzugriff: process
variable t_data : TIME;
begin
wait on adr;
wait for 25 ns;
if read_write = '0' then
ram_m(to_integer(adr)) <= din;
t_data := din'last_event;
if din'last_event < 0 ns then
report "zu schreibende Daten sind nicht stabil"--'U' ist der einzige Fall der auftauchen kann wenn man nicht absichtlich etwas falsch macht und das taucht nur Anfangs auf
severity WARNING;
end if;
if t_data <20 ns then
report "zu schreibende Daten sind nicht 20 ns stabil gewesen"
severity WARNING;
end if;
end if;
end process;
-----------------------------------------------------------------------------------------
------------------------Zyklus_Pruefen und Schreibimpulse_Pruefen------------------------
-----------------------------------------------------------------------------------------
-- 1. According to the requirements in the assignment, please complete the "Zyklus_Pruefen"
-- process and "Schreibimpulse_Pruefen".
-- 1. Vervollstaendigt die Prozesse "Zyklus_Pruefen" und "Schreibimpulse_Pruefen" mit den
-- auf dem Uebungsblatt beschriebenen Voraussetzungen.
-- 2. In both processes, the time constraints need to be checked.
-- 2. In beiden Prozessen muessen zeitliche Bedingungen erfuelt sein.
-- 3. If the address is not held for 100ns after the address changed, please report
-- "Zykluszeit wurde nicht eingehalten".
-- 3. Wenn die Adresse nicht mindestens 100ns nachdem sie das letzte Mal veraendert wurde gehalten wird
-- soll "Zykluszeit wurde nicht eingehalten" ausgegeben werden.
-- 4. If the Schreibimpulse (the period where the read_write signal equals "0") is shorter
-- than 15 ns, please report "Schreib-Impuls zu kurz".
-- 4. Wenn der Schreibimpuls (die Zeit die das read_write signal auf "0" steht) kuerzer als
-- 15ns ist soll "Schreib-Impuls zu kurz" ausgegeben werden.
-- 5. If the data input is not stable during Schreibimpulse (data changed), please report
-- "Daten waren beim Schreiben nicht stabil!".
-- 5. Falls sich die Daten waehrend des Schreibimpulses aendern soll
-- "Daten waren beim Schreiben nicht stabil!" ausgegeben werden.
Zyklus_Pruefen: process
variable t_zyklus : TIME;
begin
wait on adr;
wait for 100 ns;
t_zyklus := adr'last_event;
if t_zyklus < 100 ns then
report "Zykluszeit kleiner als 100 ns"
severity WARNING;
end if;
-- missing
end process;
Schreibimpulse_Pruefen: process
variable t_puls : TIME;
begin
wait on adr;
if read_write = '0' then
wait for 15 ns;
t_puls := read_write'last_event;
if t_puls < 15 ns then
report "write Signal existierte kleiner als 15 ns"
severity WARNING;
end if;
end if;
end process;
end ram_behave;
--################################################################################
-- Fehlermeldungen
--################################################################################
--##EXECUTION:: Time: @1ns, report warning: Zykluszeit wurde nicht eingehalten,
--Process: Zykluszeit
--##EXECUTION:: Time: @20ns, report warning: Daten liegen noch nicht lang genug an,
--Process: Schreiben
--##EXECUTION:: Time: @31ns, report warning: Schreib-Impuls zu kurz, Process: Schreibimpulse
--##EXECUTION:: Time: @51ns, report warning: Fehler beim Lesen,
--Process: Lesen
--##EXECUTION:: Time: @160ns, report warning: Zykluszeit wurde nicht eingehalten,
--Process: Zykluszeit
--##EXECUTION:: Time: @381ns, report warning: Daten waren beim Schreiben nicht stabil,
--Process: Schreibimpulse
--##EXECUTION:: Time: @400ns, report warning: Fehler beim Lesen, Process: Lesen
--##EXECUTION:: Time: @446ns, report warning: Daten waren beim Schreiben nicht stabil,
--Process: Schreibimpulse
--##EXECUTION:: Time: @570ns, report warning: Daten liegen noch nicht lang genug an,
--Process: Schreiben
--##EXECUTION:: Time: @570ns, report warning: Daten lagen nicht schnell genug an,
--Process: Schreiben
--##EXECUTION:: Time: @580ns, report warning: Schreib-Impuls zu kurz,
--Process: Schreibimpulse
---------------------------------------------------------------------------------------
-- After you completed the design of "ram.vhdl", please test your implementation with this
-- testbench. If your implementation outputs the above "Fehlermeldungen", that means
-- your implementation is correct.
-- Testet Eure finale Implementierung in "ram.vhdl" mit dieser Testbench. Wenn dabei die
-- obigen Fehlermeldungen ausgegeben werden ist die Implementierung korrekt.
---------------------------------------------------------------------------------------
use work.ram;
use work.ram_pack.all;
entity ram_tb is
end ram_tb;
architecture structure of ram_tb is
component ram
generic (adr_breite: Integer:=4);
port ( adr: in BIT_VECTOR(0 to adr_breite-1);
din: in BYTE_4;
do: out BYTE_4;
read_write: in BIT);
end component;
Signal adresse: BIT_VECTOR(0 to 3);
signal din,do: BYTE_4;
signal read_write: BIT:='1';
begin
Testobject: ram
port map(
adr => adresse,
din => din,
do => do,
read_write => read_write
);
adresse <= "0000" after 0 ns, "1000" after 1 ns, "0001" after 150 ns,"1000" after 160 ns,"0101" after 350 ns, "1000" after 580 ns,"0000" after 700 ns,"0101" after 900 ns, "1000" after 1100 ns,"0000" after 1210 ns;
din <= "00000000000000000000000000000000" after 0 ns,
"00000000000000000000000000000001" after 5 ns,
"00000000000000000000000001010000" after 150 ns,
"00000000000000000000000001010101" after 300 ns,
"00000000000000000000000001010111" after 365 ns,
"00000000000000000000000010000001" after 430 ns,
"00000000000000000000000011110000" after 560 ns;
read_write <= '1' after 0 ns, '0' after 20 ns, '1'after 31 ns, '0' after 360 ns,'1' after 381 ns, '0' after 420 ns,'1' after 446 ns, '0' after 570 ns,'1' after 580 ns,'0' after 1210 ns,'1' after 1220 ns;
end structure;
$date
Wed Dec 22 07:45:56 2021
$end
$version
GHDL v0
$end
$timescale
1 fs
$end
$scope module standard $end
$upscope $end
$scope module ram_pack $end
$upscope $end
$scope module ram $end
$var reg 4 ! adr[0:3] $end
$var reg 32 " din[31:0] $end
$var reg 32 # do[31:0] $end
$var reg 1 $ read_write $end
$comment ram_m is not handled $end
$upscope $end
$enddefinitions $end
#0
b0000 !
b00000000000000000000000000000000 "
b00000000000000000000000000000000 #
0$
$date
Wed Dec 22 07:45:57 2021
$end
$version
GHDL v0
$end
$timescale
1 fs
$end
$scope module standard $end
$upscope $end
$scope module ram_pack $end
$upscope $end
$scope module ram_tb $end
$var reg 4 ! adresse[0:3] $end
$var reg 32 " din[31:0] $end
$var reg 32 # do[31:0] $end
$var reg 1 $ read_write $end
$scope module testobject $end
$var reg 4 % adr[0:3] $end
$var reg 32 & din[31:0] $end
$var reg 32 ' do[31:0] $end
$var reg 1 ( read_write $end
$comment ram_m is not handled $end
$upscope $end
$upscope $end
$enddefinitions $end
#0
b0000 !
b00000000000000000000000000000000 "
b00000000000000000000000000000000 #
1$
b0000 %
b00000000000000000000000000000000 &
b00000000000000000000000000000000 '
1(
#1000000
b1000 !
b1000 %
#5000000
b00000000000000000000000000000001 "
b00000000000000000000000000000001 &
#7000000
#20000000
0$
0(
#26000000
#31000000
1$
1(
#51000000
#101000000
#150000000
b0001 !
b00000000000000000000000001010000 "
b0001 %
b00000000000000000000000001010000 &
#156000000
#160000000
b1000 !
b1000 %
#175000000
#200000000
#250000000
#300000000
b00000000000000000000000001010101 "
b00000000000000000000000001010101 &
#350000000
b0101 !
b0101 %
#356000000
#360000000
0$
0(
#365000000
b00000000000000000000000001010111 "
b00000000000000000000000001010111 &
#375000000
#381000000
1$
1(
#400000000
#420000000
0$
0(
#430000000
b00000000000000000000000010000001 "
b00000000000000000000000010000001 &
#446000000
1$
1(
#450000000
#560000000
b00000000000000000000000011110000 "
b00000000000000000000000011110000 &
#570000000
0$
0(
#580000000
b1000 !
1$
b1000 %
1(
#586000000
b00000000000000000000000000000001 #
b00000000000000000000000000000001 '
#605000000
#630000000
#680000000
#700000000
b0000 !
b0000 %
#706000000
b00000000000000000000000000000000 #
b00000000000000000000000000000000 '
#725000000
#750000000
#800000000
#900000000
b0101 !
b0101 %
#906000000
b00000000000000000000000001010111 #
b00000000000000000000000001010111 '
#925000000
#950000000
#1000000000
#1100000000
b1000 !
b1000 %
#1106000000
b00000000000000000000000000000001 #
b00000000000000000000000000000001 '
#1125000000
#1150000000
#1200000000
#1210000000
b0000 !
0$
b0000 %
0(
#1216000000
#1220000000
1$
1(
#1225000000
#1235000000
#1260000000
#1310000000
v 4
file . "ram.vhdl" "620f9510ccb5acf0b99a059831b04c7e5fffdba4" "20211222064556.245":
package ram_pack at 18( 1164) + 0 on 187;
entity ram at 37( 2292) + 0 on 188;
architecture ram_behave of ram at 46( 2826) + 0 on 189;
file . "ram_tb.vhdl" "31262186999c18507a6dfdf3d1fce1d959a920b7" "20211222064557.855":
entity ram_tb at 33( 1869) + 0 on 190;
architecture structure of ram_tb at 39( 1938) + 0 on 191;
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment