LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; ENTITY delay IS GENERIC(N_DLY: INTEGER := 4; N_BIT: INTEGER := 10); PORT(rstn: IN STD_LOGIC; clk: IN STD_LOGIC; xi_in: IN SIGNED(N_BIT-1 DOWNTO 0); xq_in : IN SIGNED(N_BIT-1 DOWNTO 0); yi_out : OUT SIGNED(N_BIT-1 DOWNTO 0); yq_out: OUT SIGNED(N_BIT-1 DOWNTO 0));END;ARCHITECTURE be OF delay IS TYPE table_signed IS ARRAY (NATURAL RANGE <>) OF SIGNED(N_BIT-1 DOWNTO 0); SIGNAL xi_reg: table_signed(0 TO N_DLY-1); SIGNAL xq_reg: table_signed(0 TO N_DLY-1);BEGIN PROCESS(rstn, clk) BEGIN IF rstn = `0` THEN FOR i IN 0 TO N_DLY-1 LOOP xi_reg(i) <= (OTHERS => `0`); xq_reg(i) <= (OTHERS => `0`); END LOOP; ELSIF clk`EVENT AND clk = `1` THEN xi_reg <= xi_in & xi_reg(0 TO N_DLY-2); xq_reg <= xq_in & xq_reg(0 TO N_DLY-2); END IF; END PROCESS; yi_out <= xi_reg(N_DLY-1); yq_out <= xq_reg(N_DLY-1);END;--
FPGA를 이용한 통신시스템 구현목차1. 서론1.1 연구목적1.1.1 동기1.1.2 졸업작품 진행도1.2 기존연구1.2.1 OFDM 이론1.2.2 HDL(Hardware Description Language)1.2.3 FPGA를 이용한 설계 흐름2. 본론2.1 Xilinx ML310 Board Specification2.1.1 ML310 Board2.1.1 Virtex2pro2.2 Ethernet MAC 연구2.2.1 Ethernet MAC 원리2.2.2 Ethernet MAC 스케메틱 및 핀배치2.3 OFDM MODEM 구현2.3.1 OFDM MODEM의 원리2.3.2 OFDM MODEM 구현2.3.2.1 Mapper & Demapper2.3.2.2 IFFT & FFT2.4 UART 구현2.4.1 FPGA UART 구현2.4.1.1 UART 송신부2.4.1.2 UART 수신부2.4.2 PC 파트 OFDM Client 구현2.4.2.1 MFC 소개2.4.2.2 MFC를 이용한 시리얼통신2.4.2.3 OFDM Client 구현3. 결과3.1 OFDM 블록의 MATLAB 시뮬레이션3.2 OFDM MODEM의 HDL 시뮬레이션 및 합성3.3 UART 송수신기의 HDL 시뮬레이션 및 합성3.4 PC 파트 OFDM Client 송수신 동작 결과3.5 FPGA 보드 Implementation4. 결론5. 참고문헌5.1 HDL 참고문헌5.2 FPGA 참고문헌5.3 EthernetMAC 참고문헌5.4 OFDM 이론 참고문헌5.5 OFDM MODEM 참고문헌5.6 UART 참고문헌5.7 MFC 참고문헌6. 졸업작품 후기7. 부록 - 소스코드7.1 OFDM MODEM7.1.1 UART BaudGen7.1.2 UART 송신부7.1.3 UART 수신부7.1.4 QPSK Mapper7.1.5 QPSK Demapper7.1.6 FFT/IFFT7.2 OFDM Client표 목차...........웨어 설계용 언어의 일종이기 때문에, C언어와 연계하여 시뮬레이션을 수행할 수 있고, 다른 설계자가 기술한 HDL을 이해하거나 재사용하는데 매우 용이하다. 그리고 게이트 수준으로 설계하는 것과 달리, 시스템의 사양이 변화했을 경우 시스템의 구조를 쉽게 변경할 수도 있다. 또한 제조 공정에 특화된 Library에 독립적으로 설계가 가능함으로 인해, 어느 제조 공정에도 적용 가능하다는 장점을 가진다. 특히 시스템을 하드웨어와 소프트웨어로 구분할 때에도 하드웨어 부분 및 ASIC 부분은 HDL언어로, 소프트웨어 부분은 C언어로 설계하여 통합 검증이 가능함으로 인해, 게이트로 구현하기 전에 전체 시스템을 컴퓨터에서 시험할 수 있게 되었다. 이러한 방식은 보다 빠르게 시스템의 문제점을 찾아내고 쉽게 오류를 정정할 수 있도록 도와준다. 이것은 시스템의 동작에 대한 신뢰도를 크게 향상시킬 수 있고, 나중에 실제로 시스템을 구현했을 때의 오류를 미연에 방지함으로써 설계시간을 단축시킬 수 있는 효과가 있다.HDL을 이용해 통신시스템을 구현하고 PC와의 통신을 통해 동작을 검증하는 것이 우리조의 목표이다.1.1.2 졸업작품 진행도{주단위 진행사항3월4월5월6월7월8월9월Verilog 언어 학습ModelSim Tool 학습Verilog 모듈설계 &시뮬레이션 실습OpenCores.org 소스 분석Ethernet MAC 학습Ethenet MAC 소스분석 & 시뮬레이션ISE Tool 학습ISE 상에서 프로젝트 생성 및 합성 실습Xilinx Virtex2pro FPGA Device 학습Xilinx ML310 Development board 학습Ethernet MAC 합성 및 ImplementationOFDM 이론 학습OFDM 알고리즘 MATLAB 시뮬레이션VHDL 언어학습 및 FFT 블록 HDL구현UART 블록 HDL구현MFC를 이용해 OFDM Client 제작합성 및 디버깅최종보고서 작성1.2 기존연구1.2.1 OFDM 이론1) OFDM 개요무선채널에서 데이터를 고속으로 전송할 경우 AlgorithmsRadix-2 Decimation-in-Time(DIT) FFT AlgorithmRadix-2 Decimation-in-Frequency(DIF) FFT AlgorithmRadix-4 Decimation-in-Frequency(DIF) FFT AlgorithmRadix-{2^{ 2 }Decimation-in-Frequency(DIF) FFT Algorithm- 이중에서 우리가 구현한 방식은 Radix-2 DIF FFT Algorithm 이다.1) Radix-2 FFT Algorithm is?- {N=r _{1} r _{2} r _{3} .....r _{v}- {r _{1} =r _{2} =r _{3} =.....=r _{v}- r = 2인 Algorithm ( {N=2 ^{v})2) Derivation of a radix-2 DIF AlgorithmDecimation-In-Frequency Algorithm- M=2, L=N/2- x(n)을 절반으로 나눈다.{where, {W _{N} ^{kN/2} =(-1) ^{k}{- k를 even number와 odd number로 구분{W ^{2} _{N} =W _{N/2}이므로{- if {g _{1} (n)```and```g _{2} (n)is defined as{- then{- 반복수행을 통해 Algorithm을 구현- When N = 8{- Computation complexity는 DIT와 같다.- DIT 와 DIF는 서로 전치 관계3) R2SDF system structure1 Basic structure{- Pipelin 구조를 사용해서 설계하였고, 구현방식은 위 그림에서와 같이 R2SDF(Radix-2 Single-Path Delay Feedback) 방식을 사용했다.{{->Control signal(sel)- When '0' ,shift-register로입력- When '1'BF 연산후 출력4) Each stage structure1 Stage 1 structure{> Rom : Compnt는 CScom이라는 시리얼 통신 클래스에서 시리얼 통신을 세팅하고, 시작과 전송과 종료동작을 정의한다. CScom 클래스에의 ComStart 함수는 CreateFile 함수를 통해 COM포트에 시리얼 통신 핸들을 만든다. 또한 DCB를 정의하는데, ComStart 함수에서 세팅한 DCB항목은 다음과 같다.dcb.BaudRate = CBR_9600;dcb.ByteSize = 8;dcb.Parity = EVENPARITY;dcb.StopBits = ONESTOPBIT;ComStart 함수에서 CreateFile함수 , DCB 를 통해 시리얼 통신을 시작했다면, ComEnd 함수에서는 PurgeComm 함수를 통해 시리얼 통신을 종료한다. 시작과 종료 동작을 기술한 함수 외에 송신과 수신을 정의한 WriteCmd, ReadCmd 함수가 있다. WriteCmd 함수는 ComStart 함수에서 생성한 핸들에 WriteFile 함수를 사용해 문자를 입력한다. ReadCmd 함수는 이와 반대의 동작, 즉 ComStart 함수에서 생성한 핸들에 ReadFile 함수를 사용해 수신된 문자를 변수에 저장한다.2.4.2.3 OFDM Client 구현OFDM Client의 최종 버전은 Dialog Box형태로 만들었다. Dialog Box를 사용해 버튼, Edit창, List Box 등을 쉽게 생성할 수 있고 동작 함수도 편리하게 제작할 수 있었다. 이미지를 화면에 출력하기 위해서 Dialog에 View Class를 얹어서 사용했다. OFDM Client에는 Edit 창 1개, List Box 1개, OFDM버튼, 받기 버튼, 보내기 버튼, View 창 1개(이미지 영역 2부분) 가 포함되었다. OFDM 버튼을 누르면 Dialog Box내의 왼쪽에 보이는 이미지가 시리얼 통신을 통해 전송된다.(그림2-16) 받기 버튼을 누르면 시리얼 통신을 통해 수신한 데이터가 List Box에 표시된다. Edit창에 data를 키보드로 입력하고 보내기 버튼을 누르면 키보드로 입력한 data가x256 이미지는 각 픽셀당 8bit의 형식으로 이루어져 있다. 각 픽셀은 unsigned char 형태로 저장되어 전송된다. 수신측 데스크탑 PC의 하이퍼 터미널은 수신한 데이터를 유니코드로 인식하기 때문에 영문 또는 숫자 뿐만 아니라 알 수 없는 문자로 표현된다.(2) 단문 전송이번엔 짧은 문자열을 전송함으로써 OFDM Client의 기능을 시뮬레이션했다. JEONMOONJIN 이라는 문자열을 노트북 PC에서 실행한 OFDM Client의 Edit Box에 입력하고 보내기 버튼을 눌렀다. 보내기 버튼을 누르면 시리얼 통신을 통해 문자열을 송신하게 되는데, 데스크탑 PC의 OFDM Client에서 받기 버튼을 눌르면 List Box에 수신된 문자열이 표시된다. 그 결과는 다음과 같다.{3.5 FPGA 보드 Implementation지금까지 설계하고 시뮬레이션한 모든 블록을 TOP 모듈에 포함시켜 Synthesis 한 후 Implementation을 거쳐 Configuraion을 했다. UART 수신부- QPSK Mapper - IFFT - FFT - QPSK Demapper - UART 송신부 를 FPGA에 프로그래밍 해서 노트북 PC의 OFDM Client에 연결한 후 동작을 확인하려 했지만, 원하던 이미지는 수신되지 않았다. 각 블록은 제 동작을 하지만 통합한 후 동작을 확인 할 수 없는 결과가 나타난 것이다. 전체 블록은 포기하고 송신부의 블록만으로 다시 합성,프로그래밍 했다. UART 수신부- QPSK Mapper - IFFT 만으로 이루어진 블록의 입력은 PC에서 수신하도록 하고, 출력은 ML310 보드에서 제공하는 8개의 LED에 나타나게 했다. 8개의 LED로는 동작을 파악할 수 없는 것이 당연할 것이다. 별다른 대체 장치가 없기 때문에 LED출력을 연결했다. OFDM Client에서 송신데이터를 입력하고 보내기 버튼을 누르자 LED가 깜빡거리는 것을 확인할 수 있었다. 1개의 알파벳을 보내자 LED에 그 알파벳의 아스키코드가 점등되는 것을 확인
1. Source code/*This program finds x from range [-1,...,2] which maximise f(x)f(x) = x*sin(10*pi*x)+1.0*/#include<stdio.h>#include<stdlib.h>#include"math.h"#define pi 3.14159265void rngen();void generation();void selection();void crossover();void mutation();void fitness();void findmaxval();int b[50][22],bp[50][22],i,j,k,l,p;double eval[50];double sel[50];double prob[50];void main(){rngen();for(l=0;l<150;l++)generation();// running 150 generationfindmaxval();// finding maximum fitness value}void rngen()//random binary number generaion{for(i=0;i<50;i++){for(j=0;j<22;j++){if(rand()>16384)