реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Обнуление сигнала.
Jenya7
сообщение Mar 1 2017, 06:47
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 1 062
Регистрация: 29-03-12
Пользователь №: 71 075



В одном процессе я принимаю команды
Код
when X"01" =>  --continious data read
         cont_ram_addr := to_integer(unsigned(addr_bus));
       ram_command <= RAM_CONT_WRITE;
     when X"02" =>  --continious data write
         cont_ram_addr := to_integer(unsigned(addr_bus));
       ram_command <= RAM_CONT_READ;
     when X"03" => --read data command
         ram_command <= RAM_BYTE_WRITE;
     when X"04" => --write data command
         ram_command <= RAM_BYTE_READ;

В другом я проверяю команду и в соответсвии команде делаю какое то действие.
Код
case RamState is
        when ST_IDLE =>
        if(ram_command > "000") then  
          case ram_command is
           when RAM_CONT_WRITE => RamState <= ST_CONT_WR_RAM;
           when RAM_CONT_READ  => RamState <= ST_CONT_RD_RAM;
           when RAM_BYTE_WRITE => RamState <= ST_WR_RAM;
           when RAM_BYTE_READ  => RamState <= ST_RD_RAM;
           when others => RamState <= ST_IDLE;
       end case;
      end if;
      
    when ST_WR_RAM =>   -
        --do something
      RamState <= ST_IDLE;
      
      when ST_RD_RAM =>  
        --do something
        RamState <= ST_IDLE;

    when ST_CONT_WR_RAM =>        
        -do something
      RamState <= ST_IDLE;

    when ST_CONT_RD_RAM =>
     -- do something
        RamState <= ST_IDLE;

Но когда мне обнулить ram_command?
Иначе я вернусь в ST_IDLE и снова case ram_command и так буду крутиться в бесконечном цикле.
Логично было бы обнулить ram_command во втором процессе но тогда я получу
Error (10028): Can't resolve multiple constant drivers for net
Получается нет синхронизации между процессами.
Go to the top of the page
 
+Quote Post
andrew_b
сообщение Mar 1 2017, 07:44
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 733
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757



Цитата(Jenya7 @ Mar 1 2017, 09:47) *
Логично было бы обнулить ram_command во втором процессе но тогда я получу
Опять те же грабли? Запомните раз и навсегда первое: вы не программу пишете, а "рисуете" схему словами. Запомните раз и навсегда второе: сигнал в схеме -- это не переменная в программе, вы не можете изменять один сигнал из двух независимых источников. Это всё равно что физически соединить выходы двух устройств.
Цитата
Получается нет синхронизации между процессами.
Вы разработчик, вы и сделайте так, чтобы она была.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Mar 1 2017, 08:08
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 1 062
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(andrew_b @ Mar 1 2017, 12:44) *
Опять те же грабли? Запомните раз и навсегда первое: вы не программу пишете, а "рисуете" схему словами. Запомните раз и навсегда второе: сигнал в схеме -- это не переменная в программе, вы не можете изменять один сигнал из двух независимых источников. Это всё равно что физически соединить выходы двух устройств.

это я таки понял.

Цитата(andrew_b @ Mar 1 2017, 12:44) *
Вы разработчик, вы и сделайте так, чтобы она была.

опыта в VHDL не хватает. иначе спрашивал я бы на форуме?



Сообщение отредактировал Jenya7 - Mar 1 2017, 08:20
Go to the top of the page
 
+Quote Post
wolfman
сообщение Mar 1 2017, 08:26
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 492
Регистрация: 15-06-05
Из: Питер
Пользователь №: 6 032



А что мешает обнулять ram_command в первом процессе?

И что мешает принимать ram_command и совершать действия по ней в одном процессе?


--------------------
Россия это даже не страна.
Россия это секрет, завернутый в загадку и укрытый не проницаемой тайной...
Go to the top of the page
 
+Quote Post
SemperAnte
сообщение Mar 1 2017, 08:27
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 79
Регистрация: 24-10-10
Из: Санкт-Петербург
Пользователь №: 60 386



Ну, вы можете:
- автоматически обнулить ram_command после одного или нескольких тактов;
- сделать так, чтобы вторая часть выдавала сигнал завершения по-которому ram_command будет сбрасываться;
- в конце концов, объединить обе части в один процесс.
Go to the top of the page
 
+Quote Post
andrew_b
сообщение Mar 1 2017, 08:40
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 733
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757



Цитата(Jenya7 @ Mar 1 2017, 11:08) *
опыта в VHDL не хватает.
А чо сразу VHDL? Это лишь средство реализации алгоритма. У вас до конца не продуман именно алгоритм работы. Вы не кидайтесь сразу код писать, а распишите детально алгоритм. На листочке, что ли. Диаграммы сигналов нарисуйте потактово. Вот когда всё сойдётся, тогда и код будет проще писать.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Mar 1 2017, 08:42
Сообщение #7


Профессионал
*****

Группа: Участник
Сообщений: 1 062
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(wolfman @ Mar 1 2017, 13:26) *
А что мешает обнулять ram_command в первом процессе?

И что мешает принимать ram_command и совершать действия по ней в одном процессе?



Цитата(SemperAnte @ Mar 1 2017, 13:27) *
Ну, вы можете:
- автоматически обнулить ram_command после одного или нескольких тактов;
- сделать так, чтобы вторая часть выдавала сигнал завершения по-которому ram_command будет сбрасываться;
- в конце концов, объединить обе части в один процесс.


в одном и том же процессе... дело в том что я получаю разные комманды - для работы с RAM, для работы с мср25625, и так далее.
вот я и подумал выделить отдельные процессы – для RAM для с мср25625 и так далее -
так разные таски могут работать параллельно. если я засуну все в один процесс -пришла следующая команда а я еще обрабатываю предыдущую. а так - пришла команда для RAM - выставил ram_command, пришла команда для mcp25625 – выставил mcp25625_command и оба таска выполняют свои задачи паралельно.

автоматически обнулить ram_command после одного или нескольких тактов
Код
spi_slave_interface : process(REG_CLK, REG_RSTn, SPI_DATA_LATCH)
begin
    
    if(REG_RSTn = '0') then
         --REG_DATA_OUT <= (others => '0');
          --State <= ST_IDLE;
          --command <= "000";
          --MSPI_CS <= '1';
     elsif (rising_edge(REG_CLK) and SPI_DATA_LATCH = '1') then  --REG_DATA_LATCH to be sure command, address, data was received from spi slave
    
         if (REG_COM_IN(7 downto 5) = REG_CHAN) then  --select spi channel
            
              case REG_COM_IN(4 downto 0) is --command from mcu spi
              
                    when "00001" =>  --continious data read
                        cont_ram_addr := to_integer(unsigned(addr_bus));
                         ram_command <= RAM_CONT_WRITE;
                        
                    when "00010" =>  --continious data write
                        cont_ram_addr := to_integer(unsigned(addr_bus));
                         ram_command <= RAM_CONT_READ;
                        
                    when "00011" => --read data command
                        ram_command <= RAM_BYTE_WRITE;
                        
                    when "00100" =>    --write data command    
                        ram_command <= RAM_BYTE_READ;
                                            
             end case;

             ram_command <= "000";

         end if;
        
    end if;
end process spi_slave_interface;

вопрос сколько тактов пройдет между установкой и обнулением. и сколько тактов нужно второму процессу чтоб "захватить" сигнал.

Сообщение отредактировал Jenya7 - Mar 1 2017, 08:52
Go to the top of the page
 
+Quote Post
krux
сообщение Mar 1 2017, 09:52
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 436
Регистрация: 2-07-12
Из: дефолт-сити
Пользователь №: 72 596



вам надо бы разобраться с типовыми "кусками", применяемыми в ПЛИС для решения тех или иных задач. когда применять очереди (FIFO), арбитры, планировщики (scheduler),
рекомендую к прочтению:
Прикрепленный файл  10_lec08.pdf ( 7.31 мегабайт ) Кол-во скачиваний: 35


в вашем случае, поскольку обработчик команд в момент прихода новой команды может быть занят - логичным решением может стать FIFO команд. т.е. новые команды поступают в FIFO, и обработчик, по мере своих возможностей забирает из него команды для обработки.
Go to the top of the page
 
+Quote Post
Flip-fl0p
сообщение Mar 1 2017, 09:55
Сообщение #9


Местный
***

Группа: Участник
Сообщений: 213
Регистрация: 11-06-13
Пользователь №: 77 140



Цитата(Jenya7 @ Mar 1 2017, 11:42) *

Так а почему нельзя написать так:

Цитата
when "00011" => --read data command
ram_command <= RAM_BYTE_WRITE;

when "00100" => --write data command
ram_command <= RAM_BYTE_READ;
WHEN OTHERS => ram_command <= NOPE;

end case;

Где NOPE это и есть "000".
Весь процесс я бы вот так написал

Код
SPI_SLAVE_INTERFACE : PROCESS
(
    REG_CLK
)
BEGIN
    IF (RISING_EDGE(REG_CLK)) THEN
        IF (SPI_DATA_LATCH = '1') THEN  --REG_DATA_LATCH TO BE SURE COMMAND, ADDRESS, DATA WAS RECEIVED FROM SPI SLAVE
            IF (REG_COM_IN(7 DOWNTO 5) = REG_CHAN) THEN  --SELECT SPI CHANNEL
                CASE REG_COM_IN(4 DOWNTO 0) IS --COMMAND FROM MCU SPI
                    WHEN "00001" =>  --CONTINIOUS DATA READ
                                    CONT_RAM_ADDR <= TO_INTEGER(UNSIGNED(ADDR_BUS));
                                    RAM_COMMAND <= RAM_CONT_WRITE;
                        
                    WHEN "00010" =>  --CONTINIOUS DATA WRITE
                                    CONT_RAM_ADDR <= TO_INTEGER(UNSIGNED(ADDR_BUS));
                                    RAM_COMMAND <= RAM_CONT_READ;
                        
                    WHEN "00011" => --READ DATA COMMAND
                                    RAM_COMMAND <= RAM_BYTE_WRITE;
                        
                    WHEN "00100" =>    --WRITE DATA COMMAND    
                                    RAM_COMMAND <= RAM_BYTE_READ;
                    WHEN OTHERS =>  RAM_COMMAND <= NOPE;
                END CASE;
            END IF;
        END IF;
        IF (REG_RSTN = '0') THEN
            REG_DATA_OUT <= (OTHERS => '0');
            STATE <= ST_IDLE;
            COMMAND <= NOPE;
            MSPI_CS <= '1';
        END IF;
    END IF;
END PROCESS;


Сообщение отредактировал Flip-fl0p - Mar 1 2017, 10:03
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Mar 1 2017, 10:04
Сообщение #10


Профессионал
*****

Группа: Участник
Сообщений: 1 062
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(krux @ Mar 1 2017, 14:52) *
вам надо бы разобраться с типовыми "кусками", применяемыми в ПЛИС для решения тех или иных задач. когда применять очереди (FIFO), арбитры, планировщики (scheduler),
рекомендую к прочтению:
Прикрепленный файл  10_lec08.pdf ( 7.31 мегабайт ) Кол-во скачиваний: 35


в вашем случае, поскольку обработчик команд в момент прихода новой команды может быть занят - логичным решением может стать FIFO команд. т.е. новые команды поступают в FIFO, и обработчик, по мере своих возможностей забирает из него команды для обработки.

почитал. там все на уровне блок-диаграм.
а FIFO мне нужно несколько я так понимаю? для каждой комманды FIFO? я привел кусок процесса. а там кроме ram_command есть и другие команды.
Go to the top of the page
 
+Quote Post
Flip-fl0p
сообщение Mar 1 2017, 10:11
Сообщение #11


Местный
***

Группа: Участник
Сообщений: 213
Регистрация: 11-06-13
Пользователь №: 77 140



Цитата(Jenya7 @ Mar 1 2017, 13:04) *
почитал. там все на уровне блок-диаграм.
а FIFO мне нужно несколько я так понимаю? для каждой комманды FIFO? я привел кусок процесса. а там кроме ram_command есть и другие команды.

Смотря что Вам нужно. Двупортовое FIFO я обычно применяю для пересечения клоковых доменов. Однопортовое FIFO я использую когда каике-то команды\запросы идут с одной периодичностью, к примеру раз в 3 такта. А блок, который эти запросы обрабатывает тратит 10 тактов. Но обычно требуется механизм защиты от переполнения FIFO. Тут уже всё упирается в Вашу фантазию.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Mar 1 2017, 10:11
Сообщение #12


Профессионал
*****

Группа: Участник
Сообщений: 1 062
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(Flip-fl0p @ Mar 1 2017, 14:55) *
Где NOPE это и есть "000".
Весь процесс я бы вот так написал

----------------------------------------------

WHEN OTHERS => RAM_COMMAND <= NOPE;

-------------------------------------------------

я этот момент не очень понял. WHEN OTHERS сработает по условию прихода команды - SPI_DATA_LATCH = '1'. а если команда не пришла? RAM_COMMAND останется на предыдущем кейсе.


а если так?
Код
IF (SPI_DATA_LATCH = '1') THEN  
-----------------------------------
----------------------------------
ELSE

    RAM_COMMAND <= NOPE;

END IF;


Сообщение отредактировал Jenya7 - Mar 1 2017, 10:17
Go to the top of the page
 
+Quote Post
Flip-fl0p
сообщение Mar 1 2017, 10:20
Сообщение #13


Местный
***

Группа: Участник
Сообщений: 213
Регистрация: 11-06-13
Пользователь №: 77 140



Цитата(Jenya7 @ Mar 1 2017, 13:11) *
я этот момент не очень понял. WHEN OTHERS сработает по условию прихода команды - SPI_DATA_LATCH = '1'. а если команда не пришла? RAM_COMMAND останется на предыдущем кейсе.

Ошибся я что-то crying.gif
Я вижу 2 путя:
Первый:
Код
IF (RISING_EDGE(REG_CLK)) THEN
    RAM_COMMAND <= NOPE;

А второй - это использовать сигнал (SPI_DATA_LATCH = '1'), как сигнал разрешения работы с память. Т.е пока он равен нулю, памяти без разницы состояние регистра RAM_COMMAND.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Mar 1 2017, 10:29
Сообщение #14


Профессионал
*****

Группа: Участник
Сообщений: 1 062
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(Flip-fl0p @ Mar 1 2017, 15:20) *
Ошибся я что-то crying.gif
Я вижу 2 путя:
Первый:
Код
IF (RISING_EDGE(REG_CLK)) THEN
    RAM_COMMAND <= NOPE;

А второй - это использовать сигнал (SPI_DATA_LATCH = '1'), как сигнал разрешения работы с память. Т.е пока он равен нулю, памяти без разницы состояние регистра RAM_COMMAND.

первый опасный. у второго процесса будет только один клок захватить ram_command.
а второй это идея. SPI_DATA_LATCH защелкнет мне и состояние ram_command . да. это идея.... следущая тема будет - где поднять и где опустить SPI_DATA_LATCH. sm.gif

Сообщение отредактировал Jenya7 - Mar 1 2017, 10:31
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Mar 1 2017, 10:36
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 4 081
Регистрация: 17-02-06
Пользователь №: 14 454



Зря вы отвергли предлагаемые вам пути решения проблемы (предлагали в других темах)

У вас "программистическое" мышление, ну так и надо делать программисткие описания.
Будет не супер оптимально, зато результат будет без боли и гораздо быстрее.
У меня для вас даже есть рецепт успеха, всего то надо на верилог переехать, программистам там удобнее.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 28th April 2017 - 23:44
Рейтинг@Mail.ru


Страница сгенерированна за 0.2318 секунд с 7
ELECTRONIX ©2004-2016