반응형

우선 전체적인 흐름은 아래와 같다.

 

 

 

FCLK_CLK0는 100MHz의 신호가 나오고 있고 clock_divider에서는 이를 50MHz로 바꿔준다.

 

 

camera_configure.v
0.00MB

 

 

 

clock_divider.v
0.00MB

 

 

200pulse 후 start신호가 1이 되면서 통신을 시작하게 되고 완료가 되면 led에 불이 들어오게 해놓았다.

 

VGA_OUT 모듈의 내용은 아래와 같다.

 

칼라 포멧은 위와 같이 나타내어지고 나는 RGB565 포맷을 사용중이므로 이에 맞게 핀을 설정하여 준다.

https://wiki.epfl.ch/prsoc/ov7670

 

VGA Camera extension OV7670

YUV Y U Y V Y V Y U U Y V Y V Y U Y      

wiki.epfl.ch

 

 

 

VGA_OUT.v
0.00MB

 

이를 통해 출력되는 화면은 아래와 같다.

 

 

누가봐도 색이 제대로 출력되지 않고 있다.

 

 

이는 초기 SCCB통신이 원활하게 이루어지지 않아 RGB 데이터가 아닌 HSV데이터가 카메라 모듈로부터

출력되고 있는데 이를 RGB값인마냥 그대로 VGA신호에 넣어줬기 때문에 이러한 현상이 발생한 것일 것이다.

 

따라서 SCCB 통신부터 다시 해보자

 

반응형

'FPGA > Verilog 공부' 카테고리의 다른 글

VIVADO 사용법(완전 기초)  (2) 2020.12.29
Verilog를 통한 MUX회로 구현  (0) 2020.12.29
Verilog를 사용하여 Disparity Map 생성_(1)  (0) 2020.08.28
Verilog를 이용한 Pulse 출력 확인  (0) 2020.07.19
BRAM  (0) 2020.07.08
반응형

Vivado tool을 사용하여 작업하다보면 Simulation을 사용하는 경우가 많은데

아주 간단한 사용법을 적어두려고 한다.

 

 

 

위와 같은 아주 간단한 모듈을 만든다.

 

입력은 클럭을 갖고 하나의 출력포트를 갖는 형태이다.

 

3Bit 크기의 counter을 만들어주고

counter값이 4가 되게 되면 out의 신호가 반전되는 모듈이다.

 

가장 먼저 위의 clk는 wire로 만들어주었는데

입력포트이기에 이 부분은 clk신호를 생성해주는 곳과 선으로 연결되게 될 것이다.

따라서 이 부분은 wire로 생성해 주었다.

 

그 다음은 out 출력포트인데 이 부분은 출력되는 값을 저장하여 갖고있어야 하기에 reg 형태로 만들어주었다.

 

 

따라서 출력포트는 0 혹은 1의 값을 갖게 되고  그 다음으로 4까지의 값을 갖도록 해주기 위해

3Bit 크기의 counter 을 만들어준다.

 

모든 Reg에 대해서는 초기화가 필요하다.

 

counter의 경우 모듈 중간에 생성된 부분이기에 중간에 초기화를 해주면 되고

out의 경우 모듈의 포트이기에 모듈이 생성되고 초기에 값을 가지고 있어야 하기에

initial 을 사용하여 초기화를 해준다.

 

그 다음은 counter값이 4가 되게되면 값을 0으로 바꿔주고

out의 값을 반전시키는 코드이다.

 

 

 

다음은 시뮬레이션 코드이다.

 

우선 입력신호를 0과 1로 바꿔가며 줄 것이기에

1Bit 크기의 clk신호를 만들어주고 초기화를 진행해준다.

 

그 다음 out인데 이는 위에서 생성한 모듈의 출력의 출력결과를 연결하여 표현해 줄 것이기에 wire로 생성해주었다.

 

그리고 이들을 각각 모듈의 clk와 out신호와 맵핑하여주고

테스트벤치의 clk값만을 반복적으로 변화시켜가면서 결과를 확인해본다.

 

반응형

'FPGA > Verilog 공부' 카테고리의 다른 글

VIVADO 사용법(완전 기초)  (2) 2020.12.29
Verilog를 통한 MUX회로 구현  (0) 2020.12.29
Verilog를 사용하여 Disparity Map 생성_(1)  (0) 2020.08.28
OV7670 카메라 영상 출력  (0) 2020.07.28
BRAM  (0) 2020.07.08
반응형

BRAM(Block RAM)

 

https://goodlman.tistory.com/entry/Block-RAM-in-FPGA

 

Block RAM in FPGA

*Youtube 강의를 정리해 놓은 것 https://www.youtube.com/watch?v=fqUuvwl4QJA What is Block RAM? -. 기본적으로 FPGA안에 필요한 정보, data를 저장하는 공간이다 -. Most can be initialized to non-zero valu..

goodlman.tistory.com

- 기본적으로 FPGA안에 필요한 data를 저장하는 공간으로 볼 수 있다.

- Memory의 용량은 Width와 Depth로 계산하게 되는데 Width는 몇 바이트 크기인지, Depth는 배열 원소의 갯수를

  의미한다고 보면 될 것 같다. 즉 Width는 각각의 원소의 크기를 나타내고 Depth는 배열의 크기를 의미하게 된다.

- FPGA안에 램구조를 가진 블럭이라는 의미

- 하나의 블럭램 용량은 18KBits

 

 

 

Single Port BRAM은 하나의 포트만을 사용하는 BRAM이다.

 

 

 

RAM을 설계하는 과정은 아래 링크를 들어가 참고해보자.

https://m.blog.naver.com/PostView.nhn?blogId=ansdbtls4067&logNo=221281079043&proxyReferer=https:%2F%2Fwww.google.com%2F

 

[FPGA 강의] 31강 - RAM 설계 따라하기

0. 들어가며...지난 시간 ROM 설계 따라하기에 이어서 이번 포스팅에서는 RAM 설계 따라하기 강의를 ...

blog.naver.com

 

아래와 같은 형태로 이루어져 있는데

아래 이미지는 Single Port이므로 포트 A만을 사용한다.

 

Wr En신호가 들어가게 되면 Write이 가능해지고

읽기모드만을 사용하고자 한다면 off하거나 GND에 위치시키면 된다.

 

Addr은 읽고 쓸 Data의 위치를 저장하게 되고

Wr/Rd Data는 읽고 쓸 데이터 정보를 나타낸다.

 

RAM의 Width 와 Depth의 크기에 따라 Address버스와 Data버스의 신호 갯수가 정해지게 된다.

 

 

 

아래는 Dual Port BRAM을 도식화한 것이다.

이 경우 동시에 같은 addr에 write할 수 없다.

 

 

 

FIFO FRAM은 Write/Read side로 나뉘어지고 Full/Empty flag가 있어 memory안의 Data Capacity를 알려준다.

반응형
반응형

MiniZed 보드에 보면 Pmod 포트가 있다.

여기에 Pmod VGA 어뎁터를 연결하여 모니터에 출력을 하고자 한다.

 

https://timetoexplore.net/blog/arty-fpga-vga-verilog-01

 

FPGA VGA Graphics in Verilog Part 1 — Time to Explore

This tutorial series introduces video graphics programming using FPGAs, starting with creating a VGA driver and moving onto more advanced features including bitmaps, sprites and effects. FPGAs excel at high-speed I/O and custom logic: you'll be surprised h

timetoexplore.net

위의 블로그를 참고하여 실행하였다.

 

디지털 신호들이 어떻게 VGA케이블을 통해 모니터에 출력될 수 있는지는 본 게시물에서 다루지 않도록 하겠다.

이를 자세히 설명해주는 많은 한글 자료들이 많이 있기에 참고하면 될 것 같다.

 

본 게시물에서는 그냥 코드를 가져와 어떻게 실행하는지 기본적인 내용만 다룬다.

 

우선 프로젝트를 하나 생성하여 준다.

이때 minized의 Constraint 파일도 등록하여 진행하고 보드도 minized를 선택하여 프로젝트를 생성해준다.

위와 같이 프로젝트가 생성된 것을 확인할 수 있다.

 

프로젝트 생성 후 좌측에 보이는 'IP INTEGRATOR' 에서 Create Block Diagram을 선택하면 위의 사진과 같이 윈도우가 하나 뜨게 되는데 여기서 Design name을 적어준 후 OK를 누른다.

 

위와 같이 Diagram 창의 가운데 보이는 '+'를 클릭하면 검색창이 뜨게 되는데 zynq를 입력하면

'Zynq7 Process System'이 보이게 된다.

이를 더블클릭하여 생성하여 준다.

 

위와 같이 IP가 생성되게 되고 이름을 더블클릭하면 아래와 같은 창이 뜨게된다.

 

위의 창이 뜨면 'Clock Configuration' 항목에서 'PL Fabric Clocks', 그리고 아래 목록들 중 가장 위의 CLK0 항목만

체크한 후 OK를 누른다.

 

그리고 위의 'Zynq7 Process System' IP를 생성하였을때와 같이 'Processor System Reset' IP도 추가하여 준다.

그 후 아래와 같이 선을 이어준다.

 

그리고 상단의  'Run Block Automation'을 클릭하여준다.

 

 

아래는 그 결과화면이다.

그럼 이제 소스를 입력해주자.

 

 

vga640x480 이라는 이름의 모듈을 만들어주자.

 

 

 

그 다음 top모듈을 생성하여 준다.

 

 

 

위의 문장 중

 

always@(posedge CLK)

    {pix_stb, cnt} <= cnt + 16'h4000;

 

이라는 문장이 있다.

 

이 부분은 100MHz의 CLK 펄스를 25MHz로 나눠주기 위한 과정으로 {a, b} 는 Verilog의 결합연산자 이다.

 

결합연산자란 중괄호 { }에 의해 묶인 두 개 이상의 표현이 갖는 비트들의 결합으로

위와 같은 특징이 있다.

즉 중괄호 안의 값들에 대한 비트를 순서대로 그냥 붙인다는 특징이 있다.

따라서 위의 과정에서는 

{pix_stb, cnt} 로 사용되었는데 pix_stb는 1비트의 크기를 갖는 값이고

cnt는 [15:0] 의 16비트 크기이므로 {pix_stb, cnt}는 총 17비트 크기의 값을 갖게 된다.

 

또한 cnt는 16비트의 값으로 초기에는 0의 값을 갖게 되고

16'h4000 은 2진수로 나타내면 16'b 0100 0000 0000 0000  의 값을 갖게 된다.

 

always@(posedge CLK) 에 의해 매 CLK 펄스에 맞추어

처음에는

 

             0000 0000 0000 0000

           +0100 0000 0000 0000

= pix_stb, 0000 0000 0000 0000

 

이 되고 두번째 posedgeCLK에서는

 

             0000 0000 0000 0000

           +0100 0000 0000 0000

= pix_stb, 0100 0000 0000 0000

 

 

             0100 0000 0000 0000

           +0100 0000 0000 0000

= pix_stb, 1000 0000 0000 0000

 

 

 

             1000 0000 0000 0000

           +0100 0000 0000 0000

= pix_stb, 1100 0000 0000 0000

 

 

             0000 0000 0000 0000

           +0100 0000 0000 0000

= pix_stb, 0000 0000 0000 0000   이 되고 pix_stb의 값이 1이 되게 된다.

 

그리고 위의 과정을 다시 반복하여 pix_stb 값은 다시 0이 되게 되고 따라서 결과적으로

CLK의 펄스 주기를 1/4 로 나누는 효과가 발생하게 된다.

 

즉 100MHz의 CLK를 통해 25MHz의 pix_stb 신호를 만들 수 있게 된다.

 

 

그렇게 되면 Design Source에 아래와 같이 뜨게 된다.

 

top 모듈에서 vga640x480 모듈의 신호를 사용하기에 위와 같이 뜨게된다.

 

 

그럼 이제 다시 Diagram으로 돌아와서 모듈을 추가해준다.

 

그럼 생성한 모듈이 2개이므로 아래와 같이 2개 항목이 뜨게 된다.

 

 

하지만 top모듈 안에서 vga640x480 모듈을 가져와 사용하므로 Diagram에서는 top모듈만 추가하여준다.

 

그리고 위와 같이 선을 연결하여준다.

 

그리고 top 모듈 각각의 출력포트를 우클릭하면 다음과 같이 뜨게된다.

 

Create Port를 선택하여 진행하고 이를 모든 출력에 대해 진행하여준다.

 

그 다음 좌측의 Sources 목록에서 Zynq_system 항목을 우클릭 한 후 Create HDL Wrapper 선택

 

 

 

그럼 아래와 같이 top모듈과 그 하위 vga640x480 모듈이 추가되었음을 확인할 수 있다.

 

 

 

그 다음 Zynq_system_wrapper을 우클릭한 후 Set as Top 을 선택

 

 

 

그 후 .xdc 파일을 열어 minized의 포트와 모듈의 출력신호를 mapping하여준다.

 

 

Minized의 포트관련 정보는 첨부파일에 있다.

[PRJ-MI1DEV,1-01-04]_Schematic Prints.pdf
1.03MB

 

 

 

여기까지 완료되었으면 Synthesis와 Implementation, generate Bitstream을 차례차례 실행하여준다.

 

 

 

Generate Bitstream까지 완료되었으면 아래 사진과 같이 OpenTarget, Auto Connect를 실행

 

 

 

연결 되었다면 Program Device에서 해당 장치를 선택하여준다.

그리고 Bitstream파일을 장치에 프로그래밍해준다.

 

 

 

 

 

화면에 출력되는 것을 확인할 수 있다.

반응형
반응형

 

 

 

 

Minized를 구입하였고 Vivado에서 이를 다뤄보려 한다.

 

이를 위해 프로젝트를 생성해줘야 하는데 생성하는 과정에서

보드의 Constraint 파일이 없으므로

아래 파일을 다운받은 후 위의 "Add Constraints" 윈도우에서 아래의 파일을 추가하여준다.

MiniZed_Constraints_Rev1_170613.xdc
0.02MB

 

 

 

 

그 다음 창인 "Default Part" 윈도우에서 MiniZed보드를 선택해야 하는데 아래 사진에서 볼 수 있듯이

Minized가 검색되지 않는 경우일 수 있다.

 

 

 

 

 

C:\Xilinx\Vivado\2017.4\data\boards\board_files

 

위의 경로로 이동해보면 해당되는 minized에 대한 정보가 없기 때문이다.

따라서 아래 첨부된 파일인 MiniZed_Board_Definition_File_1p2.zip파일을 압축을 풀고

위의 경로에 추가하여준다.

 

MiniZed_Board_Definition_File_1p2 (1).zip
0.46MB

 

 

이렇게 minized폴더를 만들어 넣어주었다.

 

그리고 Vivado를 다시 실행시키면 위와 같이 Minized 항목이 추가된 것을 확인할 수 있다.

 

 

반응형

'FPGA' 카테고리의 다른 글

MiniZed 를 통한 Pulse 출력  (0) 2020.12.29
Tera Term(테라텀)을 사용하여 FPGA 보드 다루기  (0) 2020.09.23
MiniZed 를 통한 VGA 출력(Pmod VGA)  (0) 2020.07.02

+ Recent posts