VHDL 프로그래밍 6. 부프로그램과패키지 한동일 학습목표 부프로그램의종류와차이점과활용방법에대해서배운다. 함수를정의하고호출하는방법을배운다. 프로시저를정의하고호출하는방법을배운다. 부프로그램오버로딩의개념을이해한다. 패키지의사용목적을배운다. 설계파일, 설계단위, 설계라이브러리의개념을이해한다. VHDL 의라이브러리구조를이해한다. 2/39
부프로그램 (subprogram) 부프로그램이란? VHDL 에서사용되는와를총칭하여부프로그램이라고함 별도의모듈로사용되어특정값을계산하는용도 반복되는동작을표현하기위한알고리즘을정의 부프로그램의구조 부프로그램선언 (subprogram declaration) 부프로그램의호출방법정의 부프로그램본체 (subprogram body) 로구성 부프로그램의동작내용서술 3/39 부프로그램 (subprogram) 함수 (function) 형식매개변수는모두입력모드 (in) 리턴값을사용 특정값의계산이나동작을표현 프로시저 (procedure) 형식매개변수는 in, inout, out 모드를가짐 리턴값을가지지않고형식매개변수의 out 모드를이용하여값을출력 프로시저호출은문장 (statement) 을구성 특정값의계산이나동작을표현 4/39
부프로그램 (subprogram) 부프로그램선언의 BNF 정의 subprogram_declaration ::= subprogram_specification i ; subprogram _ specification ::= procedure_specification function_specification procedure_specification i ::= procedure designator subprogram_header [ [ parameter ] ( formal_parameter_list ) ] formal_parameter_list ::= parameter_interface_list interface_ list ::= interface_ element {; interface_ element } interface_element ::= interface_declaration 5/39 부프로그램선언 부프로그램선언의 BNF 정의 - 계속 function_p specification ::= [ pure impure ] function designator subprogram _ header [ [ parameter ] ( formal_parameter_list ) ] return type_mark subprogram_header ::= [ generic ( generic_list ) [ generic_map_aspect ]] ] designator ::= identifier operator _ symbol operator_symbol ::= string_literal 6/39
부프로그램선언 부프로그램선언의예 procedure iic_stop (signal data_bit, scl_level: out std_logic); procedure to_bitvector (variable input : in integer; variable output : out bit_vector); procedure writeheader (file F : text; Width, Height : in integer); procedure writergb (file F: text; R, G, B: in integer); impure function NOW return eu delay y_ length; function "and" (L, R : std_logic_vector) return std_logic_vector; function to_ integer (input : std d_ logic) return eu integer; function to_integer (input : bit_vector) return integer; function to_ integer (input : std d_ logic c_vector) return eu integer; 7/39 부프로그램선언 프로시저의일반적인선언 procedure + 지정어 + 형식매개변수선언 함수의일반적인선언 function + 지정어 + 매개변수선언 + return + 리턴형 pure function : 순수함수 같은매개변수입력에같은값리턴 함수의기본값으로 pure 예약어생략가능 impure function : 비순수함수 같은매개변수입력에다른값리턴 예 : 현재의시간을리턴하는함수 impure 예약어를반드시사용해야함 8/39
부프로그램선언 형식매개변수 (formal parameter) 의클래스 file : 입출력관련모드정보불필요 constant, signal, variable : 사용환경에의해서결정됨 프로시저형식매개변수의모드 (mode) in 모드의기본클래스 : constant inout, out 모드의기본클래스 : variable 함수형식매개변수의모드 (mode) in 클래스를지정하지않을경우에는 constant 로가정 9/39 부프로그램본체 부프로그램본체의 BNF 정의 subprogram_body ::= subprogram_specification is subprogram_declarative_part subprogram_statement_part end [ subprogram_kind ] [ designator ] ; subprogram_declarative_part part ::= { subprogram_declarative_item } subprogram_statement_part statement part ::= { sequential_statement } subprogram_kind ::= procedure function 10/39
부프로그램본체 부프로그램본체의 BNF 정의 계속 subprogram_declarative_item item ::= subprogram_declaration subprogram_body package_declaration subprogram_instantiation_declaration package_body package_instantiation_declaration type_declaration subtype_declaration constant_declaration variable_declaration file_declaration alias_declaration attribute_declaration attribute_specification use_clause group_template_declaration group_declaration 신호 (signal), 공유변수 (shared variable) 선언불가 11/39 부프로그램 (subprogram) 함수의예 function TO_INTEGER (input : std_logic) return integer is variable result : integer := 0; variable weight : integer := 1; if input ='1' then else end if; return result; end TO_INTEGER; result := weight; result := 0; -- if unknowns, default to logic 0 12/39
부프로그램 (subprogram) 프로시저의예 procedure writergb (file F: text; R, G, B: in integer) is variable L : line; write(l, R, RIGHT, 3); write(l, string'(" ")); write(l, G, RIGHT, 3); write(l, string'(" ")); write(l, B, RIGHT, 3); writeline(f, L); end writergb; 13/39 부프로그램 (subprogram) 부프로그램을활용한설계예 함수와프로시저를이용한반가산기의설계예제 14/39
부프로그램 (subprogram) 함수를이용한설계예 library IEEE; use IEEE.std_logic_1164.all; entity HalfAdder is port( end HalfAdder; A, B: in std_logic; S, C : out std_logic); architecture func of HalfAdder is function XOR_GATE ( A, B: std_logic) return std_logic is return A xor B; end XOR_GATE; function AND_GATE ( A, B: std_logic) return std_logic is return A and B; end AND_GATE; S <= XOR_GATE(A, B); C <= AND_GATE(A, B); end func; 15/39 부프로그램 (subprogram) 프로시저를이용한설계예 library IEEE; use IEEE.std_logic_1164.all; entity HalfAdder is port( AB:in A, std_logic; procedure AND_GATE S, C : out std_logic); (signal A, B: in std_logic; end HalfAdder; signal O : out std_logic) is architecture proc of HalfAdder is O <= A and B; procedure XOR_GATE end AND_GATE; (signal A, B: in std_logic; signal O : out std_logic) is O <= A xor B; XOR_GATE(A, B, S); AND_GATE(A, B, C); end XOR_GATE; end proc; 16/39
부프로그램 (subprogram) 부프로그램오버로딩 (overloading) 서로다른시그니처를이용하여하나의지정어를여러개의부프로그램에서사용 시그니처 (signature) 형식매개변수의개수 형식매개변수들의형과순서 함수인경우리턴값의형 연산자오버로딩 (operator overloading) 함수선언시지정어가연산자일경우연산자오버로딩이용가능 17/39 부프로그램 (subprogram) 부프로그램오버로딩예및호출예 -- Declarations of overloaded dsubprograms: procedure Dump (F: inout Text; Value: Integer); procedure Dump (F: inout Text; Value: String); procedure Check (Setup: Time; signal D: Data; signal C: Clock); -- a procedure procedure Check (Hold: Time; signal C: Clock; signal D: Data); -- b procedure -- Calls to overloaded subprograms: Dump mp(sys_output, t 12); -- OK Dump (Sys_Error, "Actual output does not match expected output"); -- OK Check (Setup=>10 ns, D=>DataBus >DataBus, C=>Clk1); -- OK, a procedure Check (Hold=>5 ns, D=>DataBus, C=>Clk2); -- OK, named association, b procedure Check (15 ns, DataBus, Clk) ; -- OK, positional association, a procedure 18/39
부프로그램 (subprogram) 해결함수 (resolution function) 하나의신호에여러개의소스로부터값이입력될때최종적으로하나의값으로조정해주는함수 연결논리합 (wired-or), 버스구조에많이사용 대표적인해결함수 :std std_logic_1164 패키지의 resolved function 해결된신호 (resolved signal) 해결함수가선언된신호 대표적인해결된신호 : std_logic 19/39 해결함수 해결함수의예 function resolved ( s : std_ulogic_vector ) return std_ulogic is variable result : std_ulogic := 'Z'; -- weakest state default if (s'length = 1) then return s(s'low); else end resolved; end if; return result; for i in s'range loop result := resolution_table(result, s(i)); end loop; 20/39
해결함수 해결함수의예 constant resolution_table : stdlogic_table := ( - - U X 0 1 Z W L H - ( 'U', 'U', 'U', 'U', 'U', 'U', 'U', 'U', 'U' ), -- U ( 'U', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X' ), - - X ( 'U', 'X', '0', 'X', '0', '0', '0', '0', 'X' ), - - 0 ( 'U', 'X', 'X', '1', '1', '1', '1', '1', 'X' ), - - 1 ( 'U', 'X', '0', '1', 'Z', ' W', 'L', 'H', 'X' ), -- Z ( 'U', 'X', '0', '1', ' W', ' W', 'W ', 'W ', 'X' ), -- W ( 'U', 'X', '0', '1', 'L', 'W ', 'L', ' W', 'X' ), - - L ( 'U', 'X', '0', '1', 'H', ' W', 'W ', 'H', 'X' ), -- H ( 'U', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X' ) - - - ); 21/39 해결함수 std_logic 신호의정의 type std_ulogic is ( 'U', -- Uninitialized 'X', -- Forcing Unknown '0', -- Forcing 0 '1', -- Forcing 1 'Z', -- High Impedance 'W', -- Weak Unknown 'L', -- Weak 0 'H', -- Weak 1 '-' -- Don't care ); function resolved ( s : std_ulogic_vector ) return std_ulogic; subtype std_logic is resolved std_ulogic; 22/39
패키지 (package) 패키지란? 단일목적을위한선언 (declaration) 들의모임 공통적으로사용되는선언이나자원을공유하기위한용도 패키지의구조 패키지선언 (subprogram declaration) 패키지의가시적인부분정의 패키지선언으로완료되고본체부분이필요없을수도있음 패키지본체 (subprogram body) 로구성 부프로그램의숨겨진동작을처리 23/39 패키지 (package) VHDL 표준라이브러리에서제공하는패키지들 standard( 자동으로선언됨 ) textio env std_logic_1164 std_logic_arith std_logic_signed std_logic_unsigned std_logic_textio std_logic_misc 24/39
패키지 (package) 패키지선언의 BNF 정의 package_declaration ::= package identifier is package_header package_declarative_part end [ package ] [ package_simple_name _ p _ ] ; package_header ::= [ generic_clause ] [ generic_map_aspect ; ] package_declarative_part ::= { package_declarative_item _ } 25/39 패키지 (package) 의선언 패키지선언의 BNF 정의 - 계속 package_declarative_item item ::= subprogram_declaration subprogram_instantiation_declaration package_declaration package_instantiation_declaration type_declaration subtype_declaration constant_declaration signal_declaration variable_declaration file_declaration alias_declaration component_declaration attribute_declaration attribute_specification disconnection_specification specification use_clause group_template_declaration group_declaration 26/39
패키지 (package) 의선언 패키지선언의예 package gfx_pkg is end gfx_pkg; -- graphic primitive type primitives is (pointp, rectp, textp, text2p, srcbltp); -- iic control value constant sda_start: time := 560 ns; constant sda_stop: time := 560 ns; -- memory read/write constant MEM_WRITE : std_logic := '1'; constant black_pxl : std_logic_vector(7 downto 0) := "00010000"; function IPF_ABS1( data : in bit_vector ) return bit_vector; procedure iic_start (signal data_bit, scl_level: out std_logic); 27/39 패키지 (package) 패키지본체를위한 BNF 정의 package_body ::= package body package_simple_name is package_body_declarative_part _p end [ package body ] [ package_simple_name ] ; package_body_declarative_part ::= { package_body_declarative_item _ } 28/39
패키지본체 패키지본체를위한 BNF 정의 계속 package_body_declarative_item _ ::= subprogram_declaration subprogram_body package_declaration package_body type_declaration subtype_declaration constant_declaration variable_declaration file_declaration alias_declaration attribute_declaration attribute_specification use_clause group_template_declaration p _ group_declaration 패키지선언내의선언 본패키지를사용하는모든설계단위에서사용가능 패키지본체내의선언 패키지본체내부에서만사용되며패키지외부에서는보이지않음 29/39 패키지본체 패키지본체의예 package body TriState is constant CYCLE_TIME: TIME := 100 ns; function BitVal (Value: Tri) return Bit is end; constant Bits : Bit_Vector := "0100"; return Bits(Tri'Pos(Value)); function TriVal (Value: Bit) return Tri is return Tri'Val(Bit'Pos(Value)); end; end package body TriState; 30/39
설계라이브러리 VHDL 의라이브러리구조 Synopsys y Library Xilinx Library User Defined Library Design File VHDL Analyzer Work Library mux tb_mux adder tb_adder STD Library standard textio env 31/39 IEEE Library std_logic_1164 std_logic_arith 설계라이브러리 설계단위 (design unit) 독립적으로컴파일되고관리될수있는서술내용 엔티티선언, 아키텍처본체, 구성선언, 패키지본체등 설계단위가복수개가모여설계파일 (design file) 형성 설계라이브러리 (design library) 컴퓨터파일시스템내의저장장소 컴파일된설계단위들은설계라이브러리 (design library) 에저장됨 VHDL 문법과무관 VHDL 개발환경별로정의 32/39
설계라이브러리 설계파일 (design file) 의 BNF 정의 design_file ::= design_unit { design_unit } design_unit ::= context_clause library_unit library_unit ::= primary_unit ::= primary_unit secondary_unit entity_declaration configuration_declaration package_declaration context_declaration secondary_unit ::= architecture_body package_body 33/39 설계라이브러리 라이브러리단위 (library unit) 문장서술순서에따라해석되고컴파일완료된설계단위 주라이브러리단위 : 독립적으로해석됨 구성선언 (configuration declaration) 패키지선언 (package declaration) 정황선언 (context declaration) 보조라이브러리단위 : 주라이브러리단위의 body 아키텍처본체 (architecture body) 패키지본체 (package body) 34/39
설계라이브러리 정황선언 (context t declaration) 의 BNF 정의 context_declaration ::= context identifier is context_clause end [ context ] [ context_simple_name ] ; context_clause clause ::= { context_item } context_item ::= library_clause use_clause context_reference context_reference ::= context selected_name {, selected_name }; IEEE Standard 1076-2008 버전부터추가된사양 이전버전부터사용되던정황절 (context clause) 을설계단위로다룰수있는방법제공 35/39 설계라이브러리 정황선언 (context t declaration) 의예 context t project oject_context t is library project_lib; use project_lib.project_defs.all; library IP_lib; context IP_lib.IP_context; end context project_context; 정황절 : 바로다음에오는설계단위에서참조할라이브러리를연결시키는작업수행 library 절을먼저선언한후 use 절을이용하여필요한패키지를연결 library 절 : 해당설계단위에서참조할라이브러리의논리적이름정의 use 절 : 앞서선언된라이브러리내의필요패키지연결 36/39
설계라이브러리 설계라이브러리의 BNF 정의 library_ clause ::= library logical _ name_ list ; logical_name_list ::= logical_name {, logical_name } logical_name l ::= identifierifi 설계라이브러리의선언예 library IEEE; library STD, WORK; -- 정황선언이외의모든설계단위에암시적으로포함됨 37/39 설계라이브러리 설계라이브러리의구분 작업라이브러리 (working library) 생성된라이브러리단위를저장하는파일시스템상의저장장소 오직하나의라이브러리만이작업라이브러리가됨 자원라이브러리 (resource library) 설계단위들을해석할때참고할수있는라이브러리단위들을보유하고있는파일시스템상의저장장소 임의의개수의라이브러리가자원라이브러리가될수있음 예 : work, std, IEEE, 등 38/39
설계라이브러리 STD 라이브러리 standard 패키지와정황선언을제외한모든설계단위에자동적으로선언되는라이브러리 암시적인선언내용 library STD, WORK; use STD.STANDARD.all; STD 라이브러리내의패키지들 standard textio env 39/39