Важная информация

User Tag List

Страница 3 из 5 ПерваяПервая 12345 ПоследняяПоследняя
Показано с 21 по 30 из 49

Тема: Спекки на FPGA с минимумом корпусов.

  1. #21
    Activist
    Регистрация
    26.07.2015
    Адрес
    г. Хабаровск
    Сообщений
    221
    Спасибо Благодарностей отдано 
    13
    Спасибо Благодарностей получено 
    3
    Поблагодарили
    3 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    На Марсоходе подсказали использовать файл epcs_virtual_memory вот разбираюсь пока с нюансами. Добавил файл в проект, сформировал модуль из файла, в библиотеке добавились 4 символа.

    В самом модуле надо исправить cyclone_ на cycloneii_

    Код:
    --synthesis read_comments_as_HDL on
    --COMPONENT cycloneii_asmiblock is
    --PORT (
    --   signal data0out : OUT STD_LOGIC;
    --       signal oe : IN STD_LOGIC;
    --       signal scein : IN STD_LOGIC;
    --        signal dclkin : IN STD_LOGIC;
    --        signal sdoin : IN STD_LOGIC
    --      );
    --END COMPONENT cycloneii_asmiblock;
    --synthesis read_comments_as_HDL off
    В визарде надо создать 2-ух портовую ОЗУ для кэша на 256 байт.

    И дальше мне уже надо пилить "mem_ctrl" чтобы он загружал данные в ОЗУ и запускал Z80.

  2. #22
    Activist
    Регистрация
    27.11.2010
    Адрес
    Пенза
    Сообщений
    331
    Спасибо Благодарностей отдано 
    23
    Спасибо Благодарностей получено 
    11
    Поблагодарили
    10 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    А зачем двухпортовую озу? Разве нельзя напрямую байт за байтом копировать?

  3. #23
    Activist
    Регистрация
    26.07.2015
    Адрес
    г. Хабаровск
    Сообщений
    221
    Спасибо Благодарностей отдано 
    13
    Спасибо Благодарностей получено 
    3
    Поблагодарили
    3 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от kox Посмотреть сообщение
    А зачем двухпортовую озу? Разве нельзя напрямую байт за байтом копировать?
    Непосредственно сам модуль требует, хотя если только раз прочитать, то регистра хватило бы за глаза.

  4. #24
    Activist
    Регистрация
    27.11.2010
    Адрес
    Пенза
    Сообщений
    331
    Спасибо Благодарностей отдано 
    23
    Спасибо Благодарностей получено 
    11
    Поблагодарили
    10 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Какой модуль требует?
    Выставил адрес на epcs контролере, дернул RD, защелкнул данные в регистр, выставил данные на озу, дернул WR, записал данные в ОЗУ.
    Счетчик адреса можно использовать общий для epcs контролера, а после счетчика задавать смещение отдельно для ОЗУ и контролера.

  5. #25
    Activist
    Регистрация
    26.07.2015
    Адрес
    г. Хабаровск
    Сообщений
    221
    Спасибо Благодарностей отдано 
    13
    Спасибо Благодарностей получено 
    3
    Поблагодарили
    3 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от kox Посмотреть сообщение
    Какой модуль требует?
    Выставил адрес на epcs контролере, дернул RD, защелкнул данные в регистр, выставил данные на озу, дернул WR, записал данные в ОЗУ.
    Счетчик адреса можно использовать общий для epcs контролера, а после счетчика задавать смещение отдельно для ОЗУ и контролера.
    Не, тогда файл (модуль) epcs_virtual_memory надо переписывать. Я же по дилетантски, добавил файл в проект и правлю его только, когда совсем приспичит.
    Код:
    -- Cache Memory
    cache : epcs_virtual_memory_dpram 
    	PORT MAP 
    	(
    		data		=> cache_data_in,
    		wren		=> cache_wr,
    		wraddress	=> cache_wraddress,
    		rdaddress	=> cache_rdaddress,
    		clock		=> CLK,
    		aclr		=> RST,
    		q			=> cache_data_out
    	);
    По хорошему, вместо этого файла сделать что попроще по тому же принципу, с минимумом функционала.

  6. #26
    Activist
    Регистрация
    26.07.2015
    Адрес
    г. Хабаровск
    Сообщений
    221
    Спасибо Благодарностей отдано 
    13
    Спасибо Благодарностей получено 
    3
    Поблагодарили
    3 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Вытащил такой код, создал новый файл, попроще и без кэша.
    Код:
    --------
    -- EPCS Memory Package
    --------
    LIBRARY ieee;
    USE ieee.std_logic_1164.all;
    
    
    ENTITY epcs_mem IS
    PORT(
    
    		RST 			: IN std_logic;
    		CLK 			: IN std_logic;
    		
    		-- ASMI interface
    		--exemplar translate_off
    		ASMI_CLK		: OUT std_logic;
    		ASMI_CS 		: OUT std_logic;
    		ASMI_MOSI		: OUT std_logic;
    		ASMI_MISO		: IN std_logic;
    		--exemplar translate_on
    		
    		-- Local Interface
    		EPCS_CS 		: IN std_logic;
    		EPCS_RD 		: IN std_logic;
    		EPCS_WR 		: IN std_logic;
    		EPCS_ERASE		: IN std_logic;
    		EPCS_ADDR 		: IN std_logic_vector(23 DOWNTO 0);
    		EPCS_DATA_IN 	: IN std_logic_vector(7 DOWNTO 0);
    		EPCS_DATA_OUT 	: OUT std_logic_vector(7 DOWNTO 0);
    		EPCS_WAITREQ	: OUT std_logic
    	);
    END ENTITY epcs_mem;
    
    -----
    -- Architecture
    -----
    ARCHITECTURE behaviour OF epcs_mem IS
    
    CONSTANT flash_sector_code_offset 		: INTEGER := 2; 
    CONSTANT flash_sector_code_size 		: INTEGER := 1;
    CONSTANT flash_sector_data_offset 		: INTEGER := 3;
    CONSTANT flash_sector_data_size 		: INTEGER := 2;
    CONSTANT dp_avalon_addr_width 			: INTEGER := 17;
    CONSTANT cp_avalon_addr_width 			: INTEGER := 16;
    CONSTANT delay_counter_data				: INTEGER := 2;
    CONSTANT avalon_clk_is_too_fast			: std_logic := '0';
    
    -----
    -- Components
    -----
    
    --synthesis read_comments_as_HDL on
    --COMPONENT cycloneii_asmiblock is
    --PORT (
    --   signal data0out : OUT STD_LOGIC;
    --       signal oe : IN STD_LOGIC;
    --       signal scein : IN STD_LOGIC;
    --        signal dclkin : IN STD_LOGIC;
    --        signal sdoin : IN STD_LOGIC
    --      );
    --END COMPONENT cycloneii_asmiblock;
    --synthesis read_comments_as_HDL off
    
    -----
    -- State Machine
    -----
    TYPE state_type IS 
    (	
    	idle,
    	read, read_loop,
    	write, write_enable_loop, write_cmd, write_cmd_loop, write_data, write_data_loop, write_status, write_status_loop, write_check_status,  
    	release
    );
    SIGNAL current_state, next_state : state_type;
    
    -----
    -- Signals 
    -----
    
    -- Misc
    CONSTANT zeros_3bytes 							: std_logic_vector(23 DOWNTO 0) := x"000000";
    
    -- ASMI
    CONSTANT read_bytes_cmd 						: std_logic_vector(7 DOWNTO 0) := "00000011";
    CONSTANT read_status_cmd 						: std_logic_vector(7 DOWNTO 0) := "00000101";
    CONSTANT write_bytes_cmd 						: std_logic_vector(7 DOWNTO 0) := "00000010";
    CONSTANT write_enable_cmd 						: std_logic_vector(7 DOWNTO 0) := "00000110";
    CONSTANT erase_sector_cmd 						: std_logic_vector(7 DOWNTO 0) := "11011000";
    
    --synthesis read_comments_as_HDL on
    --SIGNAL asmi_clk, asmi_cs, asmi_mosi, asmi_miso 	: std_logic;
    --synthesis read_comments_as_HDL off
    SIGNAL asmi_clk_int : std_logic;
    SIGNAL asmi_cs_int	: std_logic;
    
    -- Counter
    SIGNAL counter, counter_data 					: INTEGER RANGE 0 TO 64;
    SIGNAL counter_load, counter_zero 				: std_logic;
    
    -- Shift Register
    SIGNAL shift_register, shift_register_data 		: std_logic_vector(31 DOWNTO 0);
    SIGNAL shift_register_load, shift_register_run	: std_logic;
    
    -- Delay Counter
    SIGNAL delay_counter 							: INTEGER RANGE 0 TO 15;
    SIGNAL avalon_clk_divided						: std_logic;
    SIGNAL asmi_clk_enable 							: std_logic;
    
    BEGIN
    
    EPCS_DATA_OUT <= shift_register(7 DOWNTO 0);
    
    -- Clock divider
    PROCESS(CLK, RST, delay_counter)
    BEGIN
    	IF RST = '1' THEN
    		avalon_clk_divided <= '0';
    		delay_counter <= 0;
    	ELSIF (CLK'event AND CLK = '1') THEN
    		
    		IF delay_counter = 0 THEN
    			delay_counter <= delay_counter_data;
    			avalon_clk_divided <= '1';
    		ELSE
    			delay_counter <= delay_counter - 1;
    			avalon_clk_divided <= '0';
    		END IF;
    	END IF;
    
    END PROCESS;
    
    -- Select ASMI CLK
    asmi_clk_int 	<= avalon_clk_divided WHEN avalon_clk_is_too_fast = '1' ELSE CLK;
    asmi_clk_enable <= avalon_clk_divided WHEN avalon_clk_is_too_fast = '1' ELSE '1';
    asmi_clk <= asmi_clk_int;
    
    
    -- State Machine
    PROCESS(RST, CLK)
    BEGIN
    	IF RST = '1' THEN
    		current_state <= idle;
    	ELSIF (CLK'event AND CLK = '1') THEN
    		current_state <= next_state AFTER 2 ns;
    	END IF;
    END PROCESS;
    
    PROCESS(current_state, EPCS_CS, EPCS_WR, EPCS_RD, EPCS_ERASE, EPCS_ADDR, EPCS_DATA_IN, counter_zero, shift_register)
    BEGIN
    
    EPCS_WAITREQ			<= '0';
    shift_register_data 	<= (others => '0');
    shift_register_load 	<= '0';
    shift_register_run 		<= '0';
    counter_data 			<= 0;
    counter_load 			<= '0';
    
    	CASE current_state IS
    	
    		WHEN idle =>
    
    			IF EPCS_CS = '1' THEN
    				IF EPCS_RD = '1' THEN
    					EPCS_WAITREQ <= '1';
    					next_state <= read; 
    				ELSIF (EPCS_WR = '1' OR EPCS_ERASE = '1') THEN
    					EPCS_WAITREQ <= '1';
    					next_state <= write;
    				ELSE 
    					next_state <= idle;
    				END IF;
    			ELSE
    				next_state <= idle;
    			END IF;
    		
    		-- Read one byte from flash
    		WHEN read =>
    			EPCS_WAITREQ	<= '1';
    			shift_register_data 	<= read_bytes_cmd & EPCS_ADDR; 
    			shift_register_load 	<= '1';
    			counter_data 			<= 38; -- was 62 for one word
    			counter_load 			<= '1';
    			next_state 				<= read_loop;
    		
    		-- Wait for data to shift in
    		WHEN read_loop =>
    			EPCS_WAITREQ 	<= '1';
    			shift_register_run 		<= '1';
    			
    			IF counter_zero = '1' THEN
    				next_state <= release;
    			ELSE
    				next_state <= read_loop;
    			END IF;
    		
    		-- Write one byte to flash
    		-- First set the Write Enable bit
    		WHEN write =>
    			EPCS_WAITREQ 	<= '1';
    			shift_register_data 	<= write_enable_cmd & zeros_3bytes; 
    			shift_register_load 	<= '1';
    			counter_data 			<= 6;
    			counter_load 			<= '1';
    			next_state 				<= write_enable_loop;
    			
    		-- Wait for the command be shifted out
    		WHEN write_enable_loop =>
    			EPCS_WAITREQ 			<= '1';
    			shift_register_run 		<= '1';
    
    			IF counter_zero = '1' THEN
    				next_state <= write_cmd;
    			ELSE
    				next_state <= write_enable_loop;
    			END IF;
    		
    		WHEN write_cmd =>
    			EPCS_WAITREQ 			<= '1';
    			
    			IF EPCS_ERASE = '1' THEN
    				shift_register_data	<= erase_sector_cmd & EPCS_ADDR; 
    				counter_data 		<= 30;
    			ELSE
    				shift_register_data	<= write_bytes_cmd & EPCS_ADDR; 
    				counter_data 		<= 29;
    			END IF;
    			
    			shift_register_load 	<= '1';
    			counter_load 			<= '1';
    			next_state 				<= write_cmd_loop;
    
    		-- Wait for data to shift out
    		WHEN write_cmd_loop =>
    			EPCS_WAITREQ 	<= '1';
    			shift_register_run 		<= '1';
    
    			IF counter_zero = '1' THEN
    				IF EPCS_ERASE = '1' THEN
    					next_state <= write_status;
    				ELSE
    					next_state <= write_data;
    				END IF;					
    			ELSE
    				next_state <= write_cmd_loop;
    			END IF;
    		
    		-- Write data
    		WHEN write_data =>
    			EPCS_WAITREQ 	<= '1';
    			shift_register_data 	<= EPCS_DATA_IN & zeros_3bytes; 
    			shift_register_load 	<= '1';
    			counter_data 			<= 6; -- was 30 for one word
    			counter_load 			<= '1';
    			shift_register_run		<= '1';
    			next_state 				<= write_data_loop;
    
    		-- Wait for data to shift out
    		WHEN write_data_loop =>
    			EPCS_WAITREQ 	<= '1';
    			shift_register_run 		<= '1';
    
    			IF counter_zero = '1' THEN
    				next_state <= write_status;
    			ELSE
    				next_state <= write_data_loop;
    			END IF;
    	
    		-- Check the WIP (Write In Progress) bit
    		WHEN write_status =>
    			EPCS_WAITREQ 			<= '1';
    			shift_register_data 	<= read_status_cmd & zeros_3bytes; 
    			shift_register_load 	<= '1';
    			counter_data 			<= 14;
    			counter_load 			<= '1';
    			next_state 				<= write_status_loop;
    
    		-- Wait for status to shift in
    		WHEN write_status_loop =>
    			EPCS_WAITREQ			<= '1';
    			shift_register_run		<= '1';
    			
    			IF counter_zero = '1' THEN
    				next_state <= write_check_status;
    			ELSE
    				next_state <= write_status_loop;
    			END IF;
    
    		-- Is the flash ready?
    		WHEN write_check_status =>
    			EPCS_WAITREQ 			<= '1';
    			
    			IF shift_register(0) = '0' THEN
    				next_state <= release;
    			ELSE
    				next_state <= write_status;
    			END IF;
    				
    		-- Release the waitrequest signal
    		WHEN release =>
    			EPCS_WAITREQ 			<= '0';
    			next_state				<= idle;
    			
    		WHEN others =>
    			next_state 				<= idle;
    			
    	END CASE;
    
    END PROCESS;
    
    -- Shift Register
    PROCESS(RST, CLK, shift_register_load, shift_register_run, asmi_clk_enable, asmi_cs_int)
    BEGIN
    	IF RST = '1' THEN
    		shift_register <= (others => '0');
    	ELSIF (CLK'event AND CLK = '1') THEN
    		IF shift_register_load = '1' THEN
    			shift_register <= shift_register_data;
    		ELSIF shift_register_run = '1' THEN
    			IF asmi_clk_enable = '1' THEN
    				IF asmi_cs_int = '0' THEN
    					shift_register <= shift_register((shift_register'high - 1) DOWNTO 0) & asmi_miso;
    				END IF;
    			END IF;
    		END IF;	
    	END IF;
    END PROCESS;
    
    -- The data is clocked out on the falling edge.
    PROCESS(RST, asmi_clk_int, shift_register_run)
    BEGIN
    	IF RST = '1' THEN
    		asmi_mosi <= '0';
    		asmi_cs_int <= '1';
    	--ELSIF (CLK'event AND CLK = '0') THEN
    	ELSIF (asmi_clk_int'event AND asmi_clk_int = '0') THEN
    		--IF asmi_clk_enable = '1' THEN
    			asmi_mosi <= shift_register(shift_register'high);
    			
    			IF shift_register_run = '1' THEN
    				asmi_cs_int <= '0';
    			ELSE
    				asmi_cs_int <= '1';
    			END IF;	
    		--END IF;
    	END IF;
    END PROCESS;
    asmi_cs <= asmi_cs_int;
    
    -- Counter
    PROCESS(RST, CLK, counter_load, asmi_clk_enable, asmi_cs_int)
    BEGIN
    	IF RST = '1' THEN
    		counter <= 0;
    		counter_zero <= '0';
    	ELSIF (CLK'event AND CLK = '1') THEN
    		IF counter_load = '1' THEN
    			counter <= counter_data;
    			counter_zero <= '0';
    		ELSE
    			IF asmi_clk_enable = '1' THEN
    				IF asmi_cs_int = '0' THEN
    					IF counter = 0 THEN
    						counter_zero <= '1';
    					ELSE
    						counter <= counter - 1;
    						counter_zero <= '0';
    					END IF;
    				END IF;
    			END IF;
    		END IF;
    	END IF;
    END PROCESS;
    
    --synthesis read_comments_as_HDL on
    --asmi_block : cycloneii_asmiblock
    --	port map(
    --		      data0out	=> ASMI_MISO,
    --		      oe 	=> '0',
    --		      scein 	=> asmi_cs,
    --		      dclkin 	=> asmi_clk,
    --		      sdoin 	=> ASMI_MOSI
    --		);
    --synthesis read_comments_as_HDL off
    
    END ARCHITECTURE behaviour;
    Пока плохо разумею в этих языках, но вроде компилится в символ, уже хорошо.

  7. #27
    Activist
    Регистрация
    26.07.2015
    Адрес
    г. Хабаровск
    Сообщений
    221
    Спасибо Благодарностей отдано 
    13
    Спасибо Благодарностей получено 
    3
    Поблагодарили
    3 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Теперь в "speccy" надо создать некий процесс. (Контролёр памяти "mem_ctrl", решил не трогать.) Прочесть последовательно байты из флэш, отправить их в память и рестартануть Z80.

  8. #28
    Activist
    Регистрация
    27.11.2010
    Адрес
    Пенза
    Сообщений
    331
    Спасибо Благодарностей отдано 
    23
    Спасибо Благодарностей получено 
    11
    Поблагодарили
    10 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Я не профессионал в hdl,даже не любитель, а скорее дилетант, но никак не пойму зачем кеш, я этот модуль использовал для для воспроизведения звука- писал в epcs wav файл, перебирал адреса счетчиком и засылал данные в цап через регистр, все прекрасно работало.
    Также пробывал использовать этот модуль как ПЗУ спека напрямую, то есть писал в epcs ром файл, и подключал этот модуль напрямую к шине данных,и адреса z80, сигналом готовности данных в модуле я вейтил Z80, получался очень тормозной спек))))
    Вот я и не пойму, вроде модуль позволяет организовать произвольный доступ по любому адресу- нафига тогда кеш, если можно побайтно скопировать образ ром из epcs в ОЗУ?
    Последний раз редактировалось kox; 17.08.2015 в 12:32.

  9. #29
    Activist
    Регистрация
    27.11.2010
    Адрес
    Пенза
    Сообщений
    331
    Спасибо Благодарностей отдано 
    23
    Спасибо Благодарностей получено 
    11
    Поблагодарили
    10 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Вот пример с воспроизведением WAV.
    https://yadi.sk/d/qi5OKbeLiVxjV
    Wav файл должен быть моно, 22кгц.
    В модуле adr_count надо задать начальный адрес WAV файла в EPCS и его размер.

  10. #30
    Activist
    Регистрация
    26.07.2015
    Адрес
    г. Хабаровск
    Сообщений
    221
    Спасибо Благодарностей отдано 
    13
    Спасибо Благодарностей получено 
    3
    Поблагодарили
    3 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от zebest Посмотреть сообщение
    На Lattice интересно было бы увидеть проект Для начала.
    Установил Lattice Diamond попробую в нём для MachXO2-7000HE собрать проект из файлов u16_speccy для ReVerSE-U16, авось что получится.

Страница 3 из 5 ПерваяПервая 12345 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Ответов: 23
    Последнее: 18.10.2019, 01:56
  2. Ответов: 24
    Последнее: 09.10.2015, 19:36
  3. ZX 48/128 FPGA
    от Александр Бухаров в разделе Несортированное железо
    Ответов: 6
    Последнее: 21.04.2015, 17:04
  4. NES на FPGA
    от AlexBel в разделе Nintendo
    Ответов: 7
    Последнее: 05.12.2008, 16:44
  5. Ответов: 28
    Последнее: 01.09.2005, 17:32

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •