Перейти к содержанию
    

Работа с case

Я могу вместо

case rx_idx is
    when 2 =>  rx_count(7 downto 0) <= RX_DATA; 
    when 3 =>  rx_count(7 downto 0) <= RX_DATA;
    when 4 =>  rx_count(7 downto 0) <= RX_DATA;
end case;  

написать

case rx_idx is
    when 2 =>  
    when 3 =>  
    when 4 => 
          rx_count(7 downto 0) <= RX_DATA;
end case;  

или в VHDL fall trough не работает как в C?

 

хорошо. не работает. а можно что то сделать? на несколько when одно действие?

Изменено пользователем jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На сколько я помню синтаксис VHDL 

case rx_idx is
    when 2 | 3 | 4 => 
          rx_count(7 downto 0) <= RX_DATA;
end case;  

- или

case rx_idx is
    when 2 to 4 => 
          rx_count(7 downto 0) <= RX_DATA;
end case;  

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 minutes ago, RobFPGA said:

На сколько я помню синтаксис VHDL

Знаете, я зарёкся отвечать человеку на вопросы, ответы на которые есть либо в книжке по языку, либо гуглятся за пять минут.

Зачем что-то искать самому, когда можно спросить?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 10/12/2022 at 11:35 AM, RobFPGA said:

На сколько я помню синтаксис VHDL 

case rx_idx is
    when 2 | 3 | 4 => 
          rx_count(7 downto 0) <= RX_DATA;
end case;  

- или

case rx_idx is
    when 2 to 4 => 
          rx_count(7 downto 0) <= RX_DATA;
end case;  

 

спасибо

 

On 10/12/2022 at 11:49 AM, andrew_b said:

Знаете, я зарёкся отвечать человеку на вопросы, ответы на которые есть либо в книжке по языку, либо гуглятся за пять минут.

Зачем что-то искать самому, когда можно спросить?

ну хорошо, вот нетривиальный вопрос

for j in 0 to 63 loop
    if (OUT_MASK(j) = '1') then
        case j is
            when 1 => OUTPUTS(j) <= OUT_ON_OFF(j);
            when others =>
        end case;	 
    end if;
end loop;

почему я тут получаю

Error (10028): Can't resolve multiple constant drivers for net "OUTPUTS[1]" at out_control.vhd(68) 

всё происходит в одном процессе.
 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

22 minutes ago, andrew_b said:

Знаете, я зарёкся отвечать человеку на вопросы, ответы на которые есть либо в книжке по языку, либо гуглятся за пять минут.

Зачем что-то искать самому, когда можно спросить?

Это ваше право - отвечать или нет на заданные вопросы или  посты. Как и право и различные мотивы чтобы отвечать тем или иным способом,  полезно или нравоучительно.

Мне же просто захотелось  вспомнить редко пользуемый мной VHDL.  

 

 

22 minutes ago, jenya7 said:

почему я тут получаю

Error (10028): Can't resolve multiple constant drivers for net "OUTPUTS[1]" at out_control.vhd(68) 

А  какой алгоритм вы хотите реализовать  в этой конструкции?   И соответствует ли условие в CASE  той которую вы хотели? 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 10/12/2022 at 12:19 PM, RobFPGA said:

А  какой алгоритм вы хотите реализовать  в этой конструкции?   И соответствует ли условие в CASE  той которую вы хотели? 

ну есть случаи где просто передача бита на выход а есть сложные процедуры через расширители, разрешатели.

process(CLK) 
begin 

    if (rising_edge(CLK)) then
	 
        case OutState_2 is
		  
            when ST_IDLE =>
                if (OUT_TRIG = '1') then
                    OutState_2 <= ST_SET;
                end if;
					 
            when ST_SET => 
                for j in 0 to 63 loop
                    if (OUT_MASK(j) = '1') then
                        case j is
                            when 1 to 30  => OUTPUTS(j) <= OUT_ON_OFF(j);
                            when 31 to 63 => --TODO
                            when others =>
                        end case;	 
                     end if;
                end loop;	 
                OutState_2 <= ST_IDLE;
					 
                when others => OutState_2 <= ST_IDLE;
				
        end case;
		  
    end if;
	 
end process;

непонятно почему он считает что тут multiple constant drivers.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 minutes ago, jenya7 said:

ну есть случаи где просто передача бита на выход а есть сложные процедуры через расширители, разрешатели.

Не  увидел вашего ответа на вопрос - какой алгоритм вы хотите реализовать  в приведенной конструкции  с CASE? 

Опишите что вы хотите обычными словами, и  сравните с тем что вы написали в коде.   

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 10/12/2022 at 12:32 PM, RobFPGA said:

Не  увидел вашего ответа на вопрос - какой алгоритм вы хотите реализовать  в приведенной конструкции  с CASE? 

Опишите что вы хотите обычными словами, и  сравните с тем что вы написали в коде.   

пройтись по индексам маски и тот бит который разрешён в маске записать его значение на выход.

 

ну можно конечно разбить на два, может и CASE не понадобиться

--ПЕРВАЯ ГРУППА
for j in 0 to 30 loop
end loop;  

--ВТОРАЯ ГРУППА
for j in 31 to 63 loop
end loop;   

 

Изменено пользователем jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 hours ago, jenya7 said:
when ST_IDLE =>
                if (OUT_TRIG = '1') then
                    OutState_2 <= ST_SET;
                end if;

Для начала рекомендую писать полные if then else end if, описываю все исходы.

И приведите тот код, который как раз вызывает ошибку.

В каком компиляторе это делаете?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 10/12/2022 at 1:36 PM, jenya7 said:

пройтись по индексам маски и тот бит который разрешён в маске записать его значение на выход.

Сделайте счетчик на N шагов и запускайте его для пробежки по индексам, а for в VHDL !=for С++.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 10/12/2022 at 9:55 AM, jenya7 said:

Я могу вместо

case rx_idx is
    when 2 =>  rx_count(7 downto 0) <= RX_DATA; 
    when 3 =>  rx_count(7 downto 0) <= RX_DATA;
    when 4 =>  rx_count(7 downto 0) <= RX_DATA;
end case;  

написать

case rx_idx is
    when 2 =>  
    when 3 =>  
    when 4 => 
          rx_count(7 downto 0) <= RX_DATA;
end case;  

или в VHDL fall trough не работает как в C?

 

хорошо. не работает. а можно что то сделать? на несколько when одно действие?

 

напишите задачу в целом что необходимо реализвать? многим так будет проще помочь

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 10/17/2022 at 3:47 PM, Maverick_ said:

напишите задачу в целом что необходимо реализвать? многим так будет проще помочь

поменял концепт. вышло даже лучше (как мне кажется).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...