Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- Edge Detector
- pwm
- soc 설계
- atmega 128a
- hc-sr04
- LED
- structural modeling
- KEYPAD
- dataflow modeling
- Recursion
- Algorithm
- i2c 통신
- Linked List
- uart 통신
- stop watch
- D Flip Flop
- behavioral modeling
- half adder
- ATMEGA128A
- test bench
- FND
- java
- vivado
- DHT11
- prescaling
- verilog
- ring counter
- BASYS3
- Pspice
- gpio
Archives
- Today
- Total
거북이처럼 천천히
Verilog RTL 설계 (6월 24일 - 1) 본문
1. 인코더 (Encoder)
- 2^n bit 크기를 갖는 2진 코드로 표현된 신호를 입력받아 Encoder를 거쳐 n bit 크기를 갖는 2진 코드로 표현된 코드를 출력으로 내보낸다.
- 즉, 2^n bit 입력을 가지고 n bit 출력을 생성시키는 장치이다.
- 주로 데이터를 압축하여 전송 효율을 높이거나, 다양한 센서 신호를 디지털 변환하여 처리할 때 사용
2. 디코더 (Decoder)
- n bit의 2진 코드를 입력으로 받아 Decoder를 통해 디코딩하여 2^n bit의 2진 코드 신호로 바꿔주는 조합논리회로 (Combinational Logic Circuit)
- Encoder를 통해 전달 받은 n bit 데이터를 2^n bit 데이터로 변환한다.
3. 2 X 4 Decoder 구현
- 2 X 4 Decoder의 진리표와 게이트 회로 구성은 다음과 같다.
- 2 bit 크기의 데이터(2진 코드)를 입력을 받은 뒤, 4bit 크기의 데이터(2진 코드)를 출력으로 내보낸다.
- 2 X 4 Decoder의 Truth table를 통해 알 수 있듯이 출력 값은 4bit 중에서 단 1bit에서만 True이고, 나머지 bit는 False 값을 갖는다.
- 즉, 4bit 중에서 동시에 여러 bit에서 True 일 수 없다.
3.1. Behavioral Modeling of 2 X 4 Decoder (by using if - else)
<Source code>
// Behavioral Modeling of 2X4 Decoder (if - else문)
module Decoder_2X4_Behavioral_Modeling_if_else(
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'b1000;
end
endmodule
<Simulation>
<Analysis>
- 소스 코드에 대해서 분석을 하면 다음과 같다.
- Behavioral modeling은 if - else, case 문을 통해 표현할 수 있으며, 위 코드는 if - else문으로 구현
- code 값에 따라 출력 값인 signal 값 변화한다.
- always 블록 내에서 signal 값이 l-value로 사용되기 때문에 자료형이 wire형이 아닌 reg형이여야 한다. - 시뮬레이션 결과, 위 2X4 Decoder의 진리표 대로 출력값이 나오는 것을 확인할 수 있다.
- 출력 값은 4bit으로 이루어져 있지만, 동시 2개의 비트에서 True일 수 없다.
( 수업 시간에 예시로 들었던 "왜구가 처들어왔다 + 왜구가 후퇴했다."를 생각하자.)
3.2. Behavioral Modeling of 2 X 4 Decoder (by case)
<Source code>
module Decoder_2X4_Behavioral_Modeling_case(
input [1:0] code,
output reg [3:0] signal );
always @(code) begin
case(code)
2'b00 : signal = 4'b0001;
2'b01 : signal = 4'b0010;
2'b10 : signal = 4'b0100;
2'b11 : signal = 4'b1000;
endcase
end
endmodule
<Simulation>
<Analysis>
- 소스 코드에 대해서 분석을 하면 다음과 같다.
- Behavioral modeling은 if - else, case 문을 통해 표현할 수 있으며, 위 코드는 case문으로 구현
- always 블록 내에서 signal 값이 l-value로 사용되기 때문에 자료형이 wire형이 아닌 reg형이여야 한다. - 나머지 시뮬레이션 결과는 if-case문으로 구현했을 때와 동일한 출력 값을 얻는다.
3.3. Behavioral modeling으로 구현 시, 주의사항
- 위 Behavioral modeling 구현은 모든 입력에 대해서 출력을 정의했기 때문에 예상에서 벗어난 출력 값이 발생하는 상황은 발생하지 않는다.
- 만약, 모든 입력 값에 대해서 출력 값을 정의하지 않는다면 이를 대비하기 위해서 if - else문에서는 else, case 문에서는 default 를 정의해야한다.
- 하지만, if - else문에서는 else, case 문에서는 default 를 통해 명시적으로 정의하지 않는다면 Verilog는 이러한 상황을 어떻게 처리할지를 결정해야 하는데, 이 때 일반적으로 D Latch가 생성한다.
- 하지만, 이렇게 생성된 D Latch는 예기치 못한 문제를 발생시킬 수 있는데, 이에 대한 내용은 Latch와 Flip-Flop을 정리하면서 같이 정리하겠다.
- 여기서는 "최대한 if - else문에서는 else, case문에서는 default를 작성하도록 하자"로 기억하자.
- 따라서 위 코드를 다시 수정하면 다음과 같다.
< Behavioral Modeling of 2 X 4 Decoder (by using if - else) >
// Behavioral Modeling of 2X4 Decoder (if - else문)
module Decoder_2X4_Behavioral_Modeling_if_else(
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'b1000;
else signal = signal;
end
endmodule
< Behavioral Modeling of 2 X 4 Decoder (by case) >
module Decoder_2X4_Behavioral_Modeling_case(
input [1:0] code,
output reg [3:0] signal );
always @(code) begin
case(code)
2'b00 : signal = 4'b0001;
2'b01 : signal = 4'b0010;
2'b10 : signal = 4'b0100;
2'b11 : signal = 4'b1000;
default : signal = signal;
endcase
end
endmodule
- 위 소스 코드들은 예외의 입력이 들어오면 이전 출력 값을 그대로 출력시키도록 설계
3.4. Dataflow Modeling of 2 X 4 Decoder
<Source code>
module Decoder_2X4_Dataflow_Modeling(
input [1:0] code,
output [3:0] signal);
assign signal = (code == 2'b00)? 4'b0001 :
((code == 2'b01)? 4'b0010 :
((code == 2'b10)? 4'b0100 :
((code == 2'b11)? 4'b1000 : 4'b0000)));
endmodule
<Simulation>
<Analysis>
- 소스 코드에 대해서 분석을 하면 다음과 같다.
- code 값에 따라 출력 값인 signal 을 정의하기 위해 조건 연산자를 사용했다.
- 그러나 병렬 형태(?)로 조건 연산자를 사용해도 되지만, 조건 연산자의 False 영역에 또 다른 조건 연산자를 정의함으로서 조건 연산자의 조건문에 False 영역에 있는 조건 연산자가 실행되도록 설계
- 이는 마치 if - else if - else문과 유사하다.
- 그리고, 예기치 못한 입력이 들어올 경우를 대비하여 그러한 입력 값이 들어오면 4'b0000 값이 출력되도록 설계 - 시뮬레이션 결과는 Behavioral modeling과 동일하다.
4. 4 X 2 Encoder 구현
- 4 X 2 Encoder의 Truth table은 다음과 같다.
- 아래 진리표에서 볼 수 있듯이 4bit 입력 데이터에서 동시에 2bit 이상에서 True인 경우는 없다.
4.1. Behavioral Modeling of 2 X 4 Encoder ( if - else 문)
<Source code>
module Encoder_4X2_Behavioral_Modeling_if_else(
input [3:0] signal,
output reg [1:0] code );
always @(signal) begin
if(signal == 4'b0001) code = 2'b00;
else if(signal == 4'b0010) code = 2'b01;
else if(signal == 4'b0100) code = 2'b10;
else if(signal == 4'b1000) code = 2'b11;
else code = 2'b00;
end
endmodule
<Simulation>
<Analysis>
- 소스 코드에 대해서 분석을 하면 다음과 같다.
- 4bit 입력 데이터가 들어오면 진리표에 의해 2bit 출력 데이터를 출력한다.
- 입력 데이터는 4bit이기 때문에 이를 통해 구현할 수 있는 경우의 수는 총 16가지이다.
- 하지만, 우리가 입력 - 출력으로 정의한 경우의 수는 총 4가지 이기 때문에 12가지 입력이 들어올 경우에 대해서도 대비를 해야한다.
- 이를 위해 else 문을 통해 12가지 입력이 들어오면 2'b00이 출력 되도록 설계 했다.
- always문에서 code 변수는 l-value로 활용되기 때문에 wire형이 아닌 reg형으로 자료형 변환했다. - 시뮬레이션에 대한 분석은 다음과 같다.
- 진리표 대로 입력 값에 대한 출력이 발생하는 것을 확인했다.
- 또한 예기치 못한 입력 (4'b1111)에 대해서 2'b00 이 출력되도록 설계했는데, 이론대로 출력되는것을 확인했다.
4.2. Behavioral Modeling of 2 X 4 Encoder ( case 문)
<Source code>
module Encoder_4X2_Behavioral_Modeling_case(
input [3:0] signal,
output reg [1:0] code );
always @(signal) begin
case (signal)
4'b0001 : code = 2'b00;
4'b0010 : code = 2'b01;
4'b0100 : code = 2'b10;
4'b1000 : code = 2'b11;
default code = 2'b00;
endcase
end
endmodule
<Simulation>
<Analysis>
- 소스 코드에 대해서 분석을 하면 다음과 같다.
- 입력 데이터는 4bit이기 때문에 이를 통해 구현할 수 있는 경우의 수는 총 16가지이다.
- 하지만, 우리가 입력 - 출력으로 정의한 경우의 수는 총 4가지 이기 때문에 12가지 입력이 들어올 경우에 대해서도 대비를 해야한다.
- 이를 위해 default 문을 통해 12가지 입력이 들어오면 2'b00이 출력 되도록 설계 했다.
- always문에서 code 변수는 l-value로 활용되기 때문에 wire형이 아닌 reg형으로 자료형 변환했다. - 시뮬레이션에 대한 분석은 다음과 같다.
- 예기치 못한 입력 (4'b1100)에 대해서 출력 (2'b00)이 되는 것을 확인함으로서 이론되도록 동작한다는 것을 확인
4.3. Dataflow Modeling of 2 X 4 Encoder
<Source code>
module Encoder_4X2_DataFlow_Modeling(
input [3:0] signal,
output [1:0] code );
assign code = (signal == 4'b0001)? 2'b00 :
((signal == 4'b0010)? 2'b01 :
((signal == 4'b0100)? 2'b10 :
((signal == 4'b1000)? 2'b11 : 2'b00)));
endmodule
<Simulation>
<Analysis>
- 소스 코드에 대해서 분석을 하면 다음과 같다.
- Dataflow modeling 으로 설계하였다.
- 예외 입력 12가지에 대해서 대비하기 위해서 마지막에 2'b00이 출력되도록 설계했다.
- 조건 연산자의 False문안에 조건 연산자를 설계함으로서 if - else if - else 문과 유사하게 설계했다. - 시뮬레이션에 대한 분석은 다음과 같다.
- 예기치 못한 입력 (4'b1010)에 대해서 출력 (2'b00)이 되는 것을 확인함으로서 이론되도록 동작한다는 것을 확인
'RTL Design > Verilog RTL 설계' 카테고리의 다른 글
Verilog RTL 설계 (6월 24일 - 3) (0) | 2024.06.25 |
---|---|
Verilog RTL 설계 (6월 24일 - 2) (0) | 2024.06.25 |
Verilog RTL 설계 (6월 13일 - 5) (1) | 2024.06.15 |
Verilog RTL 설계 (6월 13일 - 4) (1) | 2024.06.15 |
Verilog RTL 설계 (6월 13일 - 3) (1) | 2024.06.15 |