Adds first version of U3 test

This commit is contained in:
kutningjo 2024-10-29 21:57:39 +01:00
parent 0fff028d26
commit d70fb11d78
6 changed files with 109 additions and 82 deletions

View File

@ -14,17 +14,17 @@ end DataTypesExample;
architecture Behavioral of DataTypesExample is architecture Behavioral of DataTypesExample is
-- constant/signal Deklarationen -- constant/signal Deklarationen
--Legen Sie ein Konstante DataWidth als integer mit Wert 8 an --Legen Sie ein Konstante eight als integer mit Wert 8 an
--Legen Sie ein Konstante on als std_logic mit 1 an --Legen Sie ein Konstante one als std_logic mit 1 an
--Legen Sie ein Konstante mask als std_logic_vector mit 5Ah an --Legen Sie ein Konstante mask als std_logic_vector mit 5Ah an
--Legen Sie ein signal internal_int als integer mit Wertebreich -128 to 127 an --Legen Sie ein signal internal_int als integer mit Wertebreich -128 to 127 an, initsialiseren Sie es mit 0
--Legen Sie ein signal internal_int als integer mit Wertebreich -128 to 127 an --Legen Sie ein signal internal_int2 als integer mit Wertebreich -128 to 127 an, initsialiseren Sie es mit 0
--Legen Sie ein signal internal_slv als std_logic_vector mit Laenge 8 an --Legen Sie ein signal internal_slv als std_logic_vector mit Laenge 8 an, initsialiseren Sie es mit 0
--Legen Sie ein signal internal_s als signed mit Laenge 8 an --Legen Sie ein signal internal_s als signed mit Laenge 8 an
@ -33,7 +33,7 @@ begin
-- Maskieren (UND) Sie den Eingang input_slv mit der Maske mask und weisen Sie den Wert dem Ausgang output_slv_mask zu -- Maskieren (UND) Sie den Eingang input_slv mit der Maske mask und weisen Sie den Wert dem Ausgang output_slv_mask zu
-- Der Wert des Ausgangs output_slv_set soll dem Eingang input_slv entsprechen wobei immer das 5 Bit (von 8 Bit) per Bitverkettung gesetzt sein soll -- Der Wert des Ausgangs output_slv_set soll dem Eingang input_slv entsprechen wobei immer das 5 Bit (6 Stelle von 8 Bit) per Bitverkettung gesetzt sein soll
-- Koonstante one kann verwendet werden -- Koonstante one kann verwendet werden
-- Weisen Sie dem signal internal_slv dein Eingang input_slv zu -- Weisen Sie dem signal internal_slv dein Eingang input_slv zu
@ -42,8 +42,10 @@ begin
-- Rechnen Sie die Subtraktion internal_int - der Konstante eight und weisen Sie das Ergebnis internal_int2 zu -- Rechnen Sie die Subtraktion internal_int - der Konstante eight und weisen Sie das Ergebnis internal_int2 zu
-- Weisen Sie dem signal das Signal internal_int2 zu (Datentypen beachten Konvetierung noetig) -- Weisen Sie dem Signal internal_s das Signal internal_int2 zu (Datentypen beachten Konvetierung noetig)
-- Weisen Sie dem Ausgang output_slv_calc das signal internal_s zu (Datentypen beachten Konvetierung noetig) -- Weisen Sie dem Ausgang output_slv_calc das signal internal_s zu (Datentypen beachten Konvetierung noetig)
end Behavioral; end Behavioral;

View File

@ -1,9 +1,9 @@
vhdl_srcs = down_counter_int.vhd \ vhdl_srcs = ../scripts/test_utility.vhd \
top_entity.vhd \ alu.vhd \
test_top_entity.vhd \ test_alu.vhd \
main = test_top_entity main = test_alu
CHECK_RESULTS = true CHECK_RESULTS = true

View File

@ -21,25 +21,18 @@ end SimpleALU;
architecture Behavioral of SimpleALU is architecture Behavioral of SimpleALU is
-- Legen Sie das Signal STD_LOGIC_VECTOR reg_a an, in diesem soll spaeter der Eingang operand_a gespeichert werden -- Legen Sie das Signal STD_LOGIC_VECTOR reg_a an, in diesem soll spaeter der Eingang operand_a gespeichert werden
signal reg_a : STD_LOGIC_VECTOR(3 downto 0);
-- Legen Sie das Signal STD_LOGIC_VECTOR reg_b an, in diesem soll spaeter der Eingang operand_b gespeichert werden -- Legen Sie das Signal STD_LOGIC_VECTOR reg_b an, in diesem soll spaeter der Eingang operand_b gespeichert werden
signal reg_b : STD_LOGIC_VECTOR(3 downto 0);
-- Legen Sie das Signal STD_LOGIC_VECTOR reg_opcode an, in diesem soll spaeter der Eingang opcode gespeichert werden -- Legen Sie das Signal STD_LOGIC_VECTOR reg_opcode an, in diesem soll spaeter der Eingang opcode gespeichert werden
signal reg_opcode : STD_LOGIC_VECTOR(1 downto 0);
-- Legen Sie ein Signal flag_zero als STD_LOGIC an -- Legen Sie ein Signal flag_zero als STD_LOGIC an
signal flag_zero : STD_LOGIC;
-- Legen Sie ein Signal result als STD_LOGIC_VECTOR der Laenge 4 an -- Legen Sie ein Signal result als STD_LOGIC_VECTOR der Laenge 4 an
signal result : STD_LOGIC_VECTOR(3 downto 0);
-- Legen Sie ein Signal reg_flag_zero als STD_LOGIC -- Legen Sie ein Signal reg_flag_zero als STD_LOGIC
signal reg_flag_zero : STD_LOGIC;
-- Legen Sie ein Signal reg_result als STD_LOGIC_VECTOR der Laenge von result an -- Legen Sie ein Signal reg_result als STD_LOGIC_VECTOR der Laenge von result an
signal reg_result : STD_LOGIC_VECTOR(3 downto 0);
begin begin
@ -48,15 +41,7 @@ begin
-- Ansonsten soll bei einer steigenden Flanke von clk der entsprechnde Eingang (entity) gespeichert werden -- Ansonsten soll bei einer steigenden Flanke von clk der entsprechnde Eingang (entity) gespeichert werden
input_register : process(reset,clk) input_register : process(reset,clk)
begin begin
if reset = '1' then
reg_a <= (others => '0');
reg_b <= (others => '0');
reg_opcode <= (others => '0');
elsif rising_edge(clk) then
reg_a <= operand_a;
reg_b <= operand_b;
reg_opcode <= opcode;
end if;
end process input_register; end process input_register;
@ -64,7 +49,6 @@ begin
alu_process: process(all) alu_process: process(all)
begin begin
-- Anweisung fuer die Initialisierung fuer flag_zero mit dem Wert 0 -- Anweisung fuer die Initialisierung fuer flag_zero mit dem Wert 0
flag_zero <= '0';
-- Entscheide basierend auf dem Opcode, welche Operation durchgefuehrt wird -- Entscheide basierend auf dem Opcode, welche Operation durchgefuehrt wird
-- Wenn reg_opcode: -- Wenn reg_opcode:
@ -74,52 +58,28 @@ begin
-- 11 -> result = reg_a or reg_b -- 11 -> result = reg_a or reg_b
-- Fuer diese Realisierung soll die case-Anweisung verwendet werden -- Fuer diese Realisierung soll die case-Anweisung verwendet werden
-- Anm. Bei Berechnungen Datentypen beachten (std_logic_vector kann nicht direkt verwendet werden sondern es muss erst gecastet werden - signed verwenden) -- Anm. Bei Berechnungen Datentypen beachten (std_logic_vector kann nicht direkt verwendet werden sondern es muss erst gecastet werden - signed verwenden)
case reg_opcode is
when "00" => -- Im Fall von "00" fuehre eine Addition durch
result <= std_logic_vector(signed(reg_a) + signed(reg_b));
when "01" => -- Im Fall von "01" fuehre eine Subtraktion durch
result <= std_logic_vector(signed(reg_a) - signed(reg_b));
when "10" => -- Im Fall von "10" fuehre eine bitweise AND-Operation durch
result <= reg_a and reg_b;
when "11" => -- Im Fall von "11" fuehre eine bitweise OR-Operation durch
result <= reg_a or reg_b;
when others => -- In allen anderen Faellen setze ein undefiniertes Verhalten
result <= (others => 'X');
end case;
-- ueberpruefe, ob das Ergebnis result null ist, und setze das flag_zero entsprechend (result = 0 dann 1 ansonsten 0) -- ueberpruefe, ob das Ergebnis result null ist, und setze das flag_zero entsprechend (result = 0 dann 1 ansonsten 0)
-- Fuer diese Realisierung soll die if-Anweisung verwendet werden -- Fuer diese Realisierung soll die if-Anweisung verwendet werden
if result = "0000" then
flag_zero <= '1';
end if;
end process alu_process; end process alu_process;
-- Prozess fuer die Ausgangssregister reg_result, reg_flag_zero -- Prozess fuer die Ausgangssregister reg_result, reg_flag_zero
-- Bei einem Reset sollen die Register den Wert 0 haben -- Bei einem Reset sollen die Register den Wert 0 haben
-- Ansonsten soll bei einer steigenden Flanke von clk das entsprechnde Signal aus dem alu_process zugewiesen werden -- Ansonsten soll bei einer steigenden Flanke von clk das entsprechnde Signal aus dem alu_process zugewiesen werden
output_register : process(reset,clk)
begin
if reset = '1' then
reg_result <= (others => '0');
reg_flag_zero <= '0';
elsif rising_edge(clk) then
reg_result <= result;
reg_flag_zero <= flag_zero;
end if;
end process output_register;
-- Anweisung um das Signal reg_result dem Ausgang result_out zu zuweisen -- Anweisung um das Signal reg_result dem Ausgang result_out zu zuweisen
result_out <= reg_result;
-- Anweisung um das Signal reg_flag_zero dem Ausgang flag_zero_out zu zuweisen -- Anweisung um das Signal reg_flag_zero dem Ausgang flag_zero_out zu zuweisen
flag_zero_out <= reg_flag_zero;
-- Bedingte Signalzuweisung fuer 'flag_or_out' außerhalb des Prozesses -- Bedingte Signalzuweisung fuer 'flag_or_out' außerhalb des Prozesses
-- Es soll anhand des Entity Eingang opcode mit einer With .. Select Anweisung der Ausgang flag_or_out gesetzt werden -- Es soll anhand des Entity Eingang opcode mit einer With .. Select Anweisung der Ausgang flag_or_out gesetzt werden
-- opcode von or Operation dann 1 ansonsten 0 -- opcode von or Operation dann 1 ansonsten 0
with opcode select
flag_or_out <= '1' when "11", -- Setze 'flag_or_out' auf '1', wenn 'opcode' "11" ist
'0' when others; -- Ansonsten 0
end Behavioral; end Behavioral;

View File

@ -3,40 +3,103 @@ library ieee;
library std; library std;
use std.env.all; use std.env.all;
use std.textio.all;
entity test_top_entity is library work;
generic( CHECK_RESULTS : boolean ); use work.test_utility.all;
end entity test_top_entity;
architecture test of test_top_entity is entity test_alu is
signal CLK : std_logic := '0'; generic( GUI_MODE : boolean; CHECK_RESULTS : boolean );
signal RESET : std_logic := '1'; end entity test_alu;
signal CNT : std_logic_vector(6 downto 0);
architecture test of test_alu is
signal clk : std_logic := '0';
signal reset : std_logic := '1';
signal operand_a : std_logic_vector(3 downto 0);
signal operand_b : std_logic_vector(3 downto 0);
signal opcode : std_logic_vector(1 downto 0);
signal result_out : std_logic_vector(3 downto 0);
signal flag_zero_out : std_logic;
signal flag_or_out : std_logic;
begin begin
u_top_entity : entity work.top_entity u_alu : entity work.SimpleALU
port map ( port map (
CLK => CLK, clk => clk,
RESET => RESET, reset => reset,
CNT => CNT operand_a => operand_a,
operand_b => operand_b,
opcode => opcode,
result_out => result_out,
flag_zero_out => flag_zero_out,
flag_or_out => flag_or_out
); );
CLK <= not CLK after 10 ns; clk <= not clk after 10 ns;
p_reset : process( CLK ) p_reset : process( clk )
begin begin
if falling_edge( CLK ) then if falling_edge( clk ) then
RESET <= '0'; reset <= '0';
end if; end if;
end process p_reset; end process p_reset;
p_run : process p_run : process
begin begin
wait until falling_edge( RESET ); wait until falling_edge( reset );
for i in 0 to 128 loop -- Addition
wait until rising_edge( CLK ); write( output, "Test Addition ... " );
end loop; opcode <= "00";
wait until rising_edge( CLK ); operand_a <= x"a";
stop; operand_b <= x"5";
wait until falling_edge( clk );
wait until falling_edge( clk );
assert_eq( result_out, x"f" );
assert_eq( flag_zero_out, '0' );
assert_eq( flag_or_out, '0' );
write( output, "done" & LF );
-- Subtraktion auf Null
write( output, "Test Subtraktion ... " );
opcode <= "01";
operand_a <= x"a";
operand_b <= x"a";
wait until falling_edge( clk );
wait until falling_edge( clk );
assert_eq( result_out, x"0" );
assert_eq( flag_zero_out, '1' );
assert_eq( flag_or_out, '0' );
write( output, "done" & LF );
-- UND-Operation
write( output, "Test UND-Operation ... " );
opcode <= "10";
operand_a <= x"a";
operand_b <= x"3";
wait until falling_edge( clk );
wait until falling_edge( clk );
assert_eq( result_out, x"2" );
assert_eq( flag_zero_out, '0' );
assert_eq( flag_or_out, '0' );
write( output, "done" & LF );
-- ODER-Operation
write( output, "Test ODER-Operation ... " );
opcode <= "11";
operand_a <= x"a";
operand_b <= x"3";
wait until falling_edge( clk );
wait until falling_edge( clk );
assert_eq( result_out, x"b" );
assert_eq( flag_zero_out, '0' );
assert_eq( flag_or_out, '1' );
write( output, "done" & LF );
wait until falling_edge( clk );
if ( GUI_MODE ) then
std.env.stop;
else
std.env.finish;
end if;
end process p_run; end process p_run;
end architecture test; end architecture test;

View File

@ -0,0 +1,2 @@
$ version 1.1
/test_DataTypesExample/u_DataTypesExample/*

View File

@ -1,3 +1,3 @@
onerror {resume} onerror {resume}
quietly WaveActivateNextPane {} 0 quietly WaveActivateNextPane {} 0
add wave -noupdate /test_top_entity/u_top_entity/* add wave -noupdate /test_alu/u_alu/*