Verilog 17

SoC : 기초

Create Block Design을 클릭하고 아래와 같은 블럭을 만들었다.  위 블럭을 토대로 코드를 구현하고 싶다면,Create HDL Wrapper를 클릭하면 아래와 같은 기본적인 코드가 자동으로 형성되는 것을 확인할 수 있다.module micro_blaze_hello_wrapper (reset, sys_clock, usb_uart_rxd, usb_uart_txd); input reset; input sys_clock; input usb_uart_rxd; output usb_uart_txd; wire reset; wire sys_clock; wire usb_uart_rxd; wire usb_uart_txd; micro_blaze_hello micro_blaze_..

Language/Verilog 2024.09.09

Vivado : Basys3 Servo motor, Analog 제어, 가변 저항, 포토 센서(조도 센서)

Servo Motor이번에는 서보모터를 제어할 예정이다. 서보모터 관련 내용은 아래의 사진의 내용과 같다.서보모터를 동작시킬 탑모듈의 코드는 아래의 내용과 같다. 코드를 살펴보면, 0도, 90도, 180도 그리고 일정 각도마다 움직일 수 있도록 선언을 한 것을 확인할 수 있다. module servo_motor_pwm_top( input clk, reset_p, input [3:0] btn, output motor_pwm, output [3:0] com, output [7:0] seg_7); reg [31:0] clk_div; always @(posedge clk or posedge reset_p)begin if(reset_p)clk_div = 0..

Language/Verilog 2024.08.02

Vivado : RGB LED, DC motor

RGB LED RGB를 나타내는 LED를 제어할 예정이다. LED를 제어할 탑모듈의 코드는 아래와 같다. pwm_100 step 컨트롤러는 이전글을 참고하면 된다.  Vivado : PWM 제어PWM LED의 밝기는 Duty rate에 따라 달라진다. LED 뿐만 아닌 모터의 경우에는 속도도 달라진다. PWM을 제어해 보기 위해 아래와 같은 코드를 구현해 보았다. 우선 Duty를 100단계로 설정하기 위하여 dutjangdong.tistory.com LED를 제어할 pwm의 컨트롤러 코드는 아래의 내용과 같다. 사용자가 임의로 주파수를 조절할 수 있도록 parameter를 먼저 선언하였다.module pwm_Nstep_freq#( parameter sys_clk_freq = 100_000_000, ..

Language/Verilog 2024.08.01

Vivado : PWM 제어

PWM LED의 밝기는 Duty rate에 따라 달라진다. LED 뿐만 아닌 모터의 경우에는 속도도 달라진다. PWM을 제어해 보기 위해 아래와 같은 코드를 구현해 보았다. 우선 Duty를 100단계로 설정하기 위하여 duty에 7비트를 선언하였다. 첫 번째 100 분주기는 1us 단위로 pulse를 준다.그다음 두 번째 100 분주기는 1us 단위의 pulse를 100us 주기로 하고, duty값에 따라 변화하는 파형을 보기 위해 아래와 같이 총 10,000 분주기를 설정하였다. //LED 밝기 제어 컨트롤러module pwm_100step( input clk, reset_p, input [6:0] duty, // 100단계 만큼 output pwm); reg [6:0] c..

Language/Verilog 2024.07.31

Vivado : Basys3 종합 시계 프로젝트 (타이머, 스톱워치, 시계)

이번에는 여러 기능을 갖춘 종합 시계 프로젝트를 진행하려고 한다.종합 시계 프로젝트 구현할 종합시계의 기능은 일반 시계 기능, 스톱워치 기능 그리고 타이머 기능을 갖는다. 일반 시계 기능에서는 분과 초를 제어할 수 있으며 59분 59초가 넘을 시 00분 00초로 다시 리셋이 되는 특징을 지닌다. 스톱워치 기능에서는 기본적으로 ms단위로 시계가 흐르며, Lap 기능을 갖추어 원하는 시간에 동작을 멈춘 후, 멈춘 시간으로부터 Lap을 해제할 때까지의 시간을 잴 수 있다. 타이머 기능에서는 초와 분을 설정하여, 설정된 시간으로부터 00분 00초가 될 때까지의 타이머 기능을 구현한다. 타이머가 00분 00초가 되었을 때에는 부저가 울리며, 외부의 스위치로 부저를 제어할 수 있다.타이머타이머를 동작시킬 코드는 아..

Language/Verilog 2024.07.30

Vivado : 온도 습도 센서

온/습도 센서 이번에는 온습도 센서를 사용할려고자 한다. 온습도 센서는 DHT11 모듈을 사용하여 진행할 예정이며, 모듈의 회로 구성은 아래와 같다.  온/습도 센서의 총 동작도는 아래와 같다. MCU 시그널이 주어진 후 센서의 신호가 응답하는 방식으로 진행된다.   아래 그림은 MCU가 시작 신호를 보낸 후에 DHT 센서의 응답 과정을 나타낸다. 온습도센서가 MCU의 신호를 감지 후, MCU를 감지하려면 최소 18ms의 시간이 소요된다. 그러고 난 후 20~40us만큼 센서의 응답을 기다린다. DHT가 시작 신호를 감지하면 저전압레벨의 응답신호를 80us 간 보낸다. 응답 신호를 보낸 후, 센서는 데이터 전송을 위해서 데이터 단일 버스 전압레벨을 저에서 고로 설정하고 80us동안 유지한다. 그다음 모듈..

Language/Verilog 2024.07.25

Vivado : 키패드

키패드이번에는 16개의 버튼이 달려있는 키패드를 제어하려고 한다. 키패드의 회로 구성도는 아래와 같다. 우선 키패드를 동작시키기 위해 키패드를 제어할 controler 모듈을 구현해야 한다. 키패드를 제어할 controler 모듈에서는 링카운터와 case문을 사용하여 4 digit 7 segment와 column을 제어하려고 한다. 코드 내 링카운터 부분에서는 column이 출력 부분으로 작동한다. 키가 눌려있는 상태에서는 column값이 유지된다.단, Key_valid가 1 일시에는 현재 상태를 유지하는 것을 볼 수 있다. 링카운터의 동작 상태도는 아래와 같다. 16개의 스위치 제어에서는 case문을 사용하여 제어하려고 한다. case문에서는 row(행)과 col(열)의 입력을 통하여 출력을 결정하며,..

Language/Verilog 2024.07.25

Vivado : 초음파 센서

초음파 센서오늘은 초음파 센서를 통해 물체 사이의 거리를 측정해보려 한다. 초음파 센서 모듈의 데이터 시트를 확인하면 아래와 같은 Timing Diagram 정보를 확인할 수 있다.   Echo Pulse Output부분은 초음파가 왔다가 가는 걸리는 시간을 의미한다. IDLE은 최소 10ms이지만, 여유 있게 3초로 적용할 예정이다. 그리고 물체와의 거리를 cm 단위로 측정하기 위하여 위 그림에 나와있는 바와 같이 us를 58로 나누어 진행할 예정이다.아래는 초음파 센서 모듈을 동작시킬 코드이다.. 입출력 부분에 선언된 에코는 입력, 트리거는 출력으로 설정하여 진행하였다. 즉, 물체까지 도달하는 속도 및 거리는 트리거, 다시 입력으로 돌아오는 것은 에코로 설정하였다.  FSM 방식으로 진행할 예정이기 ..

Language/Verilog 2024.07.25

Vivado : Basys3 Stop watch

Stop Watch이번에는 여러 가지 기능을 가진 스톱워치를 구현해 볼 예정이다.아래 구현할 스톱워치는 리셋을 누르면 0으로 초기화됨과 동시에 시간이 멈추며, 스위치(버튼)를 누를 때 시간이 멈추고, 다시 누르면 시간이 흐르는 동작을 수행한다. 스톱워치의 코드는 아래와 같다. 1 sec이 흐를 수 있도록 이전글에서 구현한 clock 코드를 가져와 사용하였고, 0번 버튼을 스위치로 사용하기 위해 "btn [0]"을 선언하였다. 이전글을 살펴보면 clock이 어떻게 동작하는지 설명되어 있다.  1101 -> 1011 -> 0" data-og-host="jangdong.tistory.com" data-og-source-url="https://jangdong.tistory.com/36" data-og-url="..

Language/Verilog 2024.07.18

Vivado : Basys3 FND / 디지털 시계, 분주

□ 본 게시글은 수업 내용을 바탕으로 주관적으로 작성한 것이기 때문에, 틀리거나 오류가 있을 수 있습니다!!!  FND Control FND 출력을 링카운터를 활용해 시프트 동작을 시켜 1110 -> 1101 -> 1011 -> 0111과 같은 동작을 반복하려고 한다. 따라서 다음과 같은 코드를 작성하였다. 코드를 살펴보면, reset이 발생하였을 때 1110으로 초기화된 후, clk_div_nedge가 발생할 때마다 1을 1비트씩 옆으로 이동하도록 하였다. 옆으로 이동하는 동작은 "else com = {com [2:0], 1'b1};" 문장에서 실행이 된다.  module ring_counter_fnd2( input clk, reset_p, output reg [3:0] com); ..

Language/Verilog 2024.07.17
728x90