Temat: [VHDL] Alg. Euklidesa
Wykonałem implementację.
Układ przechodzi poprawnie symulację w ModelSimie.
Wykonując kompilację w Quartusie otrzymuję błąd:
"error : out of memory in module quartus_map.exe (4278 megabytes used)". Próbowałem zwalniać RAM - nie pomaga.
Opis:
Na Start='1', w 16 cyklach zegara układ czyta dane, a następnie wykonuje obliczenia (16 cyklów, ponieważ 1024-bitów/64-bitów = 16).
Po wykonaniu obliczeń Koniec <='1' i w 16 cyklach zwracany jest wynik.
Reset układu jest wykonywany jeśli Start='0'.
Operacja modulo (dzielenia): https://en.wikipedia.org/wiki/Division_algorithm#Intege...
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;
library altera;
use altera.altera_primitives_components.all;
entity Euclidean is
Port(
Clk : in std_logic;
Start : in std_logic;
WejDane1 : in unsigned(63 downto 0);
WejDane2 : in unsigned(63 downto 0);
Koniec : out std_logic;
Error : out std_logic;
WyjDane : out unsigned(63 downto 0)
);
end Euclidean;
architecture rtl of Euclidean is
-- numeric_std
function ADD_UNSIGNED ( L,R: UNSIGNED; C: STD_LOGIC ) return UNSIGNED is
constant L_left:INTEGER:= L'length-1;
alias XL: UNSIGNED(L_left downto 0) is L;
alias XR: UNSIGNED(L_left downto 0) is R;
variable RESULT: UNSIGNED(L_left downto 0);
variable CBIT : STD_LOGIC:= C;
begin
for i in 0 to L_left loop
RESULT(i) := CBIT xor XL(i) xor XR(i);
CBIT := (CBIT and XL(i)) or (CBIT and XR(i)) or (XL(i) and XR(i));
end loop;
return RESULT;
end ADD_UNSIGNED;
begin
process(Clk,Start)
variable r1 : unsigned(1023 downto 0) := (others=>'0');
variable r2 : unsigned(1023 downto 0) := (others=>'0');
variable r3 : unsigned(1023 downto 0) := (others=>'0');
variable r4 : unsigned(1023 downto 0) := (others=>'0');
variable Stan, Iterator : integer := 0;
begin
-- Procedura
if Start = '0' then
-- Reset
Stan := 0; Iterator := 0;
r1 := (others=>'0'); r2 := (others=>'0'); r3 := (others=>'0');
Koniec <= '0'; Error <= '0';
WyjDane <= (others=>'0');
else
if Clk'event and Clk='1' then
case Stan is
-- 0 = Odczyt
-- 1 = Obliczenia
-- 2 = Zapis
-- (5) others = Wyjatek 0
when 0 => -- Odczyt
--@ Odczyt @
r1((16-Iterator)*64-1 downto (15-Iterator)*64) := WejDane1;
r2((16-Iterator)*64-1 downto (15-Iterator)*64) := WejDane2;
Iterator := Iterator + 1;
if Iterator >= 16 then
Stan := 1;
Iterator := 0;
end if;
--# Odczyt Koniec #
when 1 => -- Obliczenia
--@ Obliczenia @
case Iterator is
when 0 =>
if r2=to_unsigned(0, 1023) then
Stan := 2;
else
Iterator := 1;
r3 := r2;
r2 := (others=>'0');
end if;
when 1 =>
for i in 0 to 1023 loop
r2 := shift_left(r2, 1);
r2(0) := r1(1023-i);
if r2>=r3 then
r2 := ADD_UNSIGNED(r2, not r3, '1');
end if;
end loop;
r1 := r3;
Iterator := 0;
when others =>
Iterator := 0;
Stan := 0;
Error <= '1';
end case;
--# Obliczenia Koniec # when others => -- Zapis
--@ Zapis @
Koniec <= '1';
WyjDane <= r1((16-Iterator)*64-1 downto (15-Iterator)*64);
Iterator := Iterator + 1;
if Iterator >= 16 then
Iterator := 0;
end if;
--# Zapis Koniec #
end case;
end if;
end if;
end process;
end rtl;
Ten post został edytowany przez Autora dnia 18.07.19 o godzinie 18:10