C
cutepotato
Guest
Toto je krátký kód napsaný v jazyce VHDL, běh v Active-hdl.
sestavuje úspěšně, ale špatné výsledky simulace.
Zdá se, že beran nefunguje Nemohu se dostat hodnoty z paměti RAM.
plz byste se podívat na to?Many thanks!
----- 2D FDM
knihovna IEEE;
IEEE.STD_LOGIC_1164.ALL použití;
IEEE.STD_LOGIC_ARITH.ALL použití;
IEEE.STD_LOGIC_UNSIGNED.ALL použití;
IEEE.numeric_std.all použití;jednotka je twoDfdm
port (clk: in std_logic;
en: in std_logic; - umožnit celého obvodu, aby to fungovalo, když '1 '
din: in std_logic_vector (15 downto 0);
reset: in std_logic;
wr: in std_logic;
dout: out std_logic_vector (15 downto 0));
konec twoDfdm;Behaviorální architektura z twoDfdm je
- typ my_array je array (0 až 255) z std_logic_vector (15 downto 0);
--
- signál u: my_array;
- signál v: my_array;signálu addr1: celé číslo v rozmezí 0 až 15;
signálu addr2: celé číslo v rozmezí 0 až 15;
signálu adresa: celé číslo v rozmezí 0 až 255;
signálu address_up: celé číslo v rozmezí 0 až 255;
signálu address_down: celé číslo v rozmezí 0 až 255;
signálu address_right: celé číslo v rozmezí 0 až 255;
signálu address_left: celé číslo v rozmezí 0 až 255;
signálu data1: std_logic_vector (15 downto 0);
signálu data2: std_logic_vector (15 downto 0);
signálu data3: std_logic_vector (15 downto 0);
signálu data4: std_logic_vector (15 downto 0);
signálu data5: std_logic_vector (15 downto 0);
signálu data0: std_logic_vector (15 downto 0);
signálu data9: std_logic_vector (17 downto 0);
signálu znamení: std_logic_vector (11 downto 0);
signálu comp: std_logic;
signálu en_delay: std_logic;
signál WE: std_logic: = '0 ';
signál OE: std_logic: = '0 ';
komponenty ram je
port (Adresa: INTEGER v rozsahu od 0 do 255;
clk: in std_logic;
data: InOut std_logic_vector (15 downto 0);
CS, WE, OE: in std_logic);
konce součástí ram;
začít- Paměť 16 * 16
Proces (reset, CLK) je
- variabilní a1: celé číslo v rozmezí 0 až 15;
- Variabilní a2: celé číslo v rozmezí 0 až 15;
začít
if (reset = '0 ') then
addr1 <= 0;
addr2 <= 0;
rising_edge elsif (CLK) then
if (addr2 = 13), pak
addr1 <= 0;
addr2 <= 0;
elsif addr1 = 13 pak
addr1 <= 0;
addr2 <= addr2 1;
elsif en = '1 ', pak
addr1 <= addr1 1;
- end if;
end if;
end if;
end process;
- adresa
set_addr: process (addr1, addr2) je
začít
- WE <= '1 ';
adresa <= addr1 1 (addr2 1) * 16 po 5NS;
konci procesu set_addr;
- LUT 1 * 4
LUT: process (addr1, addr2) je
začít
address_up <= addr1 1 addr2 * 16 po 5NS;
address_down <= addr1 1 (addr2 2) * 16 po 5NS;
address_right <= addr1 2 (addr2 1) * 16 po 5NS;
address_left <= addr1 (addr2 1) * 16 po 5NS;
konci procesu LUT;g1: beran port map (Adresa => address_up, CLK => CLK, data => data1, CS => cz, WE => WE, OE => OE);
g2: beran port map (Adresa => address_down, CLK => CLK, data => data2, CS => cz, WE => WE, OE => OE);
g3: beran port map (Adresa => address_right, CLK => CLK, data => data3, CS => cz, WE => WE, OE => OE);
G4: beran port map (Adresa => address_left, CLK => CLK, data => data4, CS => cz, WE => WE, OE => OE);
g5: beran port map (Address => Adresa, CLK => CLK, data => data5, CS => cz, WE => WE, OE => OE);
- zmije
vypočítat: process (clk, data1, data2, data3, data4) je
začít
Pokud reset = '0 ', pak
data9 <= (others => '0 ');
rising_edge elsif (CLK) then
data9 <= ( "00" & data1) ( "00" & data2) ( "00" & data3) ( "00" & data4);
end if;
ukončení procesu počítat;- u vstupních údajů
- Vypočte hodnotu konečných diferencí
set_array: process (reset, CLK) je
začít
Pokud reset = '0 ', pak
data1 <= (others => '0 ');
data2 <= (others => '0 ');
data3 <= (others => '0 ');
data4 <= (others => '0 ');
data5 <= (others => '0 ');
rising_edge elsif (CLK) then
if (comp = '1 'a en = '1') then
OE <= '0 ';
WE <= '1 ';
elsif (comp = '0 'a en = '1') then
OE <= '1 ';
WE <= '0 ';
end if;
end if;
konci procesu set_array;- Posoudit, zda nová hodnota rovnající se původní hodnoty
Proces (data9, data5, en, CLK) je
začít
if (en = '0 ') then
znak <= (others => '1 ');
rising_edge elsif (CLK) then
znak <= data5 (15 downto 4) XOR data9 (17 downto 6);
end if;
end process;
- Zpoždění en od hodiny, podle které umožňují signál comp
umožnit: process (reset, CLK) je
začít
if (reset = '0 ') then
en_delay <= '0 ';
rising_edge elsif (CLK) then
en_delay <= en;
end if;
konci procesu umožňují;
- Výstupní signál srovnání výsledku comp
porovnání: process (en_delay, znak) je
začít
Pokud en_delay = '0 ', pak
comp <= '1 ';
elsif sign = "000000000000" a pak
comp <= '0 ';
jiné
comp <= '1 ';
end if;
ukončení procesu porovnání;- Výstup konečného data, kdy končí provoz
Výstup: process (reset, CLK) je
začít
Pokud reset = '0 ', pak
dout <= (others => '0 ');
rising_edge elsif (CLK) then
if (comp = '0 'a en = '1') then
- WE <= '0 ';
- OE <= '1 ';
data0 <= data9 (17 downto 2) po 5NS;
dout <= data0;
jiné
dout <= (others => '0 ');
end if;
end if;
ukončení procesu produkce;
g: beran port map (Address => Adresa, CLK => CLK, data => data0, CS => cz, WE => WE, OE => OE);
konec Behavioral;
-------- je to ram
knihovna IEEE;
IEEE.std_logic_1164.all použití;
IEEE.std_logic_unsigned.all použití;
- ram256x16
jednotka ram je
port (Adresa: INTEGER v rozsahu od 0 do 255;
data: InOut std_logic_vector (15 downto 0);
CS, WE, OE: v std_logic;
CLK: in std_logic
);
konec subjektu ram;
architektura RTL paměti RAM
Typ ram_array je array (0 až 255) z std_logic_vector (15 downto 0);
signálu mem: ram_array;začít
- p0: Proces (CS, WE, OE, Data) je
- typ ram_array je array (0 až 255) z std_logic_vector (15 downto 0);
- variabilní mem: ram_array;
set_array: Proces (CS, CLK) jekonstantní prog: ram_array: = (
16 => "1000000000000000", 32 => "1000000000000000", 48 => "1000000000000000", 64 => "1000000000000000", 80 => "1000000000000000", 96 => "1000000000000000",
112 => "1000000000000000", 128 => "1000000000000000", 144 => "1000000000000000", 160 => "1000000000000000", 176 => "1000000000000000", 192 => "1000000000000000",
208 => "1000000000000000", 224 => "1000000000000000", 240 => "1000000000000000", ostatní => (others => '0 '));
začít
Pokud CS = '0 ', pak
Pokud falling_edge (CLK) then
mem <= prog;
end if;
end if;
konci procesu set_array;read_mem: Proces (adresa, OE)
začít
Pokud OE = '0 ', pak
data <= mem (Address);
jiné
data <= (others => 'Z');
end if;
konci procesu read_mem;
write_mem: Proces (adresa, WE)
začít
kdybychom = '0 ', pak
mem (adresa) <= data;
end if;
konci procesu write_mem;architektura konce RTL;
sestavuje úspěšně, ale špatné výsledky simulace.
Zdá se, že beran nefunguje Nemohu se dostat hodnoty z paměti RAM.
plz byste se podívat na to?Many thanks!
----- 2D FDM
knihovna IEEE;
IEEE.STD_LOGIC_1164.ALL použití;
IEEE.STD_LOGIC_ARITH.ALL použití;
IEEE.STD_LOGIC_UNSIGNED.ALL použití;
IEEE.numeric_std.all použití;jednotka je twoDfdm
port (clk: in std_logic;
en: in std_logic; - umožnit celého obvodu, aby to fungovalo, když '1 '
din: in std_logic_vector (15 downto 0);
reset: in std_logic;
wr: in std_logic;
dout: out std_logic_vector (15 downto 0));
konec twoDfdm;Behaviorální architektura z twoDfdm je
- typ my_array je array (0 až 255) z std_logic_vector (15 downto 0);
--
- signál u: my_array;
- signál v: my_array;signálu addr1: celé číslo v rozmezí 0 až 15;
signálu addr2: celé číslo v rozmezí 0 až 15;
signálu adresa: celé číslo v rozmezí 0 až 255;
signálu address_up: celé číslo v rozmezí 0 až 255;
signálu address_down: celé číslo v rozmezí 0 až 255;
signálu address_right: celé číslo v rozmezí 0 až 255;
signálu address_left: celé číslo v rozmezí 0 až 255;
signálu data1: std_logic_vector (15 downto 0);
signálu data2: std_logic_vector (15 downto 0);
signálu data3: std_logic_vector (15 downto 0);
signálu data4: std_logic_vector (15 downto 0);
signálu data5: std_logic_vector (15 downto 0);
signálu data0: std_logic_vector (15 downto 0);
signálu data9: std_logic_vector (17 downto 0);
signálu znamení: std_logic_vector (11 downto 0);
signálu comp: std_logic;
signálu en_delay: std_logic;
signál WE: std_logic: = '0 ';
signál OE: std_logic: = '0 ';
komponenty ram je
port (Adresa: INTEGER v rozsahu od 0 do 255;
clk: in std_logic;
data: InOut std_logic_vector (15 downto 0);
CS, WE, OE: in std_logic);
konce součástí ram;
začít- Paměť 16 * 16
Proces (reset, CLK) je
- variabilní a1: celé číslo v rozmezí 0 až 15;
- Variabilní a2: celé číslo v rozmezí 0 až 15;
začít
if (reset = '0 ') then
addr1 <= 0;
addr2 <= 0;
rising_edge elsif (CLK) then
if (addr2 = 13), pak
addr1 <= 0;
addr2 <= 0;
elsif addr1 = 13 pak
addr1 <= 0;
addr2 <= addr2 1;
elsif en = '1 ', pak
addr1 <= addr1 1;
- end if;
end if;
end if;
end process;
- adresa
set_addr: process (addr1, addr2) je
začít
- WE <= '1 ';
adresa <= addr1 1 (addr2 1) * 16 po 5NS;
konci procesu set_addr;
- LUT 1 * 4
LUT: process (addr1, addr2) je
začít
address_up <= addr1 1 addr2 * 16 po 5NS;
address_down <= addr1 1 (addr2 2) * 16 po 5NS;
address_right <= addr1 2 (addr2 1) * 16 po 5NS;
address_left <= addr1 (addr2 1) * 16 po 5NS;
konci procesu LUT;g1: beran port map (Adresa => address_up, CLK => CLK, data => data1, CS => cz, WE => WE, OE => OE);
g2: beran port map (Adresa => address_down, CLK => CLK, data => data2, CS => cz, WE => WE, OE => OE);
g3: beran port map (Adresa => address_right, CLK => CLK, data => data3, CS => cz, WE => WE, OE => OE);
G4: beran port map (Adresa => address_left, CLK => CLK, data => data4, CS => cz, WE => WE, OE => OE);
g5: beran port map (Address => Adresa, CLK => CLK, data => data5, CS => cz, WE => WE, OE => OE);
- zmije
vypočítat: process (clk, data1, data2, data3, data4) je
začít
Pokud reset = '0 ', pak
data9 <= (others => '0 ');
rising_edge elsif (CLK) then
data9 <= ( "00" & data1) ( "00" & data2) ( "00" & data3) ( "00" & data4);
end if;
ukončení procesu počítat;- u vstupních údajů
- Vypočte hodnotu konečných diferencí
set_array: process (reset, CLK) je
začít
Pokud reset = '0 ', pak
data1 <= (others => '0 ');
data2 <= (others => '0 ');
data3 <= (others => '0 ');
data4 <= (others => '0 ');
data5 <= (others => '0 ');
rising_edge elsif (CLK) then
if (comp = '1 'a en = '1') then
OE <= '0 ';
WE <= '1 ';
elsif (comp = '0 'a en = '1') then
OE <= '1 ';
WE <= '0 ';
end if;
end if;
konci procesu set_array;- Posoudit, zda nová hodnota rovnající se původní hodnoty
Proces (data9, data5, en, CLK) je
začít
if (en = '0 ') then
znak <= (others => '1 ');
rising_edge elsif (CLK) then
znak <= data5 (15 downto 4) XOR data9 (17 downto 6);
end if;
end process;
- Zpoždění en od hodiny, podle které umožňují signál comp
umožnit: process (reset, CLK) je
začít
if (reset = '0 ') then
en_delay <= '0 ';
rising_edge elsif (CLK) then
en_delay <= en;
end if;
konci procesu umožňují;
- Výstupní signál srovnání výsledku comp
porovnání: process (en_delay, znak) je
začít
Pokud en_delay = '0 ', pak
comp <= '1 ';
elsif sign = "000000000000" a pak
comp <= '0 ';
jiné
comp <= '1 ';
end if;
ukončení procesu porovnání;- Výstup konečného data, kdy končí provoz
Výstup: process (reset, CLK) je
začít
Pokud reset = '0 ', pak
dout <= (others => '0 ');
rising_edge elsif (CLK) then
if (comp = '0 'a en = '1') then
- WE <= '0 ';
- OE <= '1 ';
data0 <= data9 (17 downto 2) po 5NS;
dout <= data0;
jiné
dout <= (others => '0 ');
end if;
end if;
ukončení procesu produkce;
g: beran port map (Address => Adresa, CLK => CLK, data => data0, CS => cz, WE => WE, OE => OE);
konec Behavioral;
-------- je to ram
knihovna IEEE;
IEEE.std_logic_1164.all použití;
IEEE.std_logic_unsigned.all použití;
- ram256x16
jednotka ram je
port (Adresa: INTEGER v rozsahu od 0 do 255;
data: InOut std_logic_vector (15 downto 0);
CS, WE, OE: v std_logic;
CLK: in std_logic
);
konec subjektu ram;
architektura RTL paměti RAM
Typ ram_array je array (0 až 255) z std_logic_vector (15 downto 0);
signálu mem: ram_array;začít
- p0: Proces (CS, WE, OE, Data) je
- typ ram_array je array (0 až 255) z std_logic_vector (15 downto 0);
- variabilní mem: ram_array;
set_array: Proces (CS, CLK) jekonstantní prog: ram_array: = (
16 => "1000000000000000", 32 => "1000000000000000", 48 => "1000000000000000", 64 => "1000000000000000", 80 => "1000000000000000", 96 => "1000000000000000",
112 => "1000000000000000", 128 => "1000000000000000", 144 => "1000000000000000", 160 => "1000000000000000", 176 => "1000000000000000", 192 => "1000000000000000",
208 => "1000000000000000", 224 => "1000000000000000", 240 => "1000000000000000", ostatní => (others => '0 '));
začít
Pokud CS = '0 ', pak
Pokud falling_edge (CLK) then
mem <= prog;
end if;
end if;
konci procesu set_array;read_mem: Proces (adresa, OE)
začít
Pokud OE = '0 ', pak
data <= mem (Address);
jiné
data <= (others => 'Z');
end if;
konci procesu read_mem;
write_mem: Proces (adresa, WE)
začít
kdybychom = '0 ', pak
mem (adresa) <= data;
end if;
konci procesu write_mem;architektura konce RTL;