존슨카운터의 동작을 설명·설계할 수 있다 링카운터의 동작을 설명·설계할 수 있다 존슨카운터 및 링카운터 학습목표 존슨카운터의 동작을 설명·설계할 수 있다 링카운터의 동작을 설명·설계할 수 있다
13-1. 3비트 존슨 카운터 - 여러 개의 F/F이 직렬로 구성된 시프트 레지스터에서 최종단 F/F의 Q 출력을 반전시킨 후 처음 단 F/F의 데이터 입력에 연결시켜 상태 가 순환적으로 변하도록 한 카운터 [5비트 동기식 존슨카운터의 진리표] 현재 값 E D C B A 1 [5비트 동기식 존슨카운터의 회로도]
13-2. 3비트 존슨 카운터 - Design library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity johnson3 is Port ( pr_b : in std_logic; clr_b : in std_logic; clk : in std_logic; q : inout std_logic_vector(2 downto 0)); end johnson3; architecture Behavioral of johnson3 is begin process (pr_b, clr_b, clk) if pr_b ='0' then q <= "111"; elsif clr_b ='0' then q <= "000"; elsif clk'event and clk='1' then q(2 downto 0) <= q(1 downto 0) & not q(2); end if; end process; end Behavioral; q(2) q(1) q(0)
13-3. 3비트 존슨 카운터 - Simulation Shift Register Simulation 파형 Shift register Pin 할당 입 력 출 력 신호 이름 키트 이름 핀 번호 clk MTP_SWC p100 q(2) LED0 p2 pr_b MTP_SWF P102 q(1) LED1 p3 clr_b MTP_SW0 p101 q(0) LED2 p4
[실습 문제] 5비트 링카운터] 임의의 값이 다음 위치로 순차적으로 전달되면서 회전하는 카운터 링 카운터 임의의 값이 다음 위치로 순차적으로 전달되면서 회전하는 카운터 [ 5비트 동기식 링카운터의 회로도 ] [ 5비트 동기식 링카운터의 진리표] 클럭의 상승(또는 하강) 에지에서 ‘1’의 값이 E→ D → C → B → A → E → D → …순환
7-Segment 제어기의 동작을 설명 ∙ 설계할 수 있다 7-세그먼트 제어기 학습목표 7-Segment 제어기의 동작을 설명 ∙ 설계할 수 있다
14-1. 7-Segment 제어기의 설계 7-Segment - 7개의 조각으로 나뉘어진 LED - 각 세그먼트마다 a ~ g까지 이름이 붙어 있음 - 각 a ~ g의 Segment들의 조합으로 숫자를 표시할 때 사용 입 력 출 력 d3 d2 d1 d0 a b c d e f g 1 7-Segment Decoder 및 LED
14-2. 7-Segment 제어기의 설계 6개의 7-Segment 동작원리 - 각 segment에 대한 LED신호가 6개 모두 공통으로 연결 되어짐 6자리를 모두 다른 숫자를 표시하는 방법은 ? - 각 세그먼트들의 활성화 비활성화를 지정해주기 위한 Digit신호 6개가 필요 - Digit신호를 각 segment마다 일정주기로 전달하여 숫자 표시
14-3. 7-Segment 제어기의 설계 6자리 7-Segment를 모두 다른 숫자로 표시하는 방법 신호 이름을 왼쪽부터 DIGIT1 – DIGIT6라 주고, DIGIT 값이 1인 자리는 숫자 데이터에 의해 숫자 표시
객체 (Object) VHDL에서 값을 가질 수 있는 것 (signal, variable, constant) VHDL 합성시 선(wire)으로 구현되며, 각 부품 연결에 사용 되는 외적 변수 값 대입을 위한 연산자 ‘ <= ’ : 즉시 대입되지 않고 필요시점에서 대입됨 process문 내 사용시 end process 만나야 대입 완료 (2) ‘ := ’ : signal의 초기화시 사용 k1 k2 y
Signal 선언 방법 signal로 선언 : architecture와 begin 사이에 선언 port로 선언 : entity 내에 port로 선언 entity system is port (k1, k2, k3 : in std_logic ; -- signal 선언 y_out : out std_logic ) ; end system ; architecture sample of system is signal cn : std_logic ; -- signal 선언 begin cn <= k1 nand k2 ; y_out <= cn xor k3 ; end sample ;
2. Variable (변수) Process 또는 부 프로그램에서만 사용 선언된 부분 내에서만 유효한 내적 변수 최종 variable의 값을 보존하려면 process 빠져 나오기 전 signal에 최종 variable 값을 대입시켜야 함 signal과 같이 선으로 구현되지 않고, 중간 연산 단계에서 주로 이용 값 대입을 위한 연산자 : ‘ := ’
variable 선언방식 variable temp1, temp2 : std_logic 사용 예 temp1 := ‘1’ ; temp2 := a or b ; k <= temp1 ; -- temp1은 variable, k는 signal
port (i, j, k : in std_logic ; -- signal 선언 m : out std_logic ) ; entity sys_var is port (i, j, k : in std_logic ; -- signal 선언 m : out std_logic ) ; end sys_var ; architecture sample of sys_var is begin process(I,j,k) variable temp : std_logic ; -- variable 선언 temp := ‘1’ ; temp := i and temp ; temp := j and temp ; temp := k and temp ; m <= temp ; end process ; End sample ; i temp j m k
3. Constant (상수) 초기에 선언한 상수값 유지시 사용 한번 대입된 값은 바꿀 수 없음 값 대입을 위한 연산자 : ‘ := ’ 선언방식 constant delay : integer := 5ns ; constant size : integer := 512 ; 사용 예 signal p : integer ; p <= delay ; p <= size ;
14-4. 7-Segment 제어기의 설계- Design library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity seg7 is Port ( RSTB : in std_logic; CLK_4M : in std_logic ; DIGIT : inout std_logic_vector(5 downto 0); -- 세그먼트 선택을 위한 선택 신호 SEG : out std_logic_vector(6 downto 0)); -- 세그먼트의 7개 LED 출력 신호 end seg7; architecture Behavioral of seg7 is signal clk_500 : std_logic; begin -- =========== 자리 선택 Clock(500Hz) Generator ================ process(RSTB,CLK_4M) variable cnt : integer range 0 to 4000; begin if RSTB = '0' then cnt := 0; clk_500 <= '0'; elsif rising_edge (CLK_4M) then if cnt >= 3999 then -- 정상동작시 if cnt >= 1 then -- 시뮬레이션시 cnt := 0; clk_500 <= not clk_500; else cnt := cnt + 1; end if; end if; end process; end Behavioral ;
14-5. 7-Segment 제어기의 설계- Design --=============== Digit selection =========================== process(RSTB,clk_500) begin if RSTB = '0' then DIGIT <= "100000"; elsif rising_edge (clk_500) then DIGIT <= DIGIT(0) & DIGIT (5 downto 1); -- 선택 자리 이동 end if; end process; --============== 각 자리마다 숫자 표시 ====================== process(DIGIT) case DIGIT is when "100000" => SEG <="0110000"; --첫번째 1표시 when "010000" => SEG <="1101101"; --두번째 2표시 when "001000" => SEG <="1111001"; --세번째 3표시 when "000100" => SEG <="0110011"; --네번째 4표시 when "000010" => SEG <="1011011"; --다섯번째 5표시 when "000001" => SEG <="1011111"; --여섯번째 6표시 when others => SEG <="0000000"; --표시 없음 end case; --========================================================== end Behavioral;
14-6. 7-Segment 제어기의 설계- 각 신호기능 신호 이름 입출력 설 명 CLK_4M 입력 트레이닝 키트에 있는 클록 신호. 4 MHz pin 79번으로 연결되어 있음. RSTB 시스템 Reset 신호 pin 205번으로 연결되어 있음. Active 'L' DIGIT(5:0) 출력 6개의 자리 중 하나를 선택하기 위해 사용되는 신호. 6비트의 값으로 한 비트의 값만 1인데 500 Hz 속도로 1의 값이 오른쪽으로 이동한다. 6번째 비트 다음에는 다시 첫 번째 비트가 1이 된다. Active 'H' SEG(6:0) 7 세그먼트로 연결되는 신호 7개의 세그먼트 A ∼G 로 연결됨. Active 'H'
14-7. 7-Segment 제어기의 설계-Simulation
14-8. 7-Segment 제어기의 설계-Pin배치 입 력 출 력 신호 이름 키트 이름 핀 번호 CLK_4M FPGA_clock p79 DIGIT(5) DIGIT1 p22 RSTB Reset Pin p205 DIGIT(4) DIGIT2 p24 DIGIT(3) DIGIT3 p26 DIGIT(2) DIGIT4 p27 DIGIT(1) DIGIT5 p28 DIGIT(0) DIGIT6 p48 SEG(6) SEG_A p29 SEG(5) SEG_B p31 SEG(4) SEG_C p33 SEG(3) SEG_D p34 SEG(2) SEG_E p35 SEG(1) SEG_F p36 SEG(0) SEG_G p37