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

Разбираюсь с кодом и вижу такое

UART_INT :In Std_logic;
CH_1_INT :In Std_logic;
CH_2_INT :In Std_logic;

CPU_DIN  :Out   Std_logic_vector(15 downto 0);

if (CPU_CS='1') then
    case (CPU_ADR_int) is

        //----------------------------------

        When X"0040" => CPU_DIN <= "0000000000000" & UART_INT & CH_2_INT & CH_1_INT;

        //-----------------------------------

    end case;
end if;

но CPU_DIN всегда будет 0. Или я что то не понимаю?

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

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


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

но CPU_DIN всегда будет 0. Или я что то не понимаю?

Я могу ошибаться, но в VHDL "&" означает конкатенацию. Или нет?

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


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

Я могу ошибаться, но в VHDL "&" означает конкатенацию. Или нет?

ну если это так то все становиться на свои места. а конкатенация слева направо? то есть CH_1_INT бит 0?

 

да. точно. спасибо.

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

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


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

а конкатенация слева направо? то есть CH_1_INT бит 0?

 

Надо спрашивать у знатоков. Я на VHDL уже лет 15, наверное, не писал.

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


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

Надо спрашивать у знатоков. Я на VHDL уже лет 15, наверное, не писал.

но главное вы помните. для энда есть оператор AND . я когда то писал на VHDL пару лет назад да все позабыл.

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


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

Да, конкотенация слева на право (от старшего к младшему).

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


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

Да, конкотенация слева на право (от старшего к младшему).

Спасибо.

а вот еще такой вопрос.

Signal CLK_DIV  :Std_logic_vector(3 downto 0);

if (CLK'event and CLK='1') then
    CLK_DIV <= CLK_DIV + 1;
      
      if (CLK_DIV = "0111") then
          CLK_RISE <= '1';
      else 
          CLK_RISE <= '0';
      end if;

      if (CLK_DIV = "1111") then 
          CLK_FALL <= '1';
      else
           CLK_FALL <= '0';
     end if;

значит ли что при достижении максимального значения (CLK_DIV = "1111") переменная обнулиться как в С?

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


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

значит ли что при достижении максимального значения (CLK_DIV = "1111") переменная обнулиться как в С?

Станет '1', если вы про CLK_FALL.

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


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

значит ли что при достижении максимального значения (CLK_DIV = "1111") переменная обнулиться как в С?

Если вы про сигнал CLK_DIV, то да, после CLK_DIV = "1111" будет CLK_DIV = "0000"

 

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


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

значит ли что при достижении максимального значения (CLK_DIV = "1111") переменная обнулиться как в С?

Да, после достижения сигнала CLK_DIV значения 1111 (15) следующее сложение с 1 даст результат 0000

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


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

 

Решил продолжить. Есть еще вопросы.

 

Выполнить одно действие на несколько кейсов.

Я получаю команды и в кейсе на каждую команду следует определенное действие.

case (cpu_adr_reg) is

    --read MCP25625 registers
    When X"00900" => 
        mcp25625_data_reg <= X"00"; --RXF0SIDH
        State <= ST_RX_REG;

    When X"00901" => 
        mcp25625_data_reg <= X"01"; --RXF0SIDL
       State <= ST_RX_REG;

    When X"00902" => 
        mcp25625_data_reg <= X"02"; --RXF0EID8
       State <= ST_RX_REG;

    и так далее
end case;

Есть довольно большая группа команд где я должен поднять один и тот же флаг (State <= ST_RX_REG). Может есть какой то механизм выставить флаг один раз на группу команд?

 

Конвертация из std_logic_vector в integer.

делаю так.

library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use IEEE.std_logic_unsigned.all;
use IEEE.numeric_std.all;

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

signal loaded_mailboxes : std_logic_vector(15 downto 0);
variable mailbox_idx : integer := 0;

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

mailbox_idx := to_integer(loaded_mailboxes);

получаю ошибку

can't determine type of object at or near identifier "to_integer" -- found 0 possible types

 

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


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

Конвертация из std_logic_vector в integer.

делаю так.

 use IEEE.std_logic_arith.all;
use IEEE.std_logic_unsigned.all;

Это legacy crap, не используйте это для математики.

 

use IEEE.numeric_std.all;

Используйте только его. Для представления чисел используйте типы signed и unsigned и функции to_integer, to_signed, to_unsigned.

 

 

 

 

 

--------------------------------
signal loaded_mailboxes : std_logic_vector(15 downto 0);
variable mailbox_idx : integer := 0;

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

mailbox_idx := to_integer(loaded_mailboxes);

получаю ошибку

can't determine type of object at or near identifier "to_integer" -- found 0 possible types

Переменные можно использовать только внутри process.

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


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

Есть довольно большая группа команд где я должен поднять один и тот же флаг (State <= ST_RX_REG). Может есть какой то механизм выставить флаг один раз на группу команд?

Конечно есть. Прием широко известный и называется "присвоение значения по умолчанию". Переменной в самом начале процесса присваиваете некое удобное вам по каким-то причинам "значение по умолчанию" (например, самое распространенное присвоение в логике процесса), а в нижеследующих case'ах / if'ах присвоение этой переменной будет только для случаев "девиации" от умолчального значения.

 

State <= ST_RX_REG;

case (cpu_adr_reg) is

    --read MCP25625 registers
    When X"00900" => 
        mcp25625_data_reg <= X"00"; --RXF0SIDH
        
    When X"00901" => 
        mcp25625_data_reg <= X"01"; --RXF0SIDL

    When X"00902" => 
        mcp25625_data_reg <= X"02"; --RXF0EID8

...............
    When X"00910" => 
        mcp25625_data_reg <= X"10"; -- Тут  и дальше я пофантазировал для примера
       State <= ST_STATE_REG;

    When X"00911" => 
        mcp25625_data_reg <= X"11";
       State <= ST_STATUS_REG;

    When X"00912" => 
        mcp25625_data_reg <= X"12";
................
    и так далее
end case;

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


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

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

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

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

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

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

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

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

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

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