Проблема в значениях VHDL std_logic_vector - PullRequest
0 голосов
/ 23 июня 2011

У меня проблемы с определением значений мест двоичного числа, хранящихся в формате std_logic_vector.Например, в приведенном ниже коде я пытаюсь увидеть, каково значение в INST_SPEED, от 0 до 99 км / ч.Код действительно длинный со многими условиями if.

if INST_SPEED > "0001001" and INST_SPEED < "0010100" then           -- if INST_SPEED > 9 & INST_SPEED < 20

       UPPER10 <= "0000001";                    -- UPPER10 = 1
       TEMP    <= std_logic_vector(unsigned(INST_SPEED) - 10);
       UPPER1 <= TEMP;                      -- LOWER10 = INST_SPEED - 10
      elsif INST_SPEED > "0010011" and INST_SPEED < "0011110" then  -- if INST_SPEED > 19 & INST_SPEED < 30
       UPPER10 <= "0000010";                    -- UPPER10 = 2
       TEMP    <= std_logic_vector(unsigned(INST_SPEED) - 20);
       UPPER1 <= TEMP;                      -- LOWER10 = INST_SPEED - 20
      elsif INST_SPEED > "0011101" and INST_SPEED < "101000" then   -- if INST_SPEED > 29 & INST_SPEED < 40
       UPPER10 <= "0000011";                    -- UPPER10 = 3
       TEMP    <= std_logic_vector(unsigned(INST_SPEED) - 30);
       UPPER1 <= TEMP;                      -- LOWER10 = INST_SPEED - 30

Однако теперь мне нужно написать аналогичный код для определения значения в диапазоне от 0 до 999.Если я пойду по этой логике, это будет означать 90 таких условий, если!

Кто-нибудь знает о более простом, более разумном способе выполнения этого процесса?Это действительно помогло бы мне, спасибо заранее!

Ответы [ 2 ]

0 голосов
/ 23 июня 2011

Пара вариантов, которые я могу придумать:

  1. Как насчет создания большой LUT (справочной таблицы), которая будет храниться в ПЗУ?Адресом будет значение INST_SPEED, а на выходе будет UPPER10 или TEMP.Вы можете сгенерировать содержимое ПЗУ с помощью скрипта (вне VHDL), а затем вставить его в свой код или загрузить из файла с поддержкой ввода-вывода VHDL-файла.
  2. Действительно ли между входами и выходами нет простого шаблона?Это какая-то математическая функция, которую вы могли бы получить вместо этого?
0 голосов
/ 23 июня 2011

Поменяй проблему. Я предлагаю либо реализовать функцию по модулю для преобразования вашего двоичного значения в значение base-ten (это может быть довольно мало, если не нужно быстро обновлять), либо может быть проще использовать BCD для значения INST_SPEED.

Поскольку вы сейчас кодируете вещи, вам действительно нужна функция разделения / по модулю, то есть то, что вы пытаетесь жестко кодировать со всеми вашими условными выражениями. В зависимости от вашей цели вы можете сделать это «бесплатно» (т. Е. Возможно, на используемой вами ПЛИС имеются неиспользуемые аппаратные множители?).

...