Language 51

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

Vivado : Basys3 7segment

이번에는 Basys3을 사용하여 7-segment를 제어하고자 한다. 7-segment의 구조는 아래와 같다.  4개의 스위치를 활용하여 4bit 스위치 역할을 수행하며, 세그먼트를 제어할 예정이다. 따라서 코드의 초반에는 '[3:0] hex_value'와 같이 선언하였다. 세그먼트 제어는 직관적으로 변경을 할 것이며, 따라서 비트를 하나하나 선언하여 변경할 것이다.세그먼트를 제어할 때에는 1이 주어지면 LED는 점등을 하며, 0이 주어질 시 꺼지는 동작을 수행한다.  구현된 코드는 아래와 같다.module decoder_7seg( input [3:0] hex_value, output reg [7:0] seg_7); always @(hex_value)begin case..

Language/Verilog 2024.07.16

Vivado : Edge Detector, Shift Register(SISO, SIPO, PISO, PIPO)

Edge Detector Positive Edge Detector Positive 동작은 아래의 그림으로 설명된다.  Clock이 인가되며, cp의 값이 1이 되는 동안 Clock가 posedge일 때 Current는 1이 된다.Current가 1인 동안 Clock이 posedge 되는 순간 old는 1로 변경된다. Positive Edge detector의 코드는 아래와 같다.module edge_detector_p( input clk, reset_p, input cp, output p_edge, n_edge); reg ff_cur, ff_old; //flip flop current always @(posedge clk or posedge reset_p)begin ..

Language/Verilog 2024.07.16

Vivado : 동기식 카운터

Positive 업 카운터module up_counter_p( input clk, reset_p, enable, output reg [3:0] count); always @(posedge clk or posedge reset_p)begin if(reset_p)count=0; else if(enable)count=count + 1; end endmodule Vivado에서는 C언어와 같이 증감 연산자를 사용할 수 없기 때문에 count = count + 1과 같이 코딩한다. 시뮬레이션을 진행할 때, Reset 값에 1을 인가한 뒤 0으로 인가해주어야만 정상적인 동작을 수행한다.Reset을 하지 않으면, 그전에 어떤 값이 들어있는지 모르기 때문..

Language/Verilog 2024.07.12

Vivado : Decoder, Encoder

이번에는 Vivado를 활용하여 디코더와 인코더를 구현해보려고 한다. 디코더먼저 구현해 볼 디코더는 2X4 디코더이다. 2X4 디코더는 2bit의 입력과 4bit의 출력을 가진다.2X4 디코더를 구현할 코드는 아래와 같다.module decoder_2X4_b( input [1:0] code, output reg [3:0] signal); always @(code)begin if(code == 2'b00) signal = 4'b0001; else if(code == 2'b01) signal = 4'b0010; else if(code == 2'b10) signal = 4'b0100; else if(code == 2'b11) signal = 4..

Language/Verilog 2024.06.25

혼공C : 배열, 대소문자 변환 프로그램

오늘은 혼공C 배열 파트의 도전 실전 예제를 풀어 볼 예정이다. 배열배열은 동일한 데이터형을 가진 변수들의 집합으로, 한 번에 여러 개의 변수를 선언하는 방법이다. 각각의 배열 요소들은 인덱스를 활용하여 접근할 수 있고, 인덱스는 0으로 시작한다. 예를 들어 ' arr '이라는 배열의 세 번째 요소에 접근하기 위해서는 ' arr [2] ' 와 같이 인덱스를 사용하면 된다. 또한, 배열은 선언과 동시에 초기화를 진행할 수 있으며, 초기화는 아래의 예시와 같이 중괄호 안에 요소를 나열하여 할 수 있다. int arr[5] = { 1, 2, 3, 4, 5}; 아래와 같이 배열 요소의 개수가 생략된 형태로도 초기화를 진행할 수 있다.int ary[] = { 1, 2, 3 } 추가로, 배열의 크기는 선언할 때 결..

Language/C 2024.06.20
728x90