- •Глава 6. Примеры проектирования цифровых устройств с использованием языков описания аппаратуры vhdLиVerilog.
- •6.1. Общие сведения
- •6.2. Триггеры и регистры (Flip-Flops, Registers)
- •6.3. Построение устройств потоковой обработки данных (Datapath logic)
- •6.4. Счетчики
- •6.5. Арифметические устройства
- •6.6.Конечные автоматы (Finite State Machine)
- •6.7. Элементы ввода – вывода
- •6.8.Параметризация
- •6.9. Спрецифика проектирования устройств с учетом архитектурных особенностей плис
- •6.10. Совместное использование ресурсов
- •6.12. Дублирование регистра.
- •6.13.Создание описаний с учетом особенностей архитектуры плис (Technology Specific Coding Techniques).
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;