[an error occurred while processing this directive]
Издание третье, исправленное и дополненное (+)
(«Телесистемы»: Конференция «Программируемые логические схемы и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено Stewart Little 22 января 2005 г. 16:06
В ответ на: Что-то хитрое и интересное.. Не улавливаю пока... А можно коротко суть словами? отправлено Сергей Кириллов 21 января 2005 г. 21:31

Вот, поправил все ошибки, и даже погонял эту бодягу в моделировщике и синтезаторе :

--*******************************************************************
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;

ENTITY bit_cnt IS
PORT ( input : IN std_logic_vector(7 downto 0); -- шина
output : OUT integer RANGE 0 to 8 -- результат
);
END bit_cnt;

ARCHITECTURE der OF bit_cnt IS

FUNCTION tetrade_lut (x : std_logic_vector (3 downto 0)) RETURN integer IS
VARIABLE z : integer RANGE 0 to 15;
TYPE LUT IS ARRAY (0 to 15) OF integer;
CONSTANT result : LUT := (0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4);

BEGIN
FOR i IN 3 downto 0 LOOP -- преобразование типов (из std_logic_vector в integer)
IF(x(i) = '1') then
z := z*2 + 1;
ELSE
z := z*2;
END IF;
END LOOP;

RETURN result(z); -- количество единиц в тетраде

END tetrade_lut;

SIGNAL t0, t1 : integer RANGE 0 to 4;

BEGIN
t0 <= tetrade_lut(input(3 downto 0)); -- кол-во единиц в младшей тетраде
t1 <= tetrade_lut(input(7 downto 4)); -- кол-во единиц в старшей тетраде

output <= t0 + t1; -- кол-во единиц на шине

END der;

--********************************************************************

Текст оптимизирован для FPGA (логические элементы с четырехвходовыми LUT).
Разбиваем шину на две тетрады. Максимальное значение единиц в тетраде - 4, соответственно разрядность результата для каждой тетрады будет 3. Значит, нужно сделать перекодировцик из 4 а 3 (каждый разряд кода результата является функцией четырех разрядов шины и для получения одного разряда результата нужна одна LUT, для трех - три).
Фактически получилось ПЗУ с четырехразрядной шиной адреса и трехразрядной шиной данных. Таких ПЗУшек у нас две, суммируем выходы обеих, получаем четырехразрядный результат.

Все просто, как грабли.

На все - про все требуется 11 LUT'ов FPGA.
Один интересный момент - если использовать FPGA Atmel AT40K, то требуется всего 9 LUT :) ! Почему - вопрос для самостоятельного изучения (подсказка - у AT40K есть два комбинаторных выхода из LUT).

Составить ответ  |||  Конференция  |||  Архив

Ответы


Отправка ответа

Имя (обязательно): 
Пароль: 
E-mail: 

Тема (обязательно):
Сообщение:

Ссылка на URL: 
Название ссылки: 

URL изображения: 


Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru