C
cutepotato
Guest
Este é um código curto escrito em VHDL, executado no Active-HDL.
ele compila com sucesso, mas os resultados da simulação errado.
o carneiro que parece não funcionar como eu não pode obter o valor da memória RAM.
plz se você tem um olhar para ela?Muito obrigado!
----- 2D FDM
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
uso IEEE.numeric_std.all;twoDfdm entidade é
port (clk: in std_logic;
EN: in std_logic; - permitir que todo o circuito, fazer o trabalho quando '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));
twoDfdm final;architecture Behavioral of twoDfdm é
- my_array tipo é array (0 a 255) de std_logic_vector (15 downto 0);
--
- sinal de u: myArray;
- sinal de v: myArray;sinal addr1: intervalo inteiro 0 a 15;
sinal addr2: intervalo inteiro 0 a 15;
Endereço do sinal: intervalo inteiro de 0-255;
address_up sinal: intervalo inteiro de 0-255;
address_down sinal: intervalo inteiro de 0-255;
address_right sinal: intervalo inteiro de 0-255;
address_left sinal: intervalo inteiro de 0-255;
sinal data1: std_logic_vector (15 downto 0);
sinal data2: std_logic_vector (15 downto 0);
sinal data3: std_logic_vector (15 downto 0);
sinal data4: std_logic_vector (15 downto 0);
sinal data5: std_logic_vector (15 downto 0);
sinal data0: std_logic_vector (15 downto 0);
sinal data9: std_logic_vector (17 downto 0);
sinal sinal: std_logic_vector (11 downto 0);
comp sinal: std_logic;
en_delay sinal: std_logic;
WE sinal: std_logic: = '0 ';
OE sinal: std_logic: = '0 ';
ram componente é
porto (Endereço: Integer no intervalo 0-255;
clk: in std_logic;
Data: inout std_logic_vector (15 downto 0);
CS, WE, OE: in std_logic);
ram componente end;
começo- Memória de 16 * 16
reset (processo, clk) é
- variável A1: intervalo inteiro 0 a 15;
- Variável a2: intervalo inteiro 0 a 15;
começo
if (reset = '0 ') then
addr1 <= 0;
addr2 <= 0;
rising_edge elsif (clk) then
if (addr2 = 13) então
addr1 <= 0;
addr2 <= 0;
elsif addr1 = 13 então
addr1 <= 0;
addr2 <= addr2 1;
elsif en = '1 'then
addr1 <= addr1 1;
- end if;
END IF;
END IF;
end process;
- endereço
set_addr: processo (addr1, addr2) é
começo
- WE <= '1 ';
endereço <= addr1 1 (addr2 1) * 16 após 5ns;
set_addr processo final;
- LUT 1 * 4
LUT: processo (addr1, addr2) é
começo
address_up <= addr1 1 addr2 * 16 após 5ns;
address_down <= addr1 1 (addr2 2) * 16 após 5ns;
address_right <= addr1 2 (addr2 1) * 16 após 5ns;
address_left <= addr1 (addr2 1) * 16 após 5ns;
LUT processo final;G1: mapa do porto de RAM (endereço address_up =>, CLK clk =>, os dados => data1, CS => PT, WE => WE, OE => OE);
G2: mapa do porto de RAM (Address => address_down, CLK clk =>, os dados => data2, CS => PT, WE => WE, OE => OE);
G3: mapa do porto de RAM (endereço address_right =>, CLK clk =>, os dados => data3, CS => PT, WE => WE, OE => OE);
G4: mapa do porto de RAM (endereço address_left =>, CLK clk =>, os dados => data4, CS => PT, WE => WE, OE => OE);
G5: mapa do porto de RAM (Address = endereço>, CLK clk =>, os dados => data5, CS => PT, WE => WE, OE => OE);
- somador
computar: process (clk, data1, data2, data3, data4) é
começo
if reset = '0 'then
data9 <= (others => '0 ');
rising_edge elsif (clk) then
data9 <= ( "00" & data1) ( "00" & data2) ( "00" & data3) ( "00" & data4);
END IF;
processo final de computação;- u de entrada de dados
- Calcular o valor das diferenças finitas
set_array: process (reset, clk) é
começo
if reset = '0 'then
data1 <= (others => '0 ');
data2 <= (others => '0 ');
data3 <= (others => '0 ');
data4 <= (others => '0 ');
data5 <= (others => '0 ');
rising_edge elsif (clk) then
if (comp = '1 'e en = '1') then
OE <= '0 ';
WE <= '1 ';
elsif (comp = '0 'e en = '1') then
OE <= '1 ';
WE <= '0 ';
END IF;
END IF;
set_array processo final;- Avaliar se o novo valor igual ao valor original
processo (data9, data5, en, clk) é
começo
if (en = '0 ') then
sinal <= (others => '1 ');
rising_edge elsif (clk) then
sinal <= data5 (downto 15 4) XOR data9 (17 downto 6);
END IF;
end process;
- Atraso en pelo relógio, pelo que permitem uma miniatura de sinal
permitir: process (reset, clk) é
começo
if (reset = '0 ') then
en_delay <= '0 ';
rising_edge elsif (clk) then
en_delay <= en;
END IF;
processo final permitir;
- Saída de sinal de comparação comp resultado
Compare: processo (en_delay, sinal) é
começo
Se en_delay = '0 'then
comp <= '1 ';
elsif sinal = "000000000000", então
comp <= '0 ';
diferente
comp <= '1 ';
END IF;
processo final comparar;- Saída os dados finais, quando termina a operação
saída: process (reset, clk) é
começo
if reset = '0 'then
dout <= (others => '0 ');
rising_edge elsif (clk) then
if (comp = '0 'e en = '1') then
- WE <= '0 ';
- OE <= '1 ';
data0 <= data9 (downto 17 2) depois de 5ns;
dout <= data0;
diferente
dout <= (others => '0 ');
END IF;
END IF;
processo de produção final;
g: mapa do porto de RAM (Address = endereço>, CLK clk =>, os dados => data0, CS => PT, WE => WE, OE => OE);
end Behavioral;
-------- Esta é a ram
library IEEE;
use IEEE.std_logic_1164.all;
uso ieee.std_logic_unsigned.all;
- ram256x16
ram entidade é
porto (Endereço: Integer no intervalo 0-255;
Data: inout std_logic_vector (15 downto 0);
CS, WE, OE: in std_logic;
CLK: in std_logic
);
ram entidade final;
RTL arquitetura de memória RAM é
ram_array tipo é array (0 a 255) de std_logic_vector (15 downto 0);
mem sinal: ram_array;começo
- p0: process (CS, WE, OE, Data) é
- ram_array tipo é array (0 a 255) de std_logic_vector (15 downto 0);
- Mem variável: ram_array;
set_array: process (CS, CLK) éprog constante: 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", others => (others => '0 '));
começo
Se CS = '0 'then
Se falling_edge (CLK), então
mem <= prog;
END IF;
END IF;
set_array processo final;read_mem: processo (Endereço, OE)
começo
se OE = '0 'then
dados <= mem (Address);
diferente
dados <= (others => 'Z');
END IF;
read_mem processo final;
write_mem: processo (Endereço, WE)
começo
Se WE = '0 'then
MEM (address) <= data;
END IF;
write_mem processo final;arquitetura final RTL;
ele compila com sucesso, mas os resultados da simulação errado.
o carneiro que parece não funcionar como eu não pode obter o valor da memória RAM.
plz se você tem um olhar para ela?Muito obrigado!
----- 2D FDM
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
uso IEEE.numeric_std.all;twoDfdm entidade é
port (clk: in std_logic;
EN: in std_logic; - permitir que todo o circuito, fazer o trabalho quando '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));
twoDfdm final;architecture Behavioral of twoDfdm é
- my_array tipo é array (0 a 255) de std_logic_vector (15 downto 0);
--
- sinal de u: myArray;
- sinal de v: myArray;sinal addr1: intervalo inteiro 0 a 15;
sinal addr2: intervalo inteiro 0 a 15;
Endereço do sinal: intervalo inteiro de 0-255;
address_up sinal: intervalo inteiro de 0-255;
address_down sinal: intervalo inteiro de 0-255;
address_right sinal: intervalo inteiro de 0-255;
address_left sinal: intervalo inteiro de 0-255;
sinal data1: std_logic_vector (15 downto 0);
sinal data2: std_logic_vector (15 downto 0);
sinal data3: std_logic_vector (15 downto 0);
sinal data4: std_logic_vector (15 downto 0);
sinal data5: std_logic_vector (15 downto 0);
sinal data0: std_logic_vector (15 downto 0);
sinal data9: std_logic_vector (17 downto 0);
sinal sinal: std_logic_vector (11 downto 0);
comp sinal: std_logic;
en_delay sinal: std_logic;
WE sinal: std_logic: = '0 ';
OE sinal: std_logic: = '0 ';
ram componente é
porto (Endereço: Integer no intervalo 0-255;
clk: in std_logic;
Data: inout std_logic_vector (15 downto 0);
CS, WE, OE: in std_logic);
ram componente end;
começo- Memória de 16 * 16
reset (processo, clk) é
- variável A1: intervalo inteiro 0 a 15;
- Variável a2: intervalo inteiro 0 a 15;
começo
if (reset = '0 ') then
addr1 <= 0;
addr2 <= 0;
rising_edge elsif (clk) then
if (addr2 = 13) então
addr1 <= 0;
addr2 <= 0;
elsif addr1 = 13 então
addr1 <= 0;
addr2 <= addr2 1;
elsif en = '1 'then
addr1 <= addr1 1;
- end if;
END IF;
END IF;
end process;
- endereço
set_addr: processo (addr1, addr2) é
começo
- WE <= '1 ';
endereço <= addr1 1 (addr2 1) * 16 após 5ns;
set_addr processo final;
- LUT 1 * 4
LUT: processo (addr1, addr2) é
começo
address_up <= addr1 1 addr2 * 16 após 5ns;
address_down <= addr1 1 (addr2 2) * 16 após 5ns;
address_right <= addr1 2 (addr2 1) * 16 após 5ns;
address_left <= addr1 (addr2 1) * 16 após 5ns;
LUT processo final;G1: mapa do porto de RAM (endereço address_up =>, CLK clk =>, os dados => data1, CS => PT, WE => WE, OE => OE);
G2: mapa do porto de RAM (Address => address_down, CLK clk =>, os dados => data2, CS => PT, WE => WE, OE => OE);
G3: mapa do porto de RAM (endereço address_right =>, CLK clk =>, os dados => data3, CS => PT, WE => WE, OE => OE);
G4: mapa do porto de RAM (endereço address_left =>, CLK clk =>, os dados => data4, CS => PT, WE => WE, OE => OE);
G5: mapa do porto de RAM (Address = endereço>, CLK clk =>, os dados => data5, CS => PT, WE => WE, OE => OE);
- somador
computar: process (clk, data1, data2, data3, data4) é
começo
if reset = '0 'then
data9 <= (others => '0 ');
rising_edge elsif (clk) then
data9 <= ( "00" & data1) ( "00" & data2) ( "00" & data3) ( "00" & data4);
END IF;
processo final de computação;- u de entrada de dados
- Calcular o valor das diferenças finitas
set_array: process (reset, clk) é
começo
if reset = '0 'then
data1 <= (others => '0 ');
data2 <= (others => '0 ');
data3 <= (others => '0 ');
data4 <= (others => '0 ');
data5 <= (others => '0 ');
rising_edge elsif (clk) then
if (comp = '1 'e en = '1') then
OE <= '0 ';
WE <= '1 ';
elsif (comp = '0 'e en = '1') then
OE <= '1 ';
WE <= '0 ';
END IF;
END IF;
set_array processo final;- Avaliar se o novo valor igual ao valor original
processo (data9, data5, en, clk) é
começo
if (en = '0 ') then
sinal <= (others => '1 ');
rising_edge elsif (clk) then
sinal <= data5 (downto 15 4) XOR data9 (17 downto 6);
END IF;
end process;
- Atraso en pelo relógio, pelo que permitem uma miniatura de sinal
permitir: process (reset, clk) é
começo
if (reset = '0 ') then
en_delay <= '0 ';
rising_edge elsif (clk) then
en_delay <= en;
END IF;
processo final permitir;
- Saída de sinal de comparação comp resultado
Compare: processo (en_delay, sinal) é
começo
Se en_delay = '0 'then
comp <= '1 ';
elsif sinal = "000000000000", então
comp <= '0 ';
diferente
comp <= '1 ';
END IF;
processo final comparar;- Saída os dados finais, quando termina a operação
saída: process (reset, clk) é
começo
if reset = '0 'then
dout <= (others => '0 ');
rising_edge elsif (clk) then
if (comp = '0 'e en = '1') then
- WE <= '0 ';
- OE <= '1 ';
data0 <= data9 (downto 17 2) depois de 5ns;
dout <= data0;
diferente
dout <= (others => '0 ');
END IF;
END IF;
processo de produção final;
g: mapa do porto de RAM (Address = endereço>, CLK clk =>, os dados => data0, CS => PT, WE => WE, OE => OE);
end Behavioral;
-------- Esta é a ram
library IEEE;
use IEEE.std_logic_1164.all;
uso ieee.std_logic_unsigned.all;
- ram256x16
ram entidade é
porto (Endereço: Integer no intervalo 0-255;
Data: inout std_logic_vector (15 downto 0);
CS, WE, OE: in std_logic;
CLK: in std_logic
);
ram entidade final;
RTL arquitetura de memória RAM é
ram_array tipo é array (0 a 255) de std_logic_vector (15 downto 0);
mem sinal: ram_array;começo
- p0: process (CS, WE, OE, Data) é
- ram_array tipo é array (0 a 255) de std_logic_vector (15 downto 0);
- Mem variável: ram_array;
set_array: process (CS, CLK) éprog constante: 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", others => (others => '0 '));
começo
Se CS = '0 'then
Se falling_edge (CLK), então
mem <= prog;
END IF;
END IF;
set_array processo final;read_mem: processo (Endereço, OE)
começo
se OE = '0 'then
dados <= mem (Address);
diferente
dados <= (others => 'Z');
END IF;
read_mem processo final;
write_mem: processo (Endereço, WE)
começo
Se WE = '0 'then
MEM (address) <= data;
END IF;
write_mem processo final;arquitetura final RTL;