순차회로부터, 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
'전공지식정리 > 디지털시스템설계' 카테고리의 다른 글
VHDL10. buffer, state machine, ALU (0) | 2020.12.08 |
---|---|
VHDL9. 기법(논리합성, 설계) (0) | 2020.12.08 |
VHDL7. 조합회로 (0) | 2020.12.08 |
VHDL6. 해석 및 정교화, 표현식 (0) | 2020.12.08 |
VHDL5. 고급문법(구조 내부의 detail) (0) | 2020.12.08 |