Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
dsd1-10 / dsd-07=Verilog / vhdl+verilog.DOC
Скачиваний:
118
Добавлен:
05.06.2015
Размер:
405.5 Кб
Скачать

6.8.Параметризация

Как уже отмечалось выше, в последние годы наметилась тенденция к разработке и использованию параметризованных модулей (ядер, макросов, мегафункций) при проектировании устройств на ПЛИС с использованием языков описания аппаратуры. В языках описания аппаратуры существуют специальные конструкции, позволяющие обеспечить полную параметризацию проекта. Это так называемые родовые (параметризованные, настраиваемые) типы данных (Generics) и параметры (Parameters). Мы будем использовать термин настраиваемый тип. Насираиваемые типы данных и параметры используются обычно для определения размерности компонента (например разрядность шин, коэффициентов и т.п.) Конкретное значение параметров определяется при создании конкретного экземпляра компонента. Рассмотрим пример использования параметризации на примере сумматора.

Описание параметризируемого сумматора на VHDL

library IEEE;

use IEEE.std_logic_1164.all;

use IEEE.std_logic_arith.all;

use IEEE.std_logic_unsigned.all;

entity adder is

generic (WIDTH : integer := 8);

port (A, B: in UNSIGNED(WIDTH-1 downto 0);

CIN: in std_logic;

COUT: out std_logic;

Y: out UNSIGNED(WIDTH-1 downto 0));

end adder;

architecture rtl of adder is

begin

process (A,B,CIN)

variable TEMP_A,TEMP_B,TEMP_Y:UNSIGNED(A'length downto 0);

begin

TEMP_A := '0' & A;

TEMP_B := '0' & B;

TEMP_Y := TEMP_A + TEMP_B + CIN;

Y <= TEMP_Y (A'length-1 downto 0);

COUT <= TEMP_Y (A'length);

end process;

end rtl;

Параметр “Width” определяет разрядность данных. Пример конкретного экземпляра компонента с 16 разрядными данными приведен ниже:

U1: adder generic map(16) port map (A_A, B_A, CIN_A, COUT_A, Y_A);

Описание сумматора на Verilog

module adder (cout, sum, a, b, cin);

parameter Size = 8;

output cout;

output [Size-1:0] sum;

input cin;

input [Size-1:0] a, b;

assign {cout, sum}=a +b +cin;

endmodule

Параметр “Size” определяет ширину сумматора. Реализация компонента 16 битного сумматора приведена ниже:

adder #(16) adder16(cout_A, sun_A, a_A, b_A, cin_A)

6.9. Спрецифика проектирования устройств с учетом архитектурных особенностей плис

В отличие от специализированных БИС (ASIC), ПЛИС выполненные по FPGA архитектуре имеют модульную матричную структуру.

Каждая комбинационная ступень реализации сложной функции вносит свой вклад в суммарную задержку распространения сигнала. В результате приходиться учитывать ограничения, связанные с слишком длинными цепями распространения сигналов. Использование соответствующих приемов описания устройств (coding style) позволяет улучшить временные характеристики спроекированного устройства.

Рассмотрим способы снижения числа ступеней вычисления сложной функции (Reducing Logic Levels) для уменьшения длины критических путей распространения сигнала (Critical Paths). Ниже приводятся примеры оптимального проектирования таких устройств.

Пример 1. В данном примере сигнал “critical” (Рис.6.19) проходит через три ступени (logic levels).

Рис.6.19.

Пример написан на языке VHDL.

if ((( Crtical='0' and Obi='1' and Sar='1')

or CpuG='0') and CpuR='0') then

Des <= Adr;

elsif (((Crtical='0' and Obi='1' and Sar='1')

or CpuG='0') and CpuR='1') then

Des <= Bdr;

elsif (Sar='0' and..........

В результате сигнал “critical” является запаздывающим. Чтобы уменьшить число ступеней используем конструкцию if-then-else statement. В результате сигнал “critical” проходит только через одну ступень как показано на Рис.6.20

Рис.6.20

if (Critical='0') then

if (((Obi='1' and Sar='1')

or CpuG='0') and CpuR='0') then

Des <= Adr;

elsif (((Obi='1' and Sar='1')

or CpuG='0' and CpuR='1') then

Des <= Bdr;

end if;

end if;

Пример 2. В данном случае сигнал, обозначенный “critical” (Рис.6.21), проходит через две ступени.

Рис.6.21.

if (clk'event and clk ='1') then

if (non_critical and critical) then

out1 <= in1

else

out1 <= in2

end if;

end if;

Для уменьшения числа ступений для сигнала “critical”, используем мультиплексирование входных сигналов “in1” и “in2” используя для управления мультиплексором сигнал “non_critical”. Выход мультиплексора затем мультиплексируется с входом “in2” при управлении сигналом “critical”. В итоге сигнал “critical” проходит только через одну ступень задержки (Рис.6.22)

Рис.6.22

Реализация на VHDL приведена ниже

signal out_temp : std_logic

if (non_critical)

out_temp <= in1;

else out_temp <= in2;

if (clk'event and clk ='1') then

if (critical) then

out1 <= out_temp;

else out1 <= in2;

end if;

end if;

end if;

Соседние файлы в папке dsd-07=Verilog