반응형

우선 사칙연산을 수행해주는 arith8이라는 이름의 모듈을 하나 만들어주자.

 

 

a와 b를 입력으로 받아 각각의 사칙연산 결과를 출력으로 내보내주는 모듈이다.

 

회로의 규모가 커지게 되면 하나의 모듈로 처리하기에는 적합하지 않은 경우를 만나게 되는데

이때 설계할 내용을 기능적인 측면과 회로의 양을 감안하여 하나의 모듈이 지나치게 커지지 않도록

적절한 크기로 분할하여 처리할 필요가 있다.

 

위의 그림은 a,b 입력을 받고 사칙연산을 수행하여 출력하는 과정을 도식화하여 나타낸 것이다.

 

앞에서 작성한 코드는 위의 그림에서 사각형으로 나타내어진 arith8.v에 해당한다.

 

그럼 위의 그림에서 나타내어진 것과 같이 din_a, din_b의 입력을 받아 최종적으로 y_out의 출력을 갖는

구조를 나타낼 때 이미 만들어진 arith8 모듈을 사용하여 위의 그림처럼 나타내어 보자.

 

 

가장 먼저 큰 모듈인 arith8_core 모듈을 만들어주자.

이는 입력은 din_a, din_b, sel 을 갖고 출력으로 y_out을 갖고 있다.

 

그 다음 y_a, y_s, y_d, y_m 들을 선언해주는데 바로 아래에 arith8 모듈을 상위모듈로 하여

하위모듈인 u_arith8_0 모듈을 만드는 것을 볼 수 있다.

 

상위모듈인 arith8.v 에서 입력인 a와 b는 하위모듈에서 din_a, din_b로 맵핑해주고

상위모듈에서의 y_add는 하위모듈에서 y_a 로 맵핑, 그리고 이러한 방식으로 맵핑이 진행되게 된다.

 

그리고 그 다음 맵핑된 y_a, y_s, y_d, y_m을 이용하여 MUX를 구성한 것을 볼 수 있다.

 

즉 arith8_core 모듈은 결론적으로 din_a, din_b, sel의 입력, y_out의 출력을 갖는 모듈인데

이를 표현하기 위해 arith8 모듈을 사용하였다.

arith8모듈은 입력이 a, b 이고 출력이 y_add, y_sub, y_mul, y_div인 모듈인데

이를 arith8_core에서 사용할 것이기에 맵핑을 통해 맞춰주는 과정이 필요하게 된다.

 

입력은 arith8_core의 입력과 arith8의 입력이 동일하게 사용되므로

.a (din_a), 

.b (din_b),    와 같이 a와 b를 din_a, din_b 로 맵핑해주었고

arith8 모듈의 출력을 표현하고 다루기 위해서 y_a, y_s, y_d, y_m 신호를 만들어주어

사용하고 이를 통해 결과적으로 y_out의 출력을 나타내고 있다.

 

(참고로 하위모듈 이름이 u_arith8_0 인 이유는 arith8모듈의 under이라 u가 붙고 0번째, 1번째... 와 같이

순서대로 진행될 수 있기에 0을 붙여준다. 즉 arith8의 0번째 하위모듈이란 뜻을 담고 있다.)

 

 

 

시뮬레이션을 실행하면 위와 같이 출력되는 것을 확인할 수 있다.

 

위의 Restart를 눌러준 후

시뮬레이션 파일을 저장해준다.

 

그리고 openfile을 이용하여 tcl파일을 열어주고

 

아래와 같이 코드를 작성한 후 저장하여 준다.

 

작성이 완료되었으면

이렇게 tcl파일이 있는 경로로 이동한 후

source 모듈명.tcl  입력

 

그럼 위와 같이 아름다운 시뮬레이션 결과가 출력된다.

반응형
반응형

 

OV7670 카메라 모듈의 핀은 위와 같이 나타나 있다.

 

SCL과 SDA는 SCCB 통신을 위한 핀으로

SCL은 input Port, SCCB 인터페이스 제어 클럭을 입력받는 핀이고

SDA는 InOut Port로 통신을 위한 데이터를 전송하고 전송받는 핀이다.

 

 

MCLK는 시스템 클럭으로 Input Port이고 여기에 입력되는 클럭을 통해 이미지 데이터를

D0~D7로 출력하고 픽셀클럭(PCLK)를 출력하게 된다.

 

 

 

 

위 이미지는 OV7670 카메라 모듈의 Functional Block Diagram(FBD) 이다.  XCLK핀에 클럭 신호를 입력해주면

이를 기반으로 Video Timing Generator에서 VSYNC, HSYNC, PCLK 신호를 출력해준다.

 

 

그럼 우선 SBBC 통신을 통해 데이터를 받아오기 위한 설정부터 진행해보자.

일단 왜 SBBC 통신을 쓰는지, SBBC통신의 장점을 간단히 적자면

SBBC통신(I2C통신)은 시리얼통신과 다르게 동기화 통신방식을 사용하여 통신속도를 따로 정해주지 않아도 되고

클럭신호를 통해 데이터의 전송  타이밍을 맞추게 된다.

(그리고 많은 센서를 동시에 편하게 연결할 수 있다고 한다.)

 

 

위의 그림은 I2C 통신을 나타내는 그림으로 다음 두 그림을 참고하여 설명하겠다.

 

 

 

SDA신호와 SCL신호는 모두 풀업저항에 의해 초기에 HIGH상태를 유지한다.

 

그리고 SDA신호가 LOW로 떨어지게 되면 데이터 전송을 시작하게 되고 그 이후 클럭신호(SCL)에 맞춰

데이터 전송이 진행된다.

 

Device Address의 데이터 전송이 끝났으면 Read/Write 데이터를 전송하고 쓰기모드일 경우

데이터가 잘 전송되었는지는 Slave측의 ACK 신호를 통해 확인하게 된다. 

 

그리고 난 후 SCL이 LOW신호일 때 다음 데이터인 Register Address 데이터 전송을 위해 data값을 바꾸고 위의 내용들을 반복하여 진행하게 된다.

 

 

 

위의 그림에서 SDA신호가 0이 되면 통신 시작

-> 그 다음 SCL이 0이 되는 순간부터 데이터 전송

-> 8개 비트 데이터(7bit Address, 1bit R/W) 전송

-> ACK확인

-> 그 다음 데이터 전송

-> ...

 

을 진행하게 된다.

 

위는 PCF8574A 라는 장치의 Address에 A0앞에 R/W의 정보가 담기는 것을 확인할 수 있다.

 

즉 Address 안에 R/W 정보를 담고 있는 것이다.

 

 

OV7670.pdf
0.84MB

 

 

 

위 파일은 OV7670의 메뉴얼 파일이다.

 

 

메뉴얼을 보면 위와 같이 Register을 설정해주는 부분이 보이는데 이 부분에 대한 설정 값들을 SBBC 통신을 통해

진행하게 된다. 즉 위의 설정값을 통해 어떠한 데이터를 받아올 것인지 설정해주게 된다.

 

 

OV7670_config_rom.v
0.00MB

 

 

 

위 파일이 Register에 대한 값들을 설정해주기 위한 값들을 담고있다.

 

 

위의 addr값이 0 일때의 조건문을 보면

dout 값에 16'h1280 의 값을 넣어주는 것을 확인할 수 있다.

 

이는 Register의 12번 주소에 0x80 이라는 값으로 설정해주겠다는 의미이다.

 

SCCB.zip
0.01MB

 

 

위의 파일은 SCCB 통신을 위한 코드가 담긴 파일이다.

 

Camera_configure 모듈을 살펴보면 입력으로

CLK, start, RST가 존재하고 출력신호로 SIOC, SIOD, done 신호가 존재한다.

 

내부적으로는 config 모듈과 SCCB_Interface 모듈, ROM 모듈이 존재하며

이들과의 관계를 통해 결과적으로 SIOC, SIOD 출력을 내보내게 되고

이를 통해 카메라모듈과 통신을 진행하게 된다.

 

start신호는 임의로 만들어주었다.

 

ZedBoard에서 출력되는 신호는 100MHz의 클럭이 출력되므로

아래와 같이 clock_divider 이라는 모듈을 만들어 100MHz 신호를 1MHz로 바꿔주어 출력하고 이를 Configure 모듈로 입력하여 통신을 진행하도록 한다.

 

또한 start신호는

 

위와 같이 cnt가 200보다 작을때는 계속 증가시키고

200이 되는 순간 start를 1로, 201이 되면 다시 start를 0으로 하고 cnt가 증가하지 않도록 함으로서

순간적인 start신호를 만들어 주었다.

 

clock_divider.v
0.00MB

 

 

 

 

그리고 난 후 이를 minized 보드에 입히고

실행시키면 Camera Module에서 pixel clock과 함께 데이터 신호들이 나오고 있는 것을

오실로스코프를 통해 확인할 수 있다.

 

 

 

 

위의 D0신호는 카메라 모듈의 Vsync, D1은 HSync,

D2~D5는 Image Data를 의미한다.

 

확인해보면 조금 이상하긴 하지만 HSync가 멈추는 사이사이 Vsync가 1이 되면서 프레임완료 신호를 출력하는 것을

확인할 수 있다.

 

 

그리고 Href 가 High인 상태에서 각각의 데이터 신호들이 전달되는 것을 확인할 수 있다.

 

 

그럼 XCLK로 몇 Hz의 신호를 주어야 할까?

 

Hacking the OV7670 camera module (SCCB cheat sheet inside)

An in-depth look of the OV7670 camera module The OV7670 is a low cost image sensor + DSP that can operate at a maximum of 30 fps and 640...

embeddedprogrammer.blogspot.com

위의 블로그를 참고하면 30fps의 경우 24MHz의 클럭을 입력하여야 한다고 한다.

 

 

*******************************************************************

하지만 통신이 완료되면 done신호가 1이 되어 출력되어야 할 것 같은데 이는 아직 출력되지 않고 있다.

 

이를 확인해볼 필요가 있다.

 

반응형
반응형

베릴로그를 공부하다보면 플립플롭과 래치, 순차회로, 조합회로에 관한 얘기가 많이 나오게 된다.

 

* 순차회로, 조합회로

간단하게 이전 입력을 기럭하는 부분이 있는 회로라면 순차회로, 이전 입력을 기억하지 않는다면 조합회로로

볼 수 있다.

 

 

위의 경우 A,B,C,D의 입력값들에 의해 출력 T가 결정되게 된다. 이는 조합회로로 볼 수 있다.

다음은 순차회로이다.

위의 회로는 A값에 1이 한번 입력되게 되면 T값은 계속 1을 출력하게 된다.

A에 1이 들어가게 되면 OR게이트이므로 무조건 1을 출력하게 되고 T는 1, 그리고 이 값이 다시 OR게이트에

입력으로 들어가게 된다. 이 때 A값이 0으로 바뀌었다고 해도 이전의 값이 1이었기에 T는 계속해서 1이 출력되게

된다. 

 

1비트의 정보를 저장하는 회로를 플립플롭(flip-flop)이라 한다.

 

 

위의 그림은 SR플립플롭을 도식화 한 것이다.

 

우선 S값에 0, R값에 1이 입력되었다고 가정해보자.

R값은 1이기에 NAND게이트를 통해 0이 출력되게 되고

이는 다시 NAND를 통해 1이 출력되어 Q'은 1이 출력되게 된다.

그리고 S는 0이기에 NAND를 통해 1이 출력되고 이는 다시 NAND를 통해

위에서의 Q'값 1을 통해 Q는 0이 출력되게 된다.

 

그리고 S와 R 신호 모두 0이 되면 이전의 상태를 유지하게 된다.

 

그럼 S값에 1, R값에 0이 입력된다고 보면

S의 NAND는 0이 출력되고 되고 다시 NAND의 입력으로 들어가게 되어 Q로 1이 출력되게 된다.

그리고 R은 0이기에 NAND를 통해 1이 출력되게 되고 이는 다시 Q신호 1과 함께 NAND로 들어가  

Q'은 0이 출력되게 된다.

 

그리고 이 또한 S와 R 신호 모두 0이 되면 이전의 상태를 유지하게 된다.

참고로 S나 R 신호 중 하나가 1로 되지 않은 상태에서 S와 R 신호 모두 0이 되게되면 에러가 발생하게 되고

두 신호 모두 1이 되게 되면 출력은 Q와 Q' 모두 0이 되게 된다.

 

 

 

위는 SR Latch의 이미지인데 보면 플립플롭과 다르게 CP신호가 없음을 확인할 수 있다.

 

즉 Latch와 F/F의 차이는 클럭입력을 가하게 되면 F/F

클럭입력을 가하지 않으면 Latch로 볼 수 있다.

 

 

 

이를 순차회로라고 하고 플립플롭과 래치는 이러한 방식으로 값을 저장하게 되는 것이다.

 

 

반응형
반응형

Vivado 첫 화면은 다음과 같다.

 

여기서 가장 위의 Create Project를 선택

 

 

프로젝트 이름과 경로를 설정하고 NEXT

 

 

위의 화면에서 일단 나는 장비 없이 간단한 코드들만 실행시켜보면서 시뮬레이션 돌려볼 것이므로

그냥 NEXT를 눌러 진행한다.

Constraint는 사용할 보드의 구조를 담고있는 파일을 말하는 듯 하다.

 

 

이 부분도 현재 보드가 없으므로 그냥 NEXT

 

 

 

위와 같이 설정 Summery가 확인되는데 source파일을 추가해주지 않았고 constraints 파일을 지정해주지 않았기에

위와 같은 알림이 뜨게 된다.

 

그리고 마무리를 하면 다음과 같은 창이 뜨게된다.

 

 

위의 Design Source부분에서 Add Source를 선택하여 소스코드를 넣어주자.

 

 

 

위와 같이 Create File 클릭 수 File name과 File Type을 설정해준다.

 

이렇게 test.v 라는 파일이 생성되게 된다.

여기서 test라는 Module의 입출력 포트를 지정해주게 된다.

 

하지만 나는 여기서 설정하는 것 보다 나중에 코드로 설정하는게 더 편하므로(개인적으로)

여기서는 그냥 OK를 눌러 진행한다.

 

 

위와 같이 test라는 파일이 만들어지고 또 test라는 모듈이 만들어진 것을 확인할 수 있다.

 

위와 같이 간단한 AND게이트를 만들어보자.

 

코드로 작성한걸 회로로 보기 위해 좌측 RTL ANALYSIS 항목의 Schematic 선택 후 다음과 같이 진행

 

위와 같이 a,b를 입력으로 받고 c를 출력으로 갖는 AND게이트가 나타나게 된다.

 

그럼 시뮬레이션을 통해 더 작업을 진행해보자.

우측의 SIMULATION 항목에서 Run Simulation 진행

그리고 Run Behavioral Simulation 진행

 

위와 같이 뜨는데 a, b 에 아직 값을 안정해줬기에 Z 라는 이상한 값이 들어가있고

출력을 나타내는 c에도  X 라는 이상한 값이 들어가있다.

 

그렇기에 입력의 a, b에 값을 넣어줘보자.

 

위의 사진에서 가장 좌측 상단의 아이콘을 누르면 시간이 0ps로 이동하는 것을 확인할 수 있다.

 

그리고 상단의 시간을 표현하는 부분에 1 us 를 선택해주자.

 

위와 같이 a의 값에 Force Constant를 통해 0이라는 Force Value를 넣어주고 OK

 

똑같이 b의 값에도 0을 넣어주자.

 

위와 같이 0이라는 Value가 제대로 들어간 것을 확인할 수 있다.

 

그럼 상단 시간을 표현하는 부분에 (T)라고 쓰인 아이콘을 클릭

 

0us부터 시간을 표현하는 부분에 적어준 1us까지 지정해준 값을 통한 출력값 c가 표현된다.

 

이렇게 진행해보면 입력값에 따른 결과값이 표현되는 것을 확인할 수 있다.

 

여기까지 완전 기초로 초등학생도 따라할 수 있는 과정이였다.

중간중간 설정이 의미하는게 어떤건지,

좀 더 디테일한 과정을 진행하기 위해선 어떻게 해야하는지

앞으로 차근차근 정리해보겠다.

반응형
반응형

MUX는 다양한 입력신호를 갖고 select 신호에 따라 어떠한 입력을 출력할 것인지 선택하게 된다.

 

https://netpilgrim.net/460

즉 위와 같이 나타낼 수 있으며 S0와 S1의 신호에 따라 어떠한 입력신호를 출력할 것인지 결정하게 된다.

 

이를 Verilog 코드로 표현하면 아래와 같다.

 

mux1 이라는 모듈을 만들었는데 입력은 d0, d1의 신호와 어떠한 입력을 출력할 것인지 선택하는 sel 신호가 있다.

 

출력신호 y1부터 보자.

 

sel값이 0이면 d1값은 무시되고 ~(sel)을 통해 d0의 값이 출력되게 된다.

반대로 sel값이 1이면 ~(sel)값은 0이 되어 d0가 무시되고 d1의 신호가 출력신호가 된다.

 

y2는 물음표 기호가 들어가게 된다.

이는 조건에 따른 동작을 선택할 때 사용되고

형식은 다음과 같다.

 

(판단문) ? [참일 때의 선택] : [거짓일 때의 선택];

 

즉 위의 예로 보면 sel은 0인가?   참이면 y2는 d0신호, 거짓이면 y2는 d1신호

라는 뜻을 담고 있다.

 

그럼 다음 예제를 보자.

 

d0부터 d3까지 4개의 입력신호를 갖고 있으므로 4개를 선택할 수 있도록 2bit 크기의 sel 신호가 선언되었다.

하지만 아래 assign의 판단문을 보면 거짓일때의 선택항복이 비어있는 것을 볼 수 있다.

 

이는 거짓일 경우에 대해서 새로운 조건에 대한 판단을 할 수 있도록 가능성을 열어둔 것이다.

즉 sel이 0인가? 맞다면 d0출력

sel이 0이 아닌가?  그럼 sel이 1인가? 맞다면 d1 출력

이렇게 뒤의 내용들이 이어진 것으로 볼 수 있다.

반응형
반응형

Disparity Map을 생성하기 위해 한 쌍의 스테레오 이미지를 불러와 연산을 수행하여야 한다.

해당 스테레오 이미지는 아래의 링크를 통해 다운받았고 혹시 모르니 첨부해놓도록 하겠다.

 

 

 

https://vision.middlebury.edu/stereo/data/scenes2003/

 

2003 Stereo Datasets

2003 Stereo datasets with ground truth These datasets were created by Daniel Scharstein, Alexander Vandenberg-Rodes, and Rick Szeliski. They consist of high-resolution stereo sequences with complex geometry and pixel-accurate ground-truth disparity data. T

vision.middlebury.edu

left.bmp.bmp
0.48MB
right.bmp.bmp
0.48MB

 

 

 

 

 

 

 

Verilog HDL을 통해 이미지파일을 불러오고 Disparity값을 구하여 Depth Map을 생성한 후 결과 파일을 저장하는

과정을 진행하도록 하겠다.

 

 

우선 Verilog에서는 이미지파일을 그대로 가져와 연산을 수행하기 힘들기에

Matlab을 통해 .hex파일로 변환해준 후 작업을 진행해야 한다.

 

 

Matlab 코드는 위와 같다.

 

imread를 통해 bmp파일을 불러와 b에 저장하고 해당 값들은 a에 저장된 후

작성되게 된다.

 

이 과정에서 반복횟수은 375와 450은 각각 이미지파일의 Width와 Height를 의미한다.

 

위의 과정을 통해 left이미지와 right이미지 파일을 각각 left.hex, right.hex 파일로 변환해주도록 한다.

 

해당 이미지파일은 Image Rectification과정이 수행된 완전한 수평관계의 이미지들이므로 Rectification과정은 따로

수행하지 않아도 된다.

 

정확한 3차원 Depth Data를 추출하기 위해선 카메라의 초점거리와 두 카메라 사이의 간격을 알아야 정확한 거리를

계산할 수 있지만 이미지 파일만을 통해선 이러한 스펙들을 알아내기 힘들기에 초점거리와 영상 사이의 거리는 임의로 지정하고 따라서 Depth정보는 정확한 거리가 아닌 상대적인 거리임을 알아두도록 하자.

 

 

진행 순서는 아래와 같다.

 

 

1. ImageFile을 불러와 Gray_Scale의 데이터로 표현

  

   이 과정에서 1열의 Image File Data를 2차원 배열 크기로 지정해줌으로서 나중에 계산하기 용이하도록 한다.

 

 

2. 기준점 지정

 

    이 과정에서는 기준이 되는 좌측 이미지의 어떠한 점(pixel)에 대하여 계산을 진행할 것인지를 지정하게 된다.

    입력으로는 CLK신호화 En신호를 두어 En신호가 High상태라면 CLK에 맞추어 Row, Column의 좌표를 출력하고

    En신호가 다시 Low를 갖도록 한다.

 

 

3. 기준영상의 기준점과 주변 데이터를 1열의 형태로 출력

 

    2단계에서 지점을 정하였으면 해당 지점 주변의 데이터를 출력하도록 한다. 나는 9x9 크기의 윈도우를 생성하여

    진행할 것이므로 총 81개의 데이터를 1열로 표현하여 출력하도록 한다.

 

 

4. 기준영상의 데이터를 토대로 우측이미지 탐색

 

    앞에서 좌측 이미지의 데이터를 받아온 위치를 알고 있고 Stereo Image는 Rectification이 진행되었으므로 해당 Row

    만을 탐색하면 된다. 따라서 우측 이미지의 왼쪽 끝부터 오른쪽 끝까지 해당 Row의 9x9 Window를 생성하고 입력받

    은 기준 영상의 데이터와 가장 유사한 점을 선택, 좌측 기준점과 우측 탐색점과의 Disparity값을 출력하도록 한다.

 

5.  출력된 Disparity값을 통해 거리정보를 계산하고 다시 2단계로 돌아가 그 다음 지점의 기준점에 대해 위의 내용을

    반복한다.

반응형

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

VIVADO 사용법(완전 기초)  (2) 2020.12.29
Verilog를 통한 MUX회로 구현  (0) 2020.12.29
OV7670 카메라 영상 출력  (0) 2020.07.28
Verilog를 이용한 Pulse 출력 확인  (0) 2020.07.19
BRAM  (0) 2020.07.08
반응형

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

 

 

 

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

+ Recent posts