Приложение 1. Текст программной части на VHDL.
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.STD_LOGIC_ARITH.all;
use IEEE.MATH_REAL.all;
entity DWS is
port (
-- ВХОДЫ
LOADPIC : in UNSIGNED (7 downto 0) := ("00000000");-- вход последовательной загрузки RGB
CONTROL : in UNSIGNED (3 downto 0) := ("0000"); -- вход управления процессором
RESET : in STD_LOGIC := '1'; -- сброс (1->0)
CLK : in STD_LOGIC := '0'; -- тактирование (0->1)
OUTBUSY : in STD_LOGIC := '1'; -- (1)-внешн. готов принять выходные данные; LOAD : in STD_LOGIC := '0'; -- признак загрузки
-- ВЫХОДЫ
NEXTCOLOR : out STD_LOGIC := '0'; -- цвет загружен можно загружать следующий
UNLOADPIC : out UNSIGNED (7 downto 0) := ("00000000");-- последовательный выход счетчик+RGB
INBUSY : out STD_LOGIC := '0'; -- (1)-готов принять входные данные; (0)-нет
ERROR : out STD_LOGIC := '0'; -- произошла ошибка
UNLOAD : out STD_LOGIC := '1' -- признак выгрузки
);
end DWS;
architecture MAIN of DWS is
type KEEPER is array( INTEGER range 0 to 197120) of UNSIGNED (7 downto 0);
type InfoStore is array (INTEGER range 0 to 20480) of STD_LOGIC;
begin
process(RESET,CLK,OUTBUSY,CONTROL,LOADPIC)
variable RRStore : KEEPER; -- Хранилище RED
variable GRStore : KEEPER; -- Хранилище GREEN
variable BRStore : KEEPER; -- Хранилище BLUE
variable WaterMark : InfoStore; --Хранилище ЦВЗ
variable WR : KEEPER; -- Хранилище СЖАТОГО RED
variable WG : KEEPER; --Хранилище СЖАТОГО GREEN
variable WB : KEEPER; -- Хранилище СЖАТОГО BLUE
variable FlagReg : UNSIGNED (14 downto 0) := ("000000000000000");- ФЛАГОВЫЙ РЕГИСТР
variable Counter1 : INTEGER range 0 to 3 :=0;--пересчет в равноконтрольную. систему
variable MIDDLE : UNSIGNED (7 downto 0); -- записываемый водяной знак
variable POSITION : INTEGER; -- в какой квадрат записываем
--+++++++++++++ определение среднего значения и его положения +++++++++++++++++
procedure MaxPos(x,y,z : UNSIGNED (7 downto 0); WM : STD_LOGIC ) is
variable TMin,TMid,TMax : UNSIGNED (7 downto 0);
variable res, MID,Sigma : INTEGER;
begin
TMax := x; res := 1;
if (y > x) and (y > z) then
TMax := y; res := 2;
elsif (z > x) and (z > y) then
TMax := z; res := 3;
end if;
if res = 1 then
if y > z then
TMid := y; TMin := z; POSITION := 2;
else
TMid := z; TMin := y; POSITION := 3;
end if;
elsif res = 2 then
if x > z then
TMid := x; TMin := z; POSITION := 1;
else
TMid := z; TMin := x; POSITION := 3;
end if;
else
if x > y then
TMid := x; TMin := y; POSITION := 1;
else
TMid := y; TMin := x; POSITION := 2;
end if;
end if;
Sigma := INTEGER(CONV_INTEGER(Tmax-Tmin)/7);
if WM = '0' then
Sigma := INTEGER(CONV_INTEGER(TMid)-Sigma+(Sigma/4));
else
Sigma := INTEGER(CONV_INTEGER(TMid)+(Sigma/4));
end if;
MIDDLE := CONV_UNSIGNED(Sigma,8);
end;
----+++++++++ определение среднего значения и его положения +++++++++++++++++++++
procedure PutSign(g:Integer) is
variable counter : INTEGER;
begin
--+++++++++++++++++++ для красного ++++++++++++++++++++
counter := 0;
--большой квадрат
for i in 0 downto 127 loop
for j in 0 downto 127 loop
MaxPos(WR(128+i*256+j),WR(32768+i*256+j),WR(32896+i*256+j), WaterMark(counter));
if POSITION = 1 then WR(128+i*256+j) := MIDDLE;
elsif POSITION = 2 then WR(32768+i*256+j) := MIDDLE;
elsif POSITION = 3 then WR(32896+i*256+j) := MIDDLE;
end if;
counter := counter + 1;
end loop;
end loop;
--малый квадрат
for i in 0 downto 63 loop
for j in 0 downto 63 loop
MaxPos(WR(64+i*256+j),WR(16384+i*256+j),WR(16448+i*256+j), WaterMark(counter));
if POSITION = 1 then WR(64+i*256+j) := MIDDLE;
elsif POSITION = 2 then WR(16384+i*256+j) := MIDDLE;
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.