You are on page 1of 5

Горбань Ю. В.

, КІ-18
Лабораторна робота №3
Робота з масивами

Написати і провести тестування двох функцій і двох процедур.


1. Функція(процедура) знаходження в двійковій матриці В рядка J з
максимальним сумарним числом одиниць. Видати номер рядка та
сумарну кількість одиниць.
2. Функція(процедура) знаходження в двійковій матриці В стовпця з
мінімальною сумарною кількістю одиниць. Видати номер стовпця і
сумарну кількість одиниць.
Тип матриці розмірністю NxN визначити в пакеті.

Пакет з визначенням типу матриці:


library ieee;
use ieee.std_logic_1164.all;

package Int_Matrix is
type int_matrix is array(NATURAL range <>, NATURAL range <>)
of integer;
end package Int_Matrix;

Функція знаходження в двійковій матриці рядка з максимальним сумарним


числом одиниць:
library IEEE;
use IEEE.std_logic_1164.all;
use work.INT_MATRIX.all;

entity lab3_1 is
end lab3_1;

architecture lab3_1 of lab3_1 is


type return_array is array(0 to 1) of integer;
function find_max(n,m:integer; a : int_matrix) return
return_array is
variable Sum : integer :=0;
variable s : integer :=0;
variable J : integer :=0;
begin
for i in 0 to n-1 loop
for j in 0 to m-1 loop
s := s + a(i,j);
end loop;
if s > Sum then
Sum := s;
J := i;
end if;
s := 0;
end loop;
return (Sum, J);
end find_max;
Горбань Ю. В., КІ-18
begin
process
variable N : integer := 5;
variable M : integer := 6;
variable A : int_matrix(0 to 4, 0 to 5) :=
((0,0,1,1,0,1),
(1,0,0,1,0,0),
(1,1,0,0,0,1),
(0,0,0,1,0,0),
(1,1,1,1,1,1));

variable res:return_array := find_max(N,M,A);


begin
report "Max Sum = " &integer'image(res(0));
report "In row " &integer'image(res(1));
wait;
end process;

end lab3_1

Рисунок 3.1 – Результат роботи функції

Процедура знаходження в двійковій матриці рядка з максимальним


сумарним числом одиниць:
library IEEE;
use IEEE.std_logic_1164.all;
use work.INT_MATRIX.all;

entity \Lab3_1(proc)\ is
end \Lab3_1(proc)\;

architecture \Lab3_1(proc)\ of \Lab3_1(proc)\ is

procedure find_max(constant N:in integer;


constant M:in integer;
constant A:in int_matrix;
variable sum:inout integer;
variable row:out integer) is
variable s:integer :=0;
begin
for i in 0 to N-1 loop
for j in 0 to M-1 loop
s := s + a(i,j);
end loop;
if s > sum then
sum := s;
row := i;
Горбань Ю. В., КІ-18
end if;
s := 0;
end loop;
end procedure;

begin
process is
variable N : integer := 5;
variable M : integer := 6;
variable A : int_matrix(0 to 4, 0 to 5) :=
((0,0,1,1,0,1),
(1,0,0,1,0,0),
(1,1,0,0,0,1),
(0,0,0,1,0,0),
(1,1,1,1,1,1));
variable sum:integer :=0;
variable row:integer:=0;

begin
find_max(N,M,A,sum,row);
report "Max Sum = " &integer'image(sum);
report "In row " &integer'image(row);
wait;
end process;
end \Lab3_1(proc)\;

Рисунок 3.2 – Результат роботи процедури

Функція знаходження в двійковій матриці стовпця з мінімальною сумарною


кількістю одиниць:
library IEEE;
use IEEE.std_logic_1164.all;
use work.INT_MATRIX.all;

entity lab3_2 is
end lab3_2;

architecture lab3_2 of lab3_2 is

type result is array(0 to 1) of integer;

function find_min(n:integer; a:int_matrix) return result is


variable sum:integer := n;
variable s:integer := 0;
variable J:integer :=0;
begin
Горбань Ю. В., КІ-18
for i in 0 to n-1 loop
for j in 0 to n-1 loop
s := s + a(j,i);
end loop;
if s < sum then
sum := s;
J := i;
end if;
s := 0;
end loop;
return (sum, J);
end find_min;

begin

process is
variable N:integer := 6;
variable A : int_matrix(0 to 5, 0 to 5) :=
((0,0,0,1,0,1),
(1,0,0,1,0,0),
(1,1,0,0,0,1),
(0,1,0,1,0,0),
(0,0,0,1,1,0),
(1,1,1,1,1,1));
variable res:result;
begin
res := find_min(N,A);
report "min sum = " &integer'image(res(0));
report "in " &integer'image(res(1)) &" column";
wait;
end process;
end lab3_2;

Рисунок 3.3 – Результат роботи функції

Процедура знаходження в двійковій матриці стовпця з мінімальною


сумарною кількістю одиниць:
library IEEE;
use IEEE.std_logic_1164.all;
use work.INT_MATRIX.all;

entity lab3_2_proc is
end lab3_2_proc;

architecture lab3_2_proc of lab3_2_proc is

procedure find_min(constant N:in integer;


Горбань Ю. В., КІ-18
constant A:in int_matrix;
variable res_sum:out integer;
variable col:out integer) is
variable s:integer := 0;
variable sum:integer := N;
begin
for i in 0 to N-1 loop
for j in 0 to N-1 loop
s := s + a(j,i);
end loop;
if s < sum then
sum := s;
col := i;
end if;
s := 0;
end loop;
res_sum := sum;
end procedure;

begin
process is
variable N:integer:= 6;
variable A : int_matrix(0 to 5, 0 to 5) :=
((0,0,0,1,0,1),
(1,0,0,1,0,0),
(1,1,0,0,0,1),
(0,1,0,1,0,0),
(0,0,0,1,1,0),
(1,1,1,1,1,1));
variable sum:integer;
variable col:integer;
begin
find_min(N,A,sum,col);
report "min sum = " &integer'image(sum);
report "in " &integer'image(col) &" column";
wait;
end process;
end lab3_2_proc;

Рисунок 3.4 – Результат роботи процедури

Висновок: в ході лабораторної роботи було засвоєно поняття пакету в мові


VHDL; створено пакет, що визначає тип матриці; засвоєно принципи
створення функцій та процедур, а також різницю між ними.

You might also like