1.
test bench : VHDL로 서술한 하드웨어의 로직을 검증하기 위한 환경
- 패턴발생기,오실로스코프,멀티미터 -> 테스트벤치
- VHDL 환경안에서 검증할 수 있는 방법이다.
- 로직은 하드웨어 구현을 염두해 둬야 하지만, 테스트 벤치는 자유롭다.
- 단, 모든 경우의 수(예외 없는)를 포함해야 한다.
-> 로직 설계 : 반드시 논리 합성이 가능한 코드로 설계
-> 테스트 벤치 구성 : 논리 합성 가능 여부와는 무관
=> VHDL 문법에서는 테스트 벤치 구성을 목적으로 하는
다양한 문법 구조 제공
1.1
검증 프로세스
파형생성 -> 회로인가 -> 회로 출력값이 기대값과 일치하는 지 검증.
1.2
테스트벤치 이용 예제
프로세스 ; 로직설계 => 테스트벤치 작성 => 시뮬레이션 및 검증.
ex) AND Gate
1.2.1 로직설계
VHDL 로직 설계
1.2.2 테스트 벤치 작성(파형-> 인가 -> 확인)
1. 진리표를 통한 신호파형
2. 인가
; component로 받아서 component 실체화 문을 이용한다.
and gate testbench vhdl코드
3. 시뮬레이션 검증(확인)
2. Generic 활용
; 비교기 설계 예제를 통해 generic 적용 방법을 알아보자.
2.1 Comparator(=비교기) 설계
비교기 회로와 진리표
- VHDL 로직 서술
- 테스트 벤치
2.2 Generic문을 사용한 Comparator 설계
- 4bit comparator 를 생각해보고, N bit comparator를 설계해보자.
4 bit comparator
n bit comparator
-> bit가 변한다면, generic을 통해서 n을 수정하여 n bit를 만들 수 있다.
- generic 선언 시 초기화
generic 초기화
- component 실체화문에서 초기화.
component 실체화문 초기화
- component 실체화문 재정의
component 실체화문에서 재정의
=> 위처럼 여러 초기화 방법이 있는데, 좌우당간 시뮬레이션 시작전에 값이 초기화 되어 있어야 한다.
ex)generic 썼을 시, test bench
entity tb_comparator is
generic( N: integer := 4);
end tb_comparator;
architecture simulation of tb_comparator is
component comparator is
port( A,B : in bit_vector(N-1 downto 0);
Y: out bit);
end component;
signal signal_a, signal_b : bit_vector(N-1 downto 0);
begin
signal_a <= "0000", "1111" after 20 ns, "0000" after 40 ns;
signal_b <= "0000", "1111" after 10 ns, "0000" after 20 ns, "1111" after 30 ns, "0000" after 40 ns;
U0 : comparator port map (A => signal_a, B=> signal_b, Y=> open);
end ;
==> 아래 signal 선언에도 N-1로 선언해 줘야 하고
==> generic문은 entity에 선언해야 에러가 없다.
=> vector는 '' 대신 "" 써야한다.
-> ''는 bit단위, 혹은 'U', 'X'같은 것만..
==> 그리고 보통 library 참조 넣어주는 게 좋은데(권장), 안 넣어도 돌아간다.
3. 다양한 설계
3.1 MUX
; 4 to 1 mux를 설계해 보자.
4 to 1 MUX
- 로직 설계
- 테스트벤치 구성
ex1)
ex2)
- 시뮬레이션
ex1의 시뮬레이션
ex2의 시뮬레이션
3.2 decoder
decoder 회로 및 진리표
3.2.1 decoder VHDL 로직 서술
decoder VHDL 로직
3.2.2 decoder testbench 구성
decoder testbench
- simulation 검증
simulation wave form
3.3 Decoder with enable
;위의 회로에 enable 버튼을 추가해 보자.
-> 보통 enable은 입력단에 enable입력을 and해주면 된다.
-> 0이면 신호가 안들어가니까.
truth table of decoder with enable
3.3.1 Decoder의 VHDL 로직 서술
decoder with enable
decoder with enable
3.3.2 testbench 구성 ; entity 부분은 아무것도 없으니 생략.
testbench of decoder with enable
3.3.3 simulation
simulation; decoder with enable
3.4 berrel shifter
; 입력데이터를 원하는 방향과 크기만큼 이동시키는 회로
- MUX를 계층적으로 구성하여 구현
- 용도 : 부동 소수점 자리수의 고속이동,
- 동영상 복원 과정의 Variable length decoding(=가변길이복호화)
- berrel shifter의 복잡도
- 입력 비트 수 n : MUX 수 = n X log_2(n)
- 고속동작 요구 로직에서는 사용자제 (아니면 효율적 구조를 구현)
3.4.1 로직 구현
- berrel shifter의 IN,OUT
-> 4 bit 입력 : shift_in(3 downto 0)
-> 동작제어신호 : mode (1 downto 0)
mode(1) : 어떤 shift
-> 1이면 rotate shift, 0이면 logical shift
mode(0) : 어떤 방향
-> 1이면 left, 0이면 right
-> 비트 이동 신호 : distance ( 1 downto 0)
; 0부터 3비트의 이동 신호 발생
-> 4 bit 출력 : shift_out(3 downto 0)
ex)
mode 1->0 에 distance 1만큼 shift ==> rotate, 그대로 돌리기
mode 0->1에 distance 2만큼 shift ==> logical, 0채우기
rotate left shift(돌리기)
logical right shift(0 채우기)
모드 결정 logic (직접 서술)
모드 결정 logic (alias[가명선언]를 이용)
3.4.2 testbench ; 나중에 만들어서 올리겠습니당.
=> rotate부분을 alias선언 해야 wave form에 뜨는 것 같네요
==> alias 선언이 맞네요 : architecture에 선언해도되고, entitiy에 선언해도 됩니다.
===> radix 바꾸는 부분은 우클릭 해서 바꾸기 보다 더블클릭으로 property에서 바꿔야 웨이브에 이쁘게 나와요.
====> 아니네요, show base부분 체크 해제하면 됩니다. 무슨radix인지 나와서 지저분 했었는데 이거네용.
library ieee;
use ieee.std_logic_1164.all;
entity tb_berrelShifter is
end tb_berrelShifter;
architecture simulation of tb_berrelShifter is
component berrelShifter is
port(
shift_in : in std_logic_vector(3 downto 0);
mode : in std_logic_vector(1 downto 0);
distance : in std_logic_vector(1 downto 0);
shift_out : out std_logic_vector(3 downto 0));
end component;
signal s_shift_in, s_shift_out : std_logic_vector(3 downto 0);
signal s_mode, s_distance : std_logic_vector(1 downto 0);
begin
s_distance <= "00", "01" after 20 ns, "10" after 40 ns, "11" after 60 ns,
"00" after 80ns;
-- "01" after 100 ns, "10" after 120 ns, "11" after 140 ns, "00" after 160 ns;
s_mode <= "00", "01" after 5 ns, "10" after 10 ns, "11" after 15 ns,
"00" after 20 ns, "01" after 25 ns, "10" after 30 ns, "11" after 35 ns,
"00" after 40 ns, "01" after 45 ns, "10" after 50 ns, "11" after 55 ns,
"00" after 60 ns, "01" after 65 ns, "10" after 70 ns, "11" after 75 ns,
"00" after 80 ns;
s_shift_in <= "0000", "0001" after 5 ns, "0010" after 10 ns, "0011" after 15 ns,
"0100" after 20 ns, "0101" after 25 ns, "0110" after 30 ns, "0111" after 35 ns,
"1000" after 40 ns, "1001" after 45 ns, "1010" after 50 ns, "1011" after 55 ns,
"1100" after 60 ns, "1101" after 65 ns, "1110" after 70 ns, "1111" after 75 ns,
"0000" after 80ns;
U0 : berrelShifter port map(shift_in => s_shift_in, mode => s_mode, distance => s_distance, shift_out => open );
end;
3.4.3 simulation
'전공지식정리 > 디지털시스템설계' 카테고리의 다른 글
VHDL9. 기법(논리합성, 설계) (0) | 2020.12.08 |
---|---|
VHDL8. 순차회로 (0) | 2020.12.08 |
VHDL6. 해석 및 정교화, 표현식 (0) | 2020.12.08 |
VHDL5. 고급문법(구조 내부의 detail) (0) | 2020.12.08 |
VHDL4.부프로그램(Sub program) ,패키지 (0) | 2020.12.08 |