«…лишь недалекие люди боятся конкуренции, а люди подлинного творчества ценят общение с каждым талантом…» А. Бек, Талант.

ПТСиПЦУвСБ/Лекция 4

Материал из Wiki

Перейти к: навигация, поиск
Заголовок
Типы данных языка VHDL
Автор
Авдеев Н.А.
Нижний колонтитул
ПТСиПЦУвСБ/Лекция 4
Дополнительный нижний колонтитул
Авдеев Н.А., 18:45, 25 марта 2014


Содержание

Слайд: Содержание

Слайд: Формальный синтаксис декларации generic

entity_declaration ⇐
  entity identifier is
    [ generic ( generic_interface_list ) ; ]
    [ port ( port_interface_list ) ; ]
    { entity_declarative_item }
  [ begin
    { concurrent_assertion_statement
       | passive_concurrent_procedure_call_statement
       | passive_process_statement } ]
  end [ entity ] [ identifier ] ;

 interface_list ⇐ interface_declaration { ; ... }

 interface_declaration ⇐
    identifier { , ... } : subtype_indication [ := expression ]


Слайд: Пример 1 (generic)

entity and2 is
  generic ( Tpd : time );
  port ( a, b : in std_logic; y : out std_logic );
end entity and2;

architecture simple of and2 is
begin
  and2_function :
    y <= a and b after Tpd;
end architecture simple;


Оператор port map

instantiation_label : component_name port map (port list);
instantiation_label :
 [ component ] component_name
 | entity entity_name [ ( architecture_identifier ) ]
 | configuration configuration_name
  [ generic map ( generic_association_list ) ]
  [ port map (  [ port_name => ] signal_name [, [ port_name => ] signal_name]... ) ] ;

Пример:

gate1 : and2                                 -- [ component ] component_name
  generic map ( Tpd => 2 ns )
  port map ( a => sig1,
             b => sig2,
             y => sig_out );
gate2 : entity work.and2(simple)             -- entity entity_name [ ( architecture_identifier ) ]
  generic map ( Tpd => 3 ns )
  port map ( a => a1, b => b1, y => sig1 );


Слайд: Пример 2 (generic)

entity control_unit is
  generic ( Tpd_clk_out, Tpw_clk : delay_length;
            debug : boolean := false );
  port ( clk   : in std_logic;
         ready : in std_logic;
         control1, control2 : out std_logic );
end entity control_unit;
. . . 
generic map ( 200 ps, 1500 ps, false )
generic map ( Tpd_clk_out => 200 ps, Tpw_clk => 1500 ps )
generic map ( 200 ps, 1500 ps, debug => open )


Слайд: Пример 3 (generic)

entity reg is
  generic ( width : positive );
  port ( d : in std_logic_vector(width - 1 downto 0);
         q : out std_logic_vector(width - 1 downto 0);
         clk, reset : in std_logic );
end entity reg;

architecture behavioral of reg is
begin
  behavior : process (clk, reset) is
    constant zero : std_logic_vector(width - 1 downto 0) := (others => '0');
  begin
    if reset = '1' then
      q <= zero;
    elsif rising_edge(clk) then
      q <= d;
    end if;
  end process behavior;
end architecture behavioral;


Слайд: Расширение VHDL-2008 Generic Types

entity generic_mux2 is
  generic ( type data_type );
  port
    ( sel  : in bit;
      a, b : in data_type;
      z    : out data_type );
end entity generic_mux2;

architecture rtl of mux2 is
begin
  z <= a when not sel else b;
end architecture rtl;

. . .

signal sel_bit, a_bit, b_bit, z_bit : std_logic;
. . .
bit_mux : entity work.generic_mux2(rtl)
  generic map ( data_type => std_logic )
  port map
    ( sel => sel_bit, a => a_bit, b => b_bit,
      z => z_bit );


Слайд: Конструкция generate

for_generate_statement ⇐
  Метка_generate :
    for идентификатор in описание_диапазона generate
        [ { Декларативная_часть }
       begin ]
         { параллельные_операторы }
     [ end ; ]
    end generate [ Метка_generate ] ;
описание_диапазона ⇐
   discrete_subtype_indication
 | range_attribute_name
 | simple_expression ( to | downto ) simple_expression

Слайд: Пример (generate)

library ieee; use ieee.std_logic_1164.all;
entity register_tristate is
  generic ( width : positive );
  port ( clock      : in  std_logic;
         out_enable : in  std_logic;
         data_in    : in  std_logic_vector(width - 1 downto 0);
         data_out   : out std_logic_vector(width - 1 downto 0) );
end entity register_tristate;
architecture cell_level of register_tristate is
  component D_flipflop is
    port ( clk : in std_logic; 
           d   : in std_logic;
           q   : out std_logic );
  end component D_flipflop;
  component tristate_buffer is
    port ( a  : in std_logic;
           en : in std_logic;
           y  : out std_logic );
  end component tristate_buffer;
begin
  cell_array : for bit_index in width - 1 downto 0 generate
    signal data_unbuffered : std_logic;
  begin
    cell_storage : component D_flipflop
      port map ( clk => clock, 
                 d   => data_in(bit_index),
                 q   => data_unbuffered );
    cell_buffer : component tristate_buffer
      port map ( a  => data_unbuffered,
                 en => out_enable,
                 y  => data_out(bit_index) );
  end generate cell_array;
end architecture cell_level;


Слайд: Пример - схема (generate)


Слайд: Условный generate

if_generate_statement ⇐
  Метка_generate :
    if Условие generate
      generate_statement_body
  { elsif condition generate
      generate_statement_body }
  [ else generate
      generate_statement_body ]
    end generate [ Метка_generate ] ;

Слайд: Условный generate (Пример)

library ieee;  use ieee.std_logic_1164.all;
 entity shift_reg is
   port ( phi1, phi2 : in std_ulogic;
          serial_data_in : in std_ulogic;
          parallel_data : out std_ulogic_vector );
   end entity shift_reg;
--------------------------------------------------
 architecture cell_level of shift_reg is
   alias normalized_parallel_data :
     std_ulogic_vector(0 to parallel_data'length - 1) is parallel_data;
   component master_slave_flipflop is
      port ( phi1, phi2 : in std_ulogic;
             d : in std_ulogic;
             q : out std_ulogic );
   end component master_slave_flipflop;
 begin
   reg_array : for index in normalized_parallel_data'range generate
   begin
     reg : if index = 0 generate
       cell : component master_slave_flipflop
          port map ( phi1, phi2,
                     d => serial_data_in,
                     q => normalized_parallel_data(index) );
     else generate
       cell : component master_slave_flipflop
          port map ( phi1, phi2,
                     d => normalized_parallel_data(index - 1),
                     q => normalized_parallel_data(index) );
     end generate other_cell;
   end generate reg_array;
 end architecture cell_level;


Слайд: NEW