테스트벤치 들어가기 전 DUT(시험 대상 장치) 복습. 올바른 숫자 시퀀스를 PIN 패드에 입력하면 금고가 열리는 단순한 잠금 장치 모방.
많은 이들이 '조합 자물쇠'라 부르지만, 숫자 순서가 중요하므로 정확한 용어는 '순열 자물쇠'입니다. 명확히 하기 위해 코드락이라 부르겠습니다.
일반적인 호텔 금고. 단순화를 위해 숫자 키만 사용, CLEAR와 LOCK 버튼 생략.
코드락 모듈 동작 원리
락은 잠긴 상태에서 시작. 사용자가 비밀 PIN과 일치하는 네 자리 숫자를 연속 입력하면 잠금 해제. 잘못된 시퀀스 입력 시 다시 잠금. 이 동작은 VHDL의 간단한 시퀀스 디텍터로 구현.
파형은 모듈 타이밍 보여줌. 클럭과 리셋 외에 두 입력: input_digit(정수 0~9), input_enable(std_logic). DUT는 인에이블이 하이일 때 라이징 클럭 에지에서 디짓 샘플링.
출력은 unlock 하나뿐. 네 연속 디짓이 정확한 PIN과 일치할 때만 하이. 예제에서 패스코드는 1234.
엔티티
다음 엔티티 정의는 제네릭으로 비밀 PIN을 하드코딩. 각 제네릭은 0~9 범위 정수로 BCD 디짓 표현.
entity code_lock is generic (pin0, pin1, pin2, pin3 : integer range 0 to 9); port ( clk : in std_logic; rst : in std_logic; input_digit : in integer range 0 to 9; input_enable : in std_logic; unlock : out std_logic ); end code_lock;
선언부
모듈은 단일 내부 신호(최근 입력된 디짓 저장하는 4비트 시프트 레지스터) 사용. 레지스터가 -1~9 값 보유 허용. 특수 값 -1은 리셋 상태용으로, PIN이 0000일 때 기본값으로 잠금 해제되지 않게 함.
type pins_type is array (0 to 3) of integer range -1 to 9; signal pins : pins_type;
다음 프로세스가 시프트 레지스터 구현. 리셋 시 모든 엔트리 -1로 설정. 라이징 에지에서 input_enable 하이면 현재 디짓을 위치 0에 저장, 이전 디짓들 오른쪽으로 시프트.
PINS_PROC : process(clk) begin if rising_edge(clk) then if rst = '1' then pins <= (others => -1); else if input_enable = '1' then pins(0) <= input_digit; pins(1 to 3) <= pins(0 to 2); end if; end if; end if; end process;
VHDL 테스트벤치
검증 로직은 Tcl로 하지만 클럭과 리셋 신호 생성을 위한 기본 VHDL 테스트벤치 필요. 아래 완전한 VHDL 테스트벤치 파일.
library ieee; use ieee.std_logic_1164.all; entity code_lock_tb is end code_lock_tb; architecture sim of code_lock_tb is constant clk_hz : integer := 100e6; constant clock_period : time := 1 sec / clk_hz; signal clk : std_logic := '1'; signal rst : std_logic := '1'; signal input_digit : integer range 0 to 9; signal input_enable : std_logic := '0'; signal unlock : std_logic; begin clk <= not clk after clock_period; DUT : entity work.code_lock(rtl) generic map (1,2,3,4) port map ( clk => clk, rst => rst, input_digit => input_digit, input_enable => input_enable, unlock => unlock ); end architecture;