신호등 제어기 차량의 흐름에 따라 신호등의 신호를 제어하는 장치 신호등 제어기의 입출력 신호 Sa, Sb : 도로 A, B 에 차량이 들어올 때 신호 Ga,Ya,Ra : 도로 A 의 신호등 Gb,Yb,Rb : 도로 B 의 신호등 Y G R 도로 A PAL22V10의 입출력 신호의 배정 도로 B
신호등 제어기 신호등의 동작 순서 신호등의 동작 > - A도로가 main 도로 임, clock 의 주기는 =10 sec Y G R 신호등의 동작 순서 신호등의 동작 > - A도로가 main 도로 임, clock 의 주기는 =10 sec – A가 녹색일 때 B에 차가 오면 B가 녹색이 된다. – 50초 후 : B에 차가 없고, A에 차가 오면 신호등이 바뀜 B에 차가 있고, A에 차가 없으면 B신호 10초 연장 – A가 녹색이 되면 최소 60초 동안은 녹색으로 유지됨
신호등 제어기 신호등 제어기의 상태 그래프 Ga 를 60초 동안 유지 Gb 를 50초 동안 유지 초기상태 도로 B에 차량
신호등 제어기 begin case (L_stateA) is when s0 => out_light <= “100”; Key point : Case – when 문을 이용하여 상태에 따른 신호등 제어신호 에 값을 할당 한다. begin case (L_stateA) is when s0 => out_light <= “100”; when s1 => out_light <= “110”; when s2 => out_light <= “001”; when s3 => out_light <= “010”; end case Y G R
신호등 제어기 VHDL State 상태변화를 Case-when 로 표현 신호등 제어신호
신호등 제어기 신호등 제어기 상태 테이블 S0-S12에 0000 부터 1100까지 2진 address 할당 Ga 60 sec 유지 Gb 50 sec 유지 입력4개 출력4의 D-FF으로 구성 논리설계 프로그램 사용
누산기를 가진 병렬 이진 덧셈기 구조 : n bit 의 경우 => n 개의 FA 와 D-FF로 구성 동작 : a(n:1) <= a(n:1) + b(n:1) + c1, 0011 <= 0000 + 0011 + 0 : 누산기 clear, B에 A값 입력 1000 <= 0011 + 0100 + 1 입력: b(n:1), c1, clk, clear, Ad(덧셈제어신호) : * clk 와 ad를 묶어서 ad 가 1일 때 만 덧셈을 수행 할 수 있다. 출력: a(n:1), c(n+1:2)
누산기를 가진 병렬 이진 덧셈기 22V10을 사용한 구현 22V10을 사용한 다른 구현 – 입력 수 = n + 4(clk,cin,clear,ad), – 출력 수 = 2n ≤ 10 (n에 대해 각각 FF 출력과 조합함수C 출력을 가진다) – 입출력 수 = (n+4)+2n = 3n+4 ≤ 22 그러므로 n ≤ 5 (5비트 덧셈기 구현 가능) 22V10을 사용한 다른 구현 – 2-bit adder를 직접 구현하여 carry output 개수를 반으로 줄임 – 출력 수 = 1.5n ≤ 10, 입출력 수 = (n+4) + 1.5n = 2.5n+4 ≤ 22 그러므로 n < 6 (6비트 덧셈기 구현 가능) – 결과적으로 덧셈기의 속도는 증가한다.
누산기를 가진 병렬 이진 덧셈기 2 bit adder 의 구성 2 bit adder 의 진리표 13 개의 AND gate 항으로 구성 22V10은 16개의 AND gate 항이 허용 2 bit adder 의 진리표
Keypad 스캐너 – 입력: keypad의 눌려진 위치 (행, 열) – 출력: 눌려진 번호에 대한 2진 코드
Keypad 스캐너 – 입출력 신호의 배치 입력: 행 위치(R0-R3), 출력: 열 위치(C0-C2), 2진 코드(N3-N0) 키를 누르면 행과 열이 연결되고 해당되는 키 숫자를 2진수로 출력 (5번 : 0101, * : 1010 ) – 스캐닝 과정 1) C0-C2에 1을 공급하고 R0-R3 중 하나가 1이 될 때까지 대기 Key 가 눌려지면 R0,R1,R2,R3 중 하나는 1이 된다. 2) C0=1을 공급하고 C2=0, C3=0 에서 R0-R3 중 하나가 1인지 확인, 1이 있으면 해당하는 2진 코드를 출력, V=1 출력 1이 없으면 C1, C2에 대해서 마찬 가지 과정 반복 수행 3) 코드 출력 후 C0-C2에 1을 공급하고 R0-R3 중 1인 것이 없을 때까지 대기 – 접점에서의 접촉진동을 고려한 설계를 해야 함
Keypad 스캐너 접촉 진동 제거 회로 클럭주기 >접촉진동시간 QA -> DB 로 안정된 입력 동기순차회로의 입력 클럭주기 >접촉진동시간 QA -> DB 로 안정된 입력 진동이 제거된 출력. 2열 스캔이 끝날 때까지 QA를 1로 유지시킴
Keypad 스캐너 스캐너의 모듈 Keypad : R(3:0) 과 C(2:0) 이 매트릭스로 연결 Debounce : R(3:0) 이 OR-DFF 로 묶임, 키가 눌러지면 K 발생 진동이 가라 앉은 후의 출력은 Kd 가 된다. Keyscan : key를 검색하기 위한 C2, C1, C0 신호의 발생 Decoder : R(3:0)과 C(2:0) 의 입력조합으로 코드를 발생
Keypad 스캐너 State Diagram (상태도) - 초기상태 So - So 에서 K=1 이 입력 되면 S1 상태로 간다. 출력은 C0,C1,C2. - Kd=1 이 되면 S2 상태로 가고 스캐닝을 위한 신호 C0=1을 내보낸다. - S2 상태에서 K=1 이 입력되면 V=1을 내보내고 코드가 발생되며 S5 상태로 간다. S2 상태에서 K=0 이면 S3로 간다. - S3에서 K=1 이 입력되면 V=1을 내보내고 코드가 발생되며 S4 상태로 간다. S3 상태에서 K=0 이면 S4로 간다. - S5 상태에서 Kd=1 이면 상태를 유지하고, Kd=0 이면 S1의 상태로 간다
Keypad 스캐너 Decoder 출력 생성 코드
Keypad 스캐너 상태 할당 : Q1,Q2,Q3,Q4 S0 <- 0000, S1 <- 0111, S2 <- 0100, S3 <- 0010, S4 <- 0001, S5 <- 1111 프로그램을 이용한 상태식 Q1+ = Q1 Kd + Q2Q3’K + Q2’Q3K + Q2’Q4 Q2+ = Q2’Q3’+ K + Q4 Q3+ = Q3’ + Q1 + Q4 Kd’ + Q2’K Q4+ = Q2’ + Q1 + Q3 Kd’ + Q3’K V = KQ2Q3’ + KQ2’Q3 + Q2’Q4 K = R0 + R1 + R2 + R3
Keypad 스캐너 VHDL C0에 변수이름 Q2를 사용 QA와 Kd 사이에 FF이 있는 것으로 설정됨
Keypad 스캐너 보정된 State Diagram (상태도) Kd’K Kd’+K
Keypad 스캐너 Entity scanner is port (R0, R1, R2, R3, CLK : in bit ; C0, C1, C2 : inout bit ; N0, N1, N2, N3, V : out bit ); end scanner; Architecture behavior of scanner is signal QA, K, Kd: bit ; signal state, nextstate : integer range 0 to 5 ; begin K <= R0 or R1 or R2 or R3 ; -- this is decoder section N3 <= (R2 and not C0) or (R3 and not C1) ; N2 <= R1 or (R2and C0) ; N1 <= (R0 and not C0) or (not R2 and C2) or (not R1 and not R0 and C0) ; N0 <= (R1 and C1) or (not R1 and C2) or (not R3 and not R1 and not C1) ; Process (state, R0, R1, R2, R3, C0, C1, C2, K ,Kd, QA) C0 <=‘0’; C1 <=‘0’, C2 <=‘0’, V <=‘0’ ;
Keypad 스캐너 Case state is when 0 => nextstate <=1 ; when 1 => C0 <= ‘1’; C1 <=‘1’; C2 <=‘1’; if (Kd and K) = ‘1’ then nextstate <=2; else next state <=1 ; end if; when 2 => C0 <= ‘1’; if (Kd and K) = ‘1’ then V <=‘1’ ; nextstate <=5; else if K=‘0’ then next state <=3 ; else nextstate <=2; when 3 => C1 <= ‘1’; else if K=‘0’ then next state <=4 ; else nextstate <=3; when 4 => C2 <= ‘1’; else nextstate <=4; when 5 => C0 <= ‘1’; C1 <=‘1’ ; C2 <=‘1’ ; if Kd = ‘0’ then nextstate <= 1; else nextstate <=5; end case;
Keypad 스캐너 end process; process (CLK) begin if CLK=‘1’ and CLK’event then state <= nextstate; QA <= K ; Kd <=QA ; end if; end behavior
Keypad 스캐너 Test 용 VHDL code : VHDL test bench 를 사용 스캔 테스트는 스캐너로 부터 C 신호에 응답하여 적절한 R 신호를 제공 하여 키가 눌러 졌음을 시뮬레이션 한다. 스캔 테스트가 스캐너로부터 V=1 의 신호를 받으면, 눌려진 키와 N의 수가 일치하는 지 확인한다.
Keypad 스캐너 테스트 과정 Scantest용 VHDL 1> 눌려진 키를 시뮬레이션 하기 위해 배열로부터 키 숫자를 읽는다 2> V=1 이고 클럭의 상승이 발생할 때 까지 기다린다. 3> 스캐너로 부터의 N 출력과 키 숫자가 일치하는지 검증한다. 4> 키가 눌려지는 것을 시뮬레이션 하기 위해 KN=15를 설정한다. 5> 새로운 키가 선택되기 전에, kd=0 일 때 까지 기다린다. Scantest용 VHDL
Keypad 스캐너
ASSERT 문 -합성불가, 시뮬레이션이나 합성시에 참조적문으로 사용 -형식 assert condition {report string } {severity severity-level}; * condition이 false이면 assertion violation 발생 Severity-level 의 종류 NOTE –시뮬레이션에서 메시지전달 WARNING -unusual situation, 시뮬레이션 계속 ERROR –시뮬레이션 계속 실행결과가 적합해가 아님 FAILURE -fatal error, 시뮬레이션 중단 assert boolean-expression report “all is well" severity WARNING; assert Op_code = "1111" report "Invalid Op Code " severity FAILURE;
BCD to seven segment decoder
BCD to seven segment decoder LIBRARY ieee; USE ieee.std_logic_1164.ALL; ENTITY seven_seg IS PORT( dataIn : IN std_logic_vector(3 DOWNTO 0); segments : OUT std_logic_vector(7 DOWNTO 0) ); END seven_seg; ARCHITECTURE synthesis1 OF seven_seg IS BEGIN WITH dataIn SELECT segments <= “01111110 ” WHEN “0000”, -- 0 “00110000 ” WHEN “0001”, -- 1 “01101101 ” WHEN “0010”, -- 2 “01111001 ” WHEN “0011”, -- 3 “00110011 ” WHEN “0100”, -- 4 “01011011 ” WHEN “0101”, -- 5 “01011111 ” WHEN “0110”, -- 6 “01110000 ” WHEN “0111”, -- 7 “01111111 ” WHEN “1000”, -- 8 “01111011 ” WHEN “1001”, -- 9 “00000000 ” WHEN OTHERS; END synthesis1;
BCD to seven segment decoder VHDL code ?
연산자에 대한 VHDL 1. Arithmetic operator
연산자에 대한 VHDL 2. relation operator
연산자에 대한 VHDL 3. equality operator