Maciej
G.
Projektant /
Programista, Famor
S.A.
Temat: Jak prawidłowo wygenerować funkcję (odczyt z ROM) w VHDL
Witam,mam następujący problem.
Użyłem generycznego modułu VHDL do generowania sygnału PWM na FPGA za strony projektu:
https://eewiki.net/pages/viewpage.action?pageId=2093934...
Generator działa bardzo dobrze (zegar 10 MHz, częstotliwość PWM 20 KHz, rozdzielczość PWM 8 bit)
Teraz ośmiobitowy wektor zadający wypełnienie mam podłączony do ośmiu switchy na płytce FPGA.
Jakie jest prawidłowe podejście do generowania serii wektorów określających wypełnienia w funkcji czasu (zawsze taki sam przebieg jak odczyt z ROM ze stałą częstotliwością PWM).
Pewnie trzeba utworzyć proces sekwencyjny .. i co dalej. Jaki byłby szkielet kodu?
Na razie znalazłem jak zaemulować "mały" ROM:
library ieee;
use ieee.std_logic_1164.all;
entity ROM is
port ( address : in std_logic_vector(3 downto 0);
data : out std_logic_vector(7 downto 0) );
end entity ROM;
architecture behavioral of ROM is
type mem is array ( 0 to 2**5 - 1) of std_logic_vector(7 downto 0);
constant my_Rom : mem := (
0 => "00000000",
1 => "00000001",
2 => "00000010",
3 => "00000011",
4 => "00000100",
5 => "11110000",
6 => "11110000",
7 => "11110000",
8 => "11110000",
9 => "11110000",
10 => "11110000",
11 => "11110000",
12 => "11110000",
13 => "11110000",
14 => "11110000",
15 => "11110000",
16 => "00000000",
17 => "00000001",
18 => "00000010",
19 => "00000011",
20 => "00000100",
21 => "11110000",
22 => "11110000",
23 => "11110000",
24 => "11110000",
25 => "11110000",
26 => "11110000",
27 => "11110000",
28 => "11110000",
29 => "11110000",
30 => "11110000",
31 => "11110000",
);
begin
process (address)
begin
case address is
when "00000" => data <= my_rom(0);
when "00001" => data <= my_rom(1);
when "00010" => data <= my_rom(2);
when "00011" => data <= my_rom(3);
when "00100" => data <= my_rom(4);
when "00101" => data <= my_rom(5);
when "00110" => data <= my_rom(6);
when "00111" => data <= my_rom(7);
when "01000" => data <= my_rom(8);
when "01001" => data <= my_rom(9);
when "01010" => data <= my_rom(10);
when "01011" => data <= my_rom(11);
when "01100" => data <= my_rom(12);
when "01101" => data <= my_rom(13);
when "01110" => data <= my_rom(14);
when "01111" => data <= my_rom(15);
when "10000" => data <= my_rom(16);
when "10001" => data <= my_rom(17);
when "10010" => data <= my_rom(18);
when "10011" => data <= my_rom(19);
when "10100" => data <= my_rom(20);
when "10101" => data <= my_rom(21);
when "10110" => data <= my_rom(22);
when "10111" => data <= my_rom(23);
when "11000" => data <= my_rom(24);
when "11001" => data <= my_rom(25);
when "11010" => data <= my_rom(26);
when "11011" => data <= my_rom(27);
when "11100" => data <= my_rom(28);
when "11101" => data <= my_rom(29);
when "11110" => data <= my_rom(30);
when "11111" => data <= my_rom(31);
when others => data <= "00000000";
end case;
end process;
end architecture behavioral;
Czy teraz byłoby dobrym pomysłem utworzenie jeszcze jednego komponentu, który z odpowiednio wolnym zegarem "wypluje" zawartość ROM - wektory określające wypełnienie dla generatora PWM?
Zastanawiam się czy proces ROM mógłby wyglądać po prostu tak:
library ieee;
use ieee.std_logic_1164.all;
entity ROM1 is
port (data : out std_logic_vector(7 downto 0) );
end entity ROM1;
architecture behavioral of ROM1 is
begin
process ()
begin
data <= "00000000";
wait for 1000000000 ns;
data <= "00000000";
wait for 1000000000 ns;
data <= "00001111";
wait for 1000000000 ns;
data <= "00011111";
wait for 1000000000 ns;
data <= "00111111";
wait for 1000000000 ns;
data <= "01111111";
wait for 1000000000 ns;
data <= "11111111";
wait for 1000000000 ns;
end process;
end architecture behavioral;
Sorry wait for jest "nie-syntezowalne" i mam błędyTen post został edytowany przez Autora dnia 17.08.17 o godzinie 19:47