VHDL 프로그래밍 2. VHDL 언어사용해보기 한동일 학습목표 기존프로그래밍언어의간단한예를다룬다. VHDL 언어의간단한예를다룬다. 각언어의실제적인사용예를파악한다. 기존프로그래밍언어와비교되는 VHDL언어의차이점을이해한다. 엔티티선언의의미를파악한다. 아키텍처선언의의미를파악한다. VHDL 언어의문장구조를눈에익힌다. 디지털로직과이의 VHDL 표현과정을이해한다. 2/23
하드웨어서술언어란? 기존의소프트웨어서술언어 폰노이만구조의순차적인서술방식 한순간에하나의명령어가 CPU 에서처리됨 CPU 의처리속도의증대요구 Multi-Core 의개발 : 2, 4, 8 하드웨어서술언어 순차처리, 병렬처리프로그래밍이가능 VHDL 을이용하여여러개의프로세서들을설계가능 여러개의프로세서들이독립적으로, 병렬로처리됨 낮은클럭으로도 CPU 의수천배의처리속도가능 3/23 출력문의생성예 - C #include <stdio.h> int main(int argc, char *argv[]) { FILE *fp; // file pointer for output file if((fp=fopen("c.txt", "w")) == NULL) { // open new output file printf("unable to open file for output\n"); exit(1); } fprintf(fp, "C Programming\n"); // print out the message fclose(fp); // file close return 0; } C 코드예 실행결과 : C Programming 4/23
출력문의생성예 - JAVA import java.io.*; public class FileOutput { public static void main(string i args[]) { try { Pi PrintWriter Wi out = new PrintWriter("JAVA.txt"); Pi Wi ") out.println("java Programming"); out.close(); } catch (IOException exception) { System.out.println("Error processing file: " + exception); } } } 실행결과 : JAVA Programming 5/23 JAVA 코드예 출력문의생성예 - JAVA use STD.TEXTIO.all; entity FileOutput is end FileOutput ; architecture simulation of FileOutput is file OUTFILE : text open write_mode is "VHDL.txt"; signal time_zero : bit := '0'; -- 다음페이지에계속 VHDL 코드예 6/23
출력문의생성예 - VHDL write_output : process(time_zero) variable L : line; if (time_zero = '0') then write(l, string'("vhdl Programming")); writeline(outfile, L); time_zero <= '1'; end if; end process write_output; end ; 실행결과 : VHDL Programming VHDL 코드예 7/23 // 중략 C 언어의실제적인사용예 Convolution.c 코드예 buffer = read_pnm(filein, &rows, &cols, &type); /* determine bytes_per_pixel, 3 for color, 1 for gray-scale */ if(type == PPM) bytes_per_pixel = 3; else bytes_per_pixel = 1; number_of_pixels = bytes_per_pixel * rows * cols; convolve(buffer, cols, rows, 3, 3, mask, 0, fileout); write_pnm(buffer, fileout, rows, cols, type); IP_FREE(buffer); // 중략 8/23
C 언어의실제적인사용예 Convolution.c 코드결과예 입력영상 출력영상 9/23 // 중략 JAVA 의실제적인사용예 ClockViewer.java 코드예 frame.setsize(frame_width, FRAME_HEIGHT); frame.settitle("clock"); l frame.setdefaultcloseoperation(jframe.exit_on_close); ClockComponent component = new ClockComponent(); Thread t1 = new Thread(component); t1.start(); frame.add(component); frame.setvisible(true); ibl // 중략 10/23
// 중략 JAVA 의실제적인사용예 ClockComponent.java 코드예 int[] xpntsmin = {minx, minx1, minx2}; int[] ypntsmin = {miny, miny1, miny2}; int npntsmin = xpntsmin.length; g2.fillpolygon(xpntsmin, l i ypntsmin, npntsmin); g2.setcolor(color.red); int secx = (int)((50 * Math.cos((sec * 0.1046)-1.4654)) )) + 95); int secy = (int)((50 * Math.sin((sec * 0.1046)-1.4654)) + 95); g2.drawline(95,95,secx,secy); // 중략 11/23 JAVA 의실제적인사용예 ClockViewer.java 코드결과예 12/23
// 중략 VHDL 의실제적인사용예 Cross_Hatch.vhd 코드예 image_gen : process(dispclk) if (dispclk='1' and dispclk'event) then if vactive_pir='1' then // 중략 if hactive_fpulse = '1' then hcounter <= (hcounter + 1) mod 1024; end if; else hcounter <= 0; end if; 13/23 VHDL 의실제적인사용예 Cross_Hatch.vhd 코드결과예 14/23
Half Adder 설계예제 A B S C 0 0 0 0 0 1 1 0 1 0 1 0 1 1 0 1 논리회로 진리표 15/23 Half Adder 설계예제 std_logic_1164 패키지의사용을선언 std_logic 형의신호를사용하기위함 library IEEE; use IEEE.std_logic_1164.all; Half Adder 의입출력신호선언 entity 선언구문이용 entity Half_ Adder is port( A, B : in std_ logic; S, C : out std_logic); end Half_ Adder; A B S C 16/23
Half Adder 설계예제 Half Adder 의내부회로서술 architecture 본체에서서술 architecture Dataflow of Half_Adder is process (A, B) S <= A xor B; C <= A and B; end process; end Dataflow; 입력과출력신호들의동작관계를규정 17/23 Half Adder 설계예제 library IEEE; use IEEE.std_logic_1164.all; entity Half_ Adder is port( A, B : in std_logic; S, C : out std_logic); end Half_Adder; architecture Dataflow of Half_Adder is process(a, B) S<= A xor B; -- calculate sum of two input C <= A and B; -- calculate carry of two input end process; end Dataflow; 18/23
Half Adder 의검증 VHDL 로표현된로직 논리합성을통해서실제적인회로로구현 ASIC 이나 FPGA 를이용하여구현된회로의테스트 테스트벤치 (test bench) 를이용하여설계단계에서테스트가능 테스트벤치 (test bench) 설계한로직의검증작업 VHDL을이용하여구현 논리합성의가능여부와무관하게서술가능 가급적설계할실제적인회로와동시에관리할필요 19/23 Half Adder 의테스트벤치 테스트벤치를이용한검증 입출력신호를선언할필요없음 entity tb_half_adder is end tb_half_adder adder ; Half Adder 를콤포넌트로선언 component 선언구문이용 component half_ adder port( A, B : in std_ logic; S, C : out std_logic); end component; ; 20/23
Half Adder 의테스트벤치 Half Adder 의입력신호생성 파형생성문을이용한입력신호생성예 a <= '0', '1' after 5 ns, '0' after 10 ns, '1' after 15 ns, '0' after 20 ns, '1' after 25 ns, '0' after 30 ns, '1' after 35 ns; b <= '0', '1' after 10 ns, '0' after 20 ns, '1' after 30 ns, '0' after 40 ns; 입력신호를 Half Adder 에인가 component 실체화문이용 U0 : half_adder port map (a=>a, b=>b, s=>open, c=>open); 21/23 Half Adder 의테스트벤치 library IEEE; use IEEE.std_logic_1164.all; entity tb_half_adder is end tb_half_adder ; architecture simulation of tb_half_adder is component half_adder port (a, b: in std_logic; s, c : out std_logic); end component; signal a, b : std_logic; a <= '0', '1' after 5 ns, '0' after 10 ns, '1' after 15 ns, '0' after 20 ns, '1' after 25 ns, '0' after 30 ns, '1' after 35 ns; b <= '0', '1' after 10 ns, '0' after 20 ns, '1' after 30 ns, '0' after 40 ns; U0 : half_adder port map (a=>a, b=>b, s=>open, c=>open); end ; 22/23
Half Adder 의테스트벤치 테스트벤치를이용한동작확인 ModelSim 의 wave 윈도우화면을이용한검증예 23/23