[FPGA 와 Verilog 초보자가이드 ] 개요 FPGA 와 Verilog 2013/02/20 19:05 http://blog.naver.com/ubicomputing/150160241672 개요 임베디드시스템을배우는것은때때도어렵기도하지만몇몇자료를읽고, 이해하고, 실험할약간의인내 심이있다면아주재미있는일이기도합니다. FPGA도다르지않습니다. 본강좌를일고, 얼마나빨리 FPGA를배울수있을지한번살펴보세요. 본강좌를위해먼저제일아래에나와있는툴들을다운받아설 치하세요. 이강좌는독자가 Verilog(C언어문법과비슷한 HDL 언어 ) 를배우고, 코드를시뮬레이트하며, 실제하드 웨어에그것을구현하는방법을배울수있는방법을설명하였습니다. 시뮬레이션과신떼시스를위해 Xilinx ISE가사용되고, 최종디자인은 Spartan 3A FPGA 개발보드 Elbert 에프로그래밍됩니다. Spartan 3A FPGA 개발보드 Elbert 1 가치창조기술블로그
FPGA 란? FPGA는 "Field Programmable Gate Array" 의약자로, 언제든프로그래밍과재설정이가능한게이트로 이루어진거대한배열입니다. FPGA안의많은게이트들은개발자가선택한회로를만들기위해임의로서 로연결이가능합니다. FPGA는기본적으로 CPLD와비슷하지만 CPLD는 FPGA에비해크기가작고성능 이떨어집니다. FPGA 제조사로는 Xilinx, Altera, Actel사등이있습니다. Verilog 란? Verilog는 Hardware Description Language (HDL) 로디지털회로를텍스트형태로표현하는데사용되 는언어입니다. 마이크로컨트롤러프로그램을 C언어와어셈블리어로작성하는것과마찬가지로, FPGA용 프로그램을 Verilog와같은 HDL언어를이용하여작성할수있습니다. HDL 언어가인기있기전엔, 엔지니 어는회로도를가지고모든것을디자인해야했습니다. 회로도는작은규모의디자인을작성할경우아주 편리하지만, 큰규모의디자인을작성할때는관리하기가아주고통스럽습니다. ( 인텔엔지니어가수십만개 의게이트를가진펜티엄프로세서의회로도를그린다고생각해보십시오 ). 대부분의전자공학엔지니어들 은디자인을구현하기위해서새로운언어를배우기보다는회로도를선호하는경향이있습니다. 하지만 Verilog를배우는것이 10페이지의회로도를그리는것보다쉽습니다. 프로그래밍을할줄안다면, 더욱그 렇습니다. VHDL은또다른인기있는 HDL언어로산업전반에걸쳐널리사용되고있고 Verilog와비슷한 인기를보유하고있습니다만여기서는 Verilog를선택하였습니다. 배우기쉽고, 문법이 C언어와비슷하기 때문입니다. Verilog에대해더자세한내용을알고싶다면다음의링크 (http://en.wikipedia.org/ http://en.wikipedia.org/wiki/ wiki/ Verilog) 나튜토리얼 (http://www.asic-world.com/ http://www.asic-world.com/verilog/ verilog/index.html) 을참조하십시오. 어떤툴이필요한가? 1. 좋은텍스트에디터 2. Xilinx ISE Webpack (Download at Xilinx for free). 3. 좋은 FPGA 개발보드 (Elbert - Spartan 3A FPGA Development Board) 4. Elbert Configuration downloader software 가치창조기술 www.vctec.co.kr 2 가치창조기술블로그
[FPGA 와 Verilog 초보자가이드 ] 모듈 FPGA 와 Verilog 2013/02/21 11:37 http://blog.naver.com/ubicomputing/150160305205 3 가치창조기술블로그
Verilog 자체를배우는것은어려운일은아닙니다. 하지만좋은디자인을만들어내는것은어려운일일수 있죠. 본강좌에서는간단한디자인에포커스를맞추어설명하도록하겠습니다. Verilog를처음시작하면대부분은 MCU에서동작하는코드를 C언어로작성하는것과같이인스트럭션을 순차적으로작성하곤합니다. 하지만 FPGA, CPLD, ASIC과같은디지털회로는한번에여러개의일을수 행할수있습니다. 이러한디지털회로의기능을이용하려면먼저동시에발행하는여러가지일들을비주 얼화하는방법을배워야합니다. Verilog 모듈 Verilog는디지털회로를다루고 Verilog에서모듈은디지털회로의하나의컴포넌트를의미합니다. 이러 한컴포넌트는아주간단히는게이트가될수있고 ALU나메모리와같은복잡한회로가될수도있습니다. 모듈은모듈내에필요한요소들을가지고있다는점에서그리고여러개의메소드로외부와인터페이싱된 다는점에서 C++ 의클래스개념과유사합니다. C++ 의클래스처럼모듈역시인스턴스화시킬수있지만, 모듈은 100% 클래스와같지는않습니다. 모듈을그래픽하게표현한다면여러개의포트를가지고있는하 나의박스로표현할수있습니다. 포트는입력, 출력혹은입출력둘다가될수있으며, 포트는한개비트너 비를가질수있고또여러개의비트너비를가질수도있습니다. 아래의그림은여러개의입출력을가진모 듈을그린그림입니다. 입력, 출력의숫자와그것들의너비와방향은모듈기능에의해전적으로종속됩니 다. 4 가치창조기술블로그
포트는입력이나출력혹은양방향이될수있습니다. Verilog의기능을간단히말한다면모듈들을생성하고, 모듈을서로연결시키고, 상호동작의타이밍을관리하는것이라고볼수있습니다. 그러면 Verilog식 "Hello World" 프로그램을작성하여볼까요? 먼저 Verilog에서 NOT 게이트 ( 인버터 ) 를디자인하고, 시뮬레이션한뒤실제하드웨어에서테스트하여보겠습니다. NOT 게이트의출력은항상입력값의반대값입니다. 아래는 NOT게이트의진리표입니다. INPUT A OUTPUT B = NOT A 0 1 1 0 5 가치창조기술블로그
NOT 게이트는하나의입력과하나의출력을가지고 B =! A 라는내부동작을가진하나의모듈로볼수있 습니다. 인버터모듈의그린그림은아래와같습니다. 그럼이모듈을 Verilog 에서어떻게표현할수있는지살펴보면아래와같습니다. module mymodule(a, B); input wire A; output wire B; assign B =!A; endmodule 6 가치창조기술블로그
작성된모듈의이름은 mymodule 인데, 첫번째라인의 "module" 이라는키워드를이용하여선언이되었습다. 이 "module" 키워드를이용하여 mymoudle을정의하고두개의포트를할당하였습니다. mymodule 안에있는모든것들은키워드 "module" 과 "endmodule" 사이에위치하게됩니다. mymoudle은한비트너비의두개의포트를가지고있으며, 포트의크기나방향은첫번째줄에서는알수없습니다. 두세번째줄에서는포트 A와포트 B가각각입력과출력으로선언되었습니다. Verilog에서는두개의기본적인데이터타입이있는데 "wire" 와 " reg" 입니다. int, real 등과같은다른많은데이터타입도있습니다만 wire와 reg는 verilog에서매우중요한자리를차지하고있는데이터타입입니다. "wire" 는두개의다른물체를전기적으로연결하는전선과같은역활을합니다. 전위차를구리선의한쪽끝에주게되면전위차를없애기전까진계속유지되고, 이것은 Verilog에서도그대로적용됩니다. wire는인가된로직상태를유지하게되며, 아무런로직도인가되지않았다면 wire의상태는 unknow 상태가됩니다. Verilog에서는 "wire" 는모듈내의것들을연결하거나혹은모듈끼리연결하는데사용됩니다. 반면에 "reg" 키워드는로직상태를저장할수있고, 누군가그것을바꾸기전까진로직상태를유지할수있습니다. 마이크로컨트롤러의레지스터와같은개념으로보면되겠습니다. 이것은플립플롭과비슷합니다. 플립플롭을한가지상태에두게만든다면누군가그상태를변경할때까지플립플롭은그상태를유지합니다. 정리하면, "wire" 를이용해모듈의입력이나출력을설정할수있고, "reg" 는모듈의출력으로이용이가능합니다. "wire" 가출력으로사용이되었을때에는모듈내에서 "wire" 상태를변화시킬수있는 "reg" 가있어야하는데, 그래야 wire가의미있는데이터를가질수있기때문입니다. 만약 "reg" 가출력으로사용되지않는다면, reg는고유의데이터를보관합니다. 그러면왜 mymodule는입출력둘다를 wire로선언하였을까요? 대답은모듈이 NOT 게이트를표현하였기때문입니다. 게이트는데이터값을저장하지않고게이트의출력은오직입력값에의해결정됩니다. 입력에어떤로직상태가들어온다면출력은그로직의반대가될것이고아무런로직도입력에들어오지않는다면출력값은 unknown상태가됩니다. 그래서이모듈의출력이의미있는값을가지게할려면항상어디선가는입력값을주어야합니다. 위의코드에서중요한또다른키워드는 "assign" 입니다. assign 키워드는 combinational circuit을생성하는데사용이됩니다. '=' 기호우측의코드들은평가되고결과값은 '=' 의좌측에할당되며이러한것은비동식으로처리됩니다. 오른쪽에변화가생기자마자그결과값은왼쪽에반영이됩니다. 7 가치창조기술블로그
이제, 위의코드를가지고코드를시뮬레이션하여예상대로동작하는지살펴보겠습니다. 넓은의미로시뮬레이션은알려진입력값에대해알려진출력값을확인하는작업입니다. 출력값이올바르게확인되었다면이것을검증이라고부릅니다. 시뮬레이션과검증툴이많이있는데, 여기서는 isim(xilinx ISE Webpack의일부분 ) 을시뮬레이션과웨이브폼검사에사용하겠습니다. 가치창조기술 www.vctec.co.kr 8 가치창조기술블로그
[FPGA 와 Verilog 초보자가이드 ] 시뮬레이션 FPGA 와 Verilog 2013/02/21 19:01 http://blog.naver.com/ubicomputing/150160360678 그러면이제시뮬레이션을돌려모듈이예상대로동작하는지를살펴보겠습니다. 모듈을시뮬레이션하기 위해서는모듈에어떤입력값을주어야합니다. 입력값을주기위해서는 test bench를먼저생성해야하며 이테스트벤치가모듈에필요한입력값을생성하여낼것입니다. 테스트벤치는어떤특별한프로그램은 아니며신호를생성하고다른모듈에공급할수있는또다른 verilog 모듈입니다. 시뮬레이션동안테스트 벤치는 I/O포트없는 top module(top level module) 이되어야하지만실제 FPGA에구현할시에는탑 모듈은 I/O포트를가지게되고 top level module이되지는않습니다. 아래는테스트벤치코드입니다. module mymodule_tb(); wire out; reg clock; always begin #1 clock =!clock; end initial begin //Initialize clock clock = 0; //End simulation #10 $finish; end mymodule notgate(clock, out); endmodule 9 가치창조기술블로그
테스트벤치코드를살펴보도록하겠습니다. 테스트벤치는 I/O포트가없는또다른모듈입니다. 코드를보면 "out" 이라는이름의 wire와 "clock" 이라 는이름의 reg를생성하였습니다. reg "clock" 을주기적으로인버트시켜클럭을생성하고그클럭을 mymodule의입력포트 A에공급합니다. wire "out" 은 mymodule의출력포트 B에연결되었습니다. 시 뮬레이션의결과는 wire "out" 에나타나게됩니다. 위의코드에서 "always" 키워드로시작하는블럭은그이름이암시하듯시뮬레이션이수행되고있는한계 속실행이되는블럭입니다. 이블럭안에서 reg "clock" 은매단위시간딜레이뒤에인버트됩니다. 심볼 # 은 verilog에서딜레이를정의하는방법입니다. 이렇게 always블럭안에서는스퀘어웨이브형태의웨이 브폼이생성이됩니다. 참고로 # 심볼은 synthesize 가능한요소가아닙니다. 코드를 synthesize할때디자 인에서딜레이가필요하다면다른방법을찾아야합니다. 하지만시뮬레이션에서는잘동작합니다. 다음설명할코드부분은 initial 블럭입니다. 이름이암시하듯이블럭은오직한번만시간이 t = 0 일때실 행됩니다. 그렇기때문에초기화를하여야할부분이있다면그것은이블럭안에넣어주어야합니다. initial 블럭은보통의경우에테스트벤치에서만사용이됩니다. 합성된코드에서는거의사용되지않으며 대신에합성된코드에서초기화가필요할경우에는리셋로직이대신생성되어사용됩니다. 다시주제로돌 아가서 reg "clock" 을 0으로초기화합니다. 이초기화는매우중요한데만약초기화를해주지않는다면 unknown 상태로남아있게되고 unknown상태를수없이인버트시키더라도결과값은 unknown상태이 기때문입니다. 그래서만약초기화시켜주지않는다면클럭은생성되지않습니다. initial 블럭의마지막 부분은 $finish 선언자입니다. $finish 선언자는 10번의단위딜레이이후에위치하여있는데이것이의미 하는바는 10번의단위시간동안디자인을시뮬레이션한후에시뮬레이터가멈추게된다는것을의미합니 다. $ 심볼로시작하는모든함수는 task라고불립니다. task는시뮬레이터에게주는명령들이며회로의동 작형태를변경하지는않습니다. 마지막부분은모듈이인스턴스화되는것을보여줍니다. mymodule notgate(clock, out) 구문은 "mymodule" 모듈을 notgate라는이름의인스턴스로생성시켜줍니다. 정의된모듈로부터원하는숫자 만큼의많은인스턴스를생성할수있습니다. 여기서중요한하나는 wiring입니다. 코드를보면 reg "clock" 이첫번째파라메터로나오고 wire "out" 이두번째파라메터로나오는것을볼수있습니다. 이것 10 가치창조기술블로그
은 reg "clock" 이모듈인스턴스의포트 A에연결되고, wire "out" 은모듈인스턴스의포트 B에연결되는 것을의미합니다. 이제, 시뮬레이션을돌려보겠습니다. Verilog 파일전체 (Verilog file here) 를받으시고폴더에저장하십시 오. 아래의절차를따라 Xilinx ISE Webpack에있는시뮬레이터를실행하십시오. 1. 윈도우프로그램메뉴에서 ISE Project navigator를실행합니다. 11 가치창조기술블로그
2. File 메뉴에서 "New Project" 를선택합니다. 3. 프로젝트이름을정하고프로젝트파일을저장할디렉토리를선택합니다. 12 가치창조기술블로그
4. 프로젝트셋팅을필요한대로수정합니다. 보드에서사용하는 FPGA를선택합니다. Spartan 3A FPGA 개발보드 Elbert는아래의그림과같이설정합니다. 5. Xilinx ISE Webpack에 empty project를생성하였습니다. 프로젝트를오른쪽마우스클릭하여팝업메 뉴에서 "Add source" 를선택합니다. Verilog 파일을선택합니다. 13 가치창조기술블로그
6. design view에서 "Simulation" 을선택하여시뮬레이션을실행시킬준비를합니다. 14 가치창조기술블로그
7. process view창에서 ISim 프로세스를마우스오른쪽클릭하고 "Run" 을선택하여시뮬레이션을시작합 니다. 8. ISim 시뮬레이터가시작되면아래와같은시뮬레이션웨이브폼을볼수있게됩니다. 웨이브폼을조사하고 Verilog모듈이예측대로동작했는지확인합니다. 위에있는이미지에서보듯이출력 인입력클럭이인버트된형태로표시됩니다. 이것은 NOT 게이트의동작으로우리가원하는결과였습니 다. 다음강좌에서는이모듈을실제하드웨어로어떻게구현하는지설명하겠습니다. 가치창조기술 www.vctec.co.kr 15 가치창조기술블로그
[FPGA 와 Verilog 초보자가이드 ] synthesis FPGA 와 Verilog 2013/02/22 16:46 http://blog.naver.com/ubicomputing/150160471094 지금까지 Verilog를이용하여모듈을생성하고시뮬레이션을동작시키는것을살펴보았습니다. 시뮬레이 션이모듈이올바르게동작하는지에대해많은정보를알려주지만실제하드웨어에옮겼을때동작하는가 에대한것을말해주고있지않습니다. 여기서는모듈을 sythesize하는방법과 Spartan 3A FPGA 개발보 드인 Elbert에구현하는것을설명하겠습니다. 앞서언급하였지만 test bench는시뮬레이션에만사용이됩니다. 모듈을 syntheszie하기위해서는 test bench코드를지워야합니다. 혹모르시는분을위해설명하면, HDL Synthesis란 Verilog나 VHDL과같은 HDL 언어를해석하여동일한하드웨어토폴로지를생성하여내는과정을의미합니다. 이하드웨어토폴로 지는타켓으로선정된 FPGA에따라달라집니다. Synthesis는매우복잡한프로세스로여기서그구체적 인내용까지는알필요는없습니다. 모듈을구현하기위해서 Spartan 3A FPGA 개발보드인 Elbert를선정하였습니다. 이보드는 Xilinx Spartan 3A FPGA를보드상에탑재하고있습니다. 정확한파트넘버는 XC3S50A-VQ100이며 50K개의 게이트를가진 100핀 VQFP칩입니다. 아래는본칩의핀아웃그림입니다. 16 가치창조기술블로그
17 가치창조기술블로그
다시모듈로돌아와서하드웨어에이모듈을어떻게구현할수있을지생각해보겠습니다. 모듈은 NOT 게 이트이며, 이모듈을테스트하기위한많은가능한하드웨어설정이있습니다. 여기서는스위치와 LED를 이용한하드웨어설정을통해테스트를하도록하겠습니다. 하드웨어설정은아래와같습니다. 18 가치창조기술블로그
위의다이어그램을보면스위치는 VCC에저항으로풀업된입력에연결되어있고, 출력은 LED에연결되어 있습니다. 스위치가열려있을경우에는양전압이걸리게되고 NOT 게이트의입력에는로직 1이들어가 게됩니다. 이렇게되면출력은로직 0이되어 LED는꺼지게됩니다. 반대로스위치가닫히게되면 NOT게 이트의입력은로직 0이되고출력은로직1이되게되어 LED는켜지게됩니다. 위의테스트를위한기본적인하드웨어구성은다음과같습니다. 1. 풀업저항에연결된입력가능한 I/O에스위치가연결됨 2. 출력가능한 I/O에 LED가연결됨 아래는 Spartan 3A FPGA 개발보드 Elbert 의 I/O와장착모듈을보여주는그림입니다. 19 가치창조기술블로그
위의그림에서볼수있듯이 Elbert는범용목적의 4개의푸쉬스위치를가지고있고, 여덟개의 LED를가지 고있습니다. Elbert 회로도를살펴보면스위치와 LED가어떻게연결되어있는지좀더확인할수있습니 다. 본테스트를위해서 SW0와 LED0를사용하기로하고스키마틱을살펴보면 SW0이 IP_3( 핀7 번 ) 에연 결되어있고 LED0는 IO_L01P( 핀3 번 ) 에각각연결되어있는것을확인할수있습니다. 참고로, IP_3은입 력으로만사용되는핀입니다. 자, 이제준비가끝났습니다. 구현할베릴로그모듈이있고, 하드웨어플랫폼을선택했으며, 어떤 IO를사 용할것인지결정했습니다. 모듈을다시살펴보겠습니다. module mymodule(a, B); input wire A; output wire B; assign B =!A; endmodule 모듈은두개의포트를가지고있습니다. 포트A는입력, 포트B는출력입니다. 포트A는 FPGA의 IP_3에붙 여주어야하고포트B는 IO_L01P에붙여주어야하는데 user constraint를정의함으로써연결을할수 있습니다. User Constraint는 HDL synthersizer의한부분인 placement logic과라우터에모듈신호들이 어떻게물리적인핀에연결되어야하는지를알려주게됩니다. 이러한 contraint의리스트를만들어파일을 만들고, 이파일을프로젝트에포함시키게되는데이파일을종종 User Constraints File이라고부릅니다. Xilinx툴에서는.ucf 확장자를가진텍스트파일이 User Constraint File입니다. Elbert를위한 contraint 파일은여기서다운로드받으십시오 ( 다운로드 ). 이파일은 Elbert의모든 IO에대한정의값을가지고있습 니다만, 역기서전부가필요하지는않습니다. 사용하지않는부분을지운부분은아래에있습니다. # User Constraint File for NOT gate implementation on Elbert # Onboard LEDs NET "LED[0]" LOC = P3; # Push Button Switches. # Internall pull-ups need to be enabled since # there is no pull-up resistor available on board NET "SW0" PULLUP; NET "SW0" LOC = P7; 20 가치창조기술블로그
4번라인을살펴보면 NET이라는말이나와있는데 NET은실제회로에서 wire나연결과동일한말입니다. 즉 4번라인은 LED[0] 을 3번핀에연결하라는명령입니다. NET "SW0" PULLUP은 SW0이 VCC에풀업되 어야함을의미합니다. 많은 FPGA IO는내장된풀업저항을가지고있습니다. 이러한저항들은위와같이 user constraint 파일에설정함으로써사용할수있습니다. 마지막으로 11번째라인은 SW0을 7번핀에 연결하라는명령입니다. 그러면모듈의포트를스위치나 LED에는어떻게연결하여야할까요? 언급하였듯이포트는모듈에들어오 고나가는일종의선과같고, 다시말하면 NET와동일한역활을합니다. 그래서 User Constraint파일에서 포트이름을 NET 이름과같이사용할수있습니다. NOT 게이트모듈을위해서위의 user constraint파일 을수정하면아래와같습니다. # User Constraint File for NOT gate implementation on Elbert # Onboard LEDs NET "B"; LOC = P3; # Push Button Switches. # Internall pull-ups need to be enabled since # there is no pull-up resistor available on board NET "A" PULLUP; NET "A" LOC = P7; UCF 파일다운로드 이제디자인을 synthesize 하고테스트하여보도록하겠습니다. Xilinx ISE Webpack 에서시뮬레이터프로젝트를열고 모드를 Implementation 으로선택합니다. User constraint 파일을아래와같이프로젝트에추가합니다. 테스트벤치코드 가 verilog 소스파일에있다면지우십시오. 21 가치창조기술블로그
22 가치창조기술블로그
프로젝트를저장하고모듈의오른쪽은클릭하여 "Implement Top Module" 을선택합니다. Synthesis는 수초에서분이걸릴수있습니다. 모든것이이상없으면 Process 창에서체크표시가된초록색원들을보게 될것입니다. 만약어떤아이템이노랑색으로변하였다면 warning이발생하였다는이야깁니다. warning은때에따라 무시해도괜찮을수있을수있습니다. 만약어떤아이템이빨간색으로변하였다면무언가잘못되었다는 이야기이므로처음으로돌아가재점검해야합니다. 디자인을 synthesize 하였으면하드웨어에프로그래밍을하여야합니다. Elbert는 raw binary형태의비트 파일이필요한데이파일은 synthesis 후에생성된최종파일입니다. ISE는디폴트로 raw binary bit 파일 을생성해주지않으므로아래와같이설정하여얻을수있습니다. 1. Progress 창에서 "Generate Programming File" 을오른쪽클릭하여선택합니다. 23 가치창조기술블로그
2. Process Properties 를팝업메뉴에서선택하고다이얼로그박스에서 Create Binary Configuration 파일을체크하고 "Apply" 를클릭합니다. 3. OK 버튼을눌러다이얼로그박스를닫고 progress 창에서 "Generate Programmig File" 옵션을클릭한후 "Run" 을 선택합니다. 프로젝트폴더에보면.bin 파일이생성되어있는것을확인할수있고이파일을 Elbert 에서사용가능합니 다. mymodule.bin 파일을 Spartan 3A 개발보드 Elbert에다운로드하고 SW0 스위치를눌러 LED가켜지는 지확인해보십시오. Elbert에다운로드하는것에대해좀더자세히알고싶으면 Elbert의유저가이드를참 고하세요 Xilinx ISE project 전체다운로드하기 24 가치창조기술블로그
가치창조기술 www.vctec.co.kr 25 가치창조기술블로그