[an error occurred while processing this directive]
|
Вот, поправил все ошибки, и даже погонял эту бодягу в моделировщике и синтезаторе :
--*******************************************************************
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: info@telesys.ru