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

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> Вопрос по VHDL
Jenya7
сообщение Sep 25 2016, 12:45
Сообщение #1


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

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



Разбираюсь с кодом и вижу такое
Код
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 - Sep 25 2016, 13:07
Go to the top of the page
 
+Quote Post
masics
сообщение Sep 25 2016, 13:02
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 397
Регистрация: 21-02-05
Из: Melbourne, Australia
Пользователь №: 2 779



Цитата(Jenya7 @ Sep 25 2016, 22:45) *
но CPU_DIN всегда будет 0. Или я что то не понимаю?

Я могу ошибаться, но в VHDL "&" означает конкатенацию. Или нет?
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Sep 25 2016, 13:06
Сообщение #3


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

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



Цитата(masics @ Sep 25 2016, 18:02) *
Я могу ошибаться, но в VHDL "&" означает конкатенацию. Или нет?

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

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

Сообщение отредактировал Jenya7 - Sep 25 2016, 13:09
Go to the top of the page
 
+Quote Post
masics
сообщение Sep 25 2016, 13:23
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 397
Регистрация: 21-02-05
Из: Melbourne, Australia
Пользователь №: 2 779



Цитата(Jenya7 @ Sep 25 2016, 23:06) *
а конкатенация слева направо? то есть CH_1_INT бит 0?


Надо спрашивать у знатоков. Я на VHDL уже лет 15, наверное, не писал.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Sep 25 2016, 13:39
Сообщение #5


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

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



Цитата(masics @ Sep 25 2016, 18:23) *
Надо спрашивать у знатоков. Я на VHDL уже лет 15, наверное, не писал.

но главное вы помните. для энда есть оператор AND . я когда то писал на VHDL пару лет назад да все позабыл.
Go to the top of the page
 
+Quote Post
Александр77
сообщение Sep 25 2016, 14:06
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 554
Регистрация: 10-07-09
Из: Дубна, Московская область
Пользователь №: 51 111



Да, конкотенация слева на право (от старшего к младшему).
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Sep 25 2016, 15:21
Сообщение #7


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

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



Цитата(Александр77 @ Sep 25 2016, 19:06) *
Да, конкотенация слева на право (от старшего к младшему).

Спасибо.
а вот еще такой вопрос.
Код
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") переменная обнулиться как в С?
Go to the top of the page
 
+Quote Post
wolfman
сообщение Sep 25 2016, 16:30
Сообщение #8


Местный
***

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



Цитата(Jenya7 @ Sep 26 2016, 01:51) *
значит ли что при достижении максимального значения (CLK_DIV = "1111") переменная обнулиться как в С?

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


--------------------
Россия это даже не страна.
Россия это секрет, завернутый в загадку и укрытый не проницаемой тайной...
Go to the top of the page
 
+Quote Post
OM-S
сообщение Sep 25 2016, 17:04
Сообщение #9





Группа: Участник
Сообщений: 12
Регистрация: 12-05-05
Из: г. Москва
Пользователь №: 4 944



Цитата(Jenya7 @ Sep 25 2016, 18:21) *
значит ли что при достижении максимального значения (CLK_DIV = "1111") переменная обнулиться как в С?

Если вы про сигнал CLK_DIV, то да, после CLK_DIV = "1111" будет CLK_DIV = "0000"
Go to the top of the page
 
+Quote Post
Александр77
сообщение Sep 25 2016, 17:35
Сообщение #10


Знающий
****

Группа: Свой
Сообщений: 554
Регистрация: 10-07-09
Из: Дубна, Московская область
Пользователь №: 51 111



Цитата(Jenya7 @ Sep 25 2016, 18:21) *
значит ли что при достижении максимального значения (CLK_DIV = "1111") переменная обнулиться как в С?

Да, после достижения сигнала CLK_DIV значения 1111 (15) следующее сложение с 1 даст результат 0000
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Sep 26 2016, 07:02
Сообщение #11


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

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



спасибо. я таки CLK_DIV имел в виду.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Feb 8 2017, 09:45
Сообщение #12


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

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




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

Выполнить одно действие на несколько кейсов.
Я получаю команды и в кейсе на каждую команду следует определенное действие.
Код
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
Go to the top of the page
 
+Quote Post
andrew_b
сообщение Feb 8 2017, 10:10
Сообщение #13


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

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



Цитата(Jenya7 @ Feb 8 2017, 12:45) *
Конвертация из 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.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Feb 8 2017, 10:34
Сообщение #14


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

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



понял. спасибо.
Go to the top of the page
 
+Quote Post
Raven
сообщение Feb 8 2017, 11:54
Сообщение #15


Местный
***

Группа: Свой
Сообщений: 464
Регистрация: 16-01-05
Из: Санкт-Петербург
Пользователь №: 1 987



Цитата(Jenya7 @ Feb 8 2017, 12:45) *
Есть довольно большая группа команд где я должен поднять один и тот же флаг (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;
Go to the top of the page
 
+Quote Post

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

 


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


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