Сделайте простую схему для рассеивания мощности в VHDL

Я ищу идеи о чем-то простом, чтобы написать, что я могу использовать для измерения мощности. Мне просто нужно убедиться, что мои измерения мощности работают. Я использую Xilinx ISE 14.1 на Virtex-6. Я хотел бы простую схему, чтобы написать и синтезировать.

До сих пор я пробовал счетчик бит 1K, но это было не очень заметно. Я попробовал счетчик бит 9K, но ISE не смог его синтезировать (я позволил ему проработать час, прежде чем его убить). Сейчас я пытаюсь реализовать большие BRAM и постоянно их поддерживать.

Мне нужен способ ограничить оптимизацию больших векторов, поэтому я бы хотел перезаписать все биты вместе и подать однобитный выход на светодиод. Есть ли простой способ сделать это для очень больших векторов?

2 ответа

Решение

Вот что я придумал. Я чувствую, что это дает хороший компромисс для простого кода и быстрого времени компиляции. Это сдвиг со всеми остальными битами, поэтому каждый FF должен переключаться каждый такт (после того, как он был настроен). Сигнал может быть инициализирован в начале, если это необходимо, но это не должно занять больше секунды или двух, в зависимости от ваших часов, чтобы достичь равновесия. Я использовал светодиод в качестве выхода, чтобы предотвратить оптимизацию схемы.

architecture Behavioral of top is
signal shifter : std_logic_vector(<insert size> downto 0) := (others => '0');
begin    
        process(clk)
    begin
        if(clk'event and clk = '1')then
            shift_bit <= not shift_bit;
                shifter <= shift_bit & shifter(shifter'high downto 1);
        end if;
    end process;

led <= shifter(0);
end Behavioral;

В VHDL 2008 вы можете сделать xor, например, так:

signal wide : std_logic_vector(1000 downto 0);
signal narrow : std_logic;

narrow <= xor wide;

Не уверен, что ISE поддерживает это.

Вы можете использовать функцию как:

function xor_vector(i:std_logic_vector) returns std_logic is
  variable ret:std_logic:=i(i'low);
begin
  for c in i'low+1 to i'high loop
    ret := ret xor i(c);
  end loop;
  return ret;
end function;

(Не проверено, только что набрано - возможно, потребуется синтаксическая настройка!)

Для рассеивания мощности, вы можете попробовать кормить переменным '1' а также '0' шаблон в регистр сдвига, а не счетчик - тогда все биты будут меняться каждый цикл. Установите сброс в регистр сдвига, чтобы инструменты не делали вывод SRL16 более эффективным.

Другие вопросы по тегам