jenya7 0 25 сентября, 2016 Опубликовано 25 сентября, 2016 (изменено) · Жалоба Разбираюсь с кодом и вижу такое 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. Или я что то не понимаю? Изменено 25 сентября, 2016 пользователем Jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
masics 0 25 сентября, 2016 Опубликовано 25 сентября, 2016 · Жалоба но CPU_DIN всегда будет 0. Или я что то не понимаю? Я могу ошибаться, но в VHDL "&" означает конкатенацию. Или нет? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 25 сентября, 2016 Опубликовано 25 сентября, 2016 (изменено) · Жалоба Я могу ошибаться, но в VHDL "&" означает конкатенацию. Или нет? ну если это так то все становиться на свои места. а конкатенация слева направо? то есть CH_1_INT бит 0? да. точно. спасибо. Изменено 25 сентября, 2016 пользователем Jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
masics 0 25 сентября, 2016 Опубликовано 25 сентября, 2016 · Жалоба а конкатенация слева направо? то есть CH_1_INT бит 0? Надо спрашивать у знатоков. Я на VHDL уже лет 15, наверное, не писал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 25 сентября, 2016 Опубликовано 25 сентября, 2016 · Жалоба Надо спрашивать у знатоков. Я на VHDL уже лет 15, наверное, не писал. но главное вы помните. для энда есть оператор AND . я когда то писал на VHDL пару лет назад да все позабыл. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Александр77 1 25 сентября, 2016 Опубликовано 25 сентября, 2016 · Жалоба Да, конкотенация слева на право (от старшего к младшему). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 25 сентября, 2016 Опубликовано 25 сентября, 2016 · Жалоба Да, конкотенация слева на право (от старшего к младшему). Спасибо. а вот еще такой вопрос. 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") переменная обнулиться как в С? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
wolfman 0 25 сентября, 2016 Опубликовано 25 сентября, 2016 · Жалоба значит ли что при достижении максимального значения (CLK_DIV = "1111") переменная обнулиться как в С? Станет '1', если вы про CLK_FALL. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
OM-S 0 25 сентября, 2016 Опубликовано 25 сентября, 2016 · Жалоба значит ли что при достижении максимального значения (CLK_DIV = "1111") переменная обнулиться как в С? Если вы про сигнал CLK_DIV, то да, после CLK_DIV = "1111" будет CLK_DIV = "0000" Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Александр77 1 25 сентября, 2016 Опубликовано 25 сентября, 2016 · Жалоба значит ли что при достижении максимального значения (CLK_DIV = "1111") переменная обнулиться как в С? Да, после достижения сигнала CLK_DIV значения 1111 (15) следующее сложение с 1 даст результат 0000 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 26 сентября, 2016 Опубликовано 26 сентября, 2016 · Жалоба спасибо. я таки CLK_DIV имел в виду. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 8 февраля, 2017 Опубликовано 8 февраля, 2017 · Жалоба Решил продолжить. Есть еще вопросы. Выполнить одно действие на несколько кейсов. Я получаю команды и в кейсе на каждую команду следует определенное действие. 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 15 8 февраля, 2017 Опубликовано 8 февраля, 2017 · Жалоба Конвертация из 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 8 февраля, 2017 Опубликовано 8 февраля, 2017 · Жалоба понял. спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Raven 9 8 февраля, 2017 Опубликовано 8 февраля, 2017 · Жалоба Есть довольно большая группа команд где я должен поднять один и тот же флаг (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; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться