전공지식정리/디지털시스템설계

VHDL8. 순차회로

TimeSave 2020. 12. 8. 23:24

 순차회로부터, clock signal에 synchronize 되야하는 특징이 있다.
clock에 초점을 맞춰서 이번 포스트를 유심히 보자.

1.1 D F/F 설계

D F/F의 회로, 진리표

1.1.1 VHDL 로직 서술

D F/F의 VHDL로직, clk = '1'을 감지할 때만, process문이 제대로 돌아간다.

1.1.2 testbench

testbench of D F/F

testbench of D F/F, loop문을 이용해서, clk를 생성한다.

1.1.3 simulation


1.2. D F/F with reset
; D F/F에 reset을 달았다.

회로도, 진리표 of D F/F with reset

1.2.1 VHDL 로직 서술

1.2.2 testbench

testbench of D F/F with reset

testbench of D F/F with reset

1.2.3 simulation


1.3. D F/F 연결

three D F/F

1.3.1 VHDL 로직 서술

three D F/F

-> port는 a, q, clk의 큰 틀의 port만 선언한다.
-> 내부 F/F의 b,c는 architecture에서 signal로 만들어 선언한다.

1.3.2 testbench; 
추후 작성.

entity tb_three_ff is
end tb_three_ff;

architecture simulation of tb_three_ff is

component three_ff 
port( a: in bit; q: out bit;
clk : in bit);
end component;

signal a, clk : bit;

constant HALF_PERIOD_100M : time := 5 ns;
begin
clk_gen : process
begin
while(true) loop
clk <= '0'; wait for HALF_PERIOD_100M;
clk <= '1'; wait for HALF_PERIOD_100M;
end loop;
end process;

a<='0', '1' after 20 ns, '0' after 40 ns, '1' after 60 ns, '0' after 80 ns;

U0 : three_ff port map( a => a, q => open, clk => clk);

end;


1.3.3 simulation

1.4. 변수 사용한 F/F 연결

1.4.1 로직 서술

임시변수 C를 만들어서, 잠깐 거쳐가는 모양새다.

-> 위와 거의 동일하여, 로직서술에서 그치겠다.(테스트 벤치는 동일)
단, c가 variable로 q에 대입됨으로서, delay가 사라진다.

1.5 펄스생성로직
;gate지연을 통해 펄스 하나를 생성한다.

펄스생성로직 회로,

pulse generate vhdl code

맨 마지막 q파형을 보면 알겠지만, 단일 펄스 하나만 튀어나와 있다.

-> 맨 마지막 q파형을 보면 알겠지만, 단일 펄스 하나만 튀어나와 있다.

테스트밴치는 위에랑(tb_three_ff) 똑같다.
in out  port도 같고, 경우의 수도 같기 때문에

entity tb_pulse_gen is
end tb_pulse_gen;

architecture simulation of tb_pulse_gen is

component pulse_gen 
port( 
a : in bit;
q : out bit;
clk : in bit);
end component;

constant HALF_PERIOD_100M : time := 5 ns;
signal a, clk : bit;

begin

clk_gen : process
begin
while(true) loop
clk <= '0'; wait for HALF_PERIOD_100M;
clk <= '1'; wait for HALF_PERIOD_100M;
end loop;
end process;

a<='0', '1' after 20 ns, '0' after 40 ns, '1' after 60 ns, '0' after 80 ns;

U0 : pulse_gen port map ( a=>a  , q => open, clk => clk);

end simulation;

1.6 D F/F 와 time delay
; 위의 pulse generate회로와 같은 모양이다. 
차이점은, F/F, not gate 는 1 ns, and gate는 2ns의 delay를 표현해 준 것이다.

pulse generate + delay의 vhdl표현

pulse generate + delay

-> 원리가 같아서, 위의 회로와 파형이 같을 수 밖에 없다.
   delay(시간 지연)을 직접적으로 표현해 줌으로, 좀 더 의도대로 회로가 만들어 진다.


테스트 밴치는 기존과 동일.

2. 래치
; 래치는 F/F에서 clk를 뺀 것이라고 생각하면 된다.
-> 비동기 순차회로. 
-> 피드백이 있으므로, 순차회로이다.
-> 다른말로 현재상태가 결과에 영향을 준다.(아래 MUX와 비교할 것)

latch는 출력이 d인 반면(현재상태), MUX는 a,b를 골라야 한다.(조합결과)

D 래치의 회로, truth table

2.1 VHDL 로직 서술 of d latch

2.2 testbench

2.3 simulation

3. 카운터

3.1 4bit 16진 카운터

4bit 16진 Counter

3.1.1 VHDL 로직 구현 (for문 + process문)

3.1.2 testbench ; 추후 작성.
entity tb_counter_4 is
end tb_counter_4;

architecture simulation of tb_counter_4 is
component counter_4
port(
q: out bit_vector(3 downto 0);
clk : in bit;
rst_n : in bit);
end component;
signal clk, rst_n : bit;
signal q : bit_vector(3 downto 0);
constant HALF_PERIOD_100M : time := 5 ns;

begin
rst_n <= '0', '1' after 30 ns;

clk_gen : process
begin
while(true) loop
clk <= '0'; wait for HALF_PERIOD_100M;
clk <= '1'; wait for HALF_PERIOD_100M;
end loop;
end process;



U0 : counter_4 port map(q => open, clk => clk, rst_n => rst_n);

end;

3.1.3 simulation

3.2 10진 up/down counter

3.2.1 VHDL 로직 구현

3.2.2 testbench

entity tb_counter_up_dn is
end tb_counter_up_dn;

architecture simulation of tb_counter_up_dn is
component counter_up_dn
port(
up : in bit;
q: out bit_vector(3 downto 0);
clk : in bit;
rst_n : in bit);
end component;

signal up, clk, rst_n : bit;
signal q : bit_vector(3 downto 0);
constant HALF_PERIOD_100M : time := 5 ns;

begin
rst_n <= '0', '1' after 30 ns;

up <= '0', '1' after 20 ns, '0' after 160 ns, '1' after 200 ns, '0' after 220 ns;

clk_gen : process
begin
while(true) loop
clk <= '0'; wait for HALF_PERIOD_100M;
clk <= '1'; wait for HALF_PERIOD_100M;
end loop;
end process;



U0 : counter_up_dn port map(up => up, q => open, clk => clk, rst_n => rst_n);

end simulation;

3.2.3 simulation


4. 동기신호 발생기
; 여러가지 clock 패턴이 있다고 한다...

동기 신호 패턴의 예

-> 위의 그림을 보니까, YSYNC, HSYNC DOTCLK 등 여러가지가 있네..

휴대폰 LCD화면, 동기신호랑 무슨관계?


4.1 수평 동기신호 생성 데이터
- 사용 display clk : 25MHz (T = 40 ns)
- 수평 동기 신호 : hsync_n
       -> '0'구간이 동기 신호 구간, 신호명에 _n을 사용
       -> '0'구간 화소 개수 : 5클럭
       -> '1'구간 화소 개수 : 495클럭

 - 수평 유효신호 : hactive
        -> ‘1’ 구간이 유효 신호 구간이므로 신호명에 _n을 사용하지 않음
        ->  ‘0’ 구간 화소 개수: 20 클럭
        ->  '1' 구간 화소 개수: 480 클럭

- hsync_n 신호와 hactive 신호의 관계
        -> 수평 동기 신호(= hsync_n)하강 에지가 기준점
        -> 기준점에서 15화소 위치에서 hactive 신호가 ‘1’이 됨


4.1.1 VHDL 로직구현

hsync의 VHDL 구현

hsync의 VHDL 구현

4.1.2 testbench ; 추후작성

entity tb_hsync_generator is
end tb_hsync_generator;

architecture simualation of tb_hsync_generator is

component hsync_generator is 
port(  hsync_n : out bit; 
hactive : out  bit;
reset_disp_n : in bit; 
dispclk : in bit);
end component;


signal reset_disp_n, dispclk : bit;
constant HALF_PERIOD_100M : time := 5 ns;

begin

reset_disp_n <= '0', '1' after 30 ns;

clk_gen : process
begin
while(true) loop
dispclk <= '0'; wait for HALF_PERIOD_100M;
dispclk <= '1'; wait for HALF_PERIOD_100M;
end loop;
end process;

U0 : hsync_generator port map( hsync_n => open, 
hactive => open, 
reset_disp_n => reset_disp_n, 
dispclk => dispclk);

end;

4.1.3 simulation


4.2 상수선언 활용
; 상수 선언을 이용해서, parameter값을 일괄로 변경할 수 있다.


출처 :  http://dasan.sejong.ac.kr/~dihan/vhdl.htm