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 | 29 | 30 | 31 |
Tags
- vivado
- BASYS3
- behavioral modeling
- KEYPAD
- Algorithm
- gpio
- test bench
- prescaling
- verilog
- atmega 128a
- pwm
- DHT11
- hc-sr04
- Linked List
- FND
- half adder
- soc 설계
- LED
- dataflow modeling
- ring counter
- ATMEGA128A
- D Flip Flop
- stop watch
- structural modeling
- i2c 통신
- Pspice
- Edge Detector
- uart 통신
- java
- Recursion
Archives
- Today
- Total
거북이처럼 천천히
4 bit parallel adder / subtractor 본문
1. Structural Modeling of 4 bit parallel adder / subtractor
<Source>
// Behavioral Modeling of and gate.
module and_gate (
input a, b,
output reg out);
always @(a, b) begin
case({a, b})
2'b00 : out = 0;
2'b01 : out = 0;
2'b10 : out = 0;
2'b11 : out = 1;
endcase
end
endmodule
// Behavioral Modeling of xor gate
module xor_gate (
input a, b,
output reg out);
always @(a, b) begin
case({a, b})
2'b00 : out = 0;
2'b01 : out = 1;
2'b10 : out = 1;
2'b11 : out = 0;
endcase
end
endmodule
// Behavioral Modeling of or age
module or_gate (
input a, b,
output reg out);
always @(a, b) begin
case({a, b})
2'b00 : out = 0;
2'b01 : out = 1;
2'b10 : out = 1;
2'b11 : out = 1;
endcase
end
endmodule
// Structural Modeling of half adder
module half_adder (
input a, b,
output sum, carry);
and_gate and0 (a, b, carry);
xor_gate xor0 (a, b, sum);
endmodule
// Structural Modeling of full adder
module full_adder (
input a, b, Cin,
output sum, carry);
wire sum_0, carry_0, carry_1;
half_adder half0 (a, b, sum_0, carry_0);
half_adder half1 (Cin, sum_0, sum, carry_1);
or_gate (carry_0, carry_1, carry);
endmodule
// Structural Modeling of 4 bit parallel adder / Substructor
module Parallel_4bit_adder_subtractor_Structural_Modeling(
input [3:0] a, b,
input Cin,
output [3:0] sum,
output carry );
wire [3:0] invert_b;
xor_gate xor0 (Cin, b[0], invert_b[0]);
xor_gate xor1 (Cin, b[1], invert_b[1]);
xor_gate xor2 (Cin, b[2], invert_b[2]);
xor_gate xor3 (Cin, b[3], invert_b[3]);
wire [2:0] carry_full_adder;
full_adder full_adder0 (a[0], invert_b[0], Cin, sum[0], carry_full_adder[0]);
full_adder full_adder1 (a[1], invert_b[1], carry_full_adder[0], sum[1], carry_full_adder[1]);
full_adder full_adder2 (a[2], invert_b[2], carry_full_adder[1], sum[2], carry_full_adder[2]);
full_adder full_adder3 (a[3], invert_b[3], carry_full_adder[2], sum[3], carry);
endmodule
<Simulation>
<RTL Analysis>
<Synthesis>
2. Dataflow Modeling of 4 bit parallel adder / subtractor
<Source>
// Dataflow Modeling of 4bit parallel adder / subtractor.
module Parallel_4bit_adder_subtractor_Dataflow_Modeling(
input [3:0] a, b,
input Cin,
output [3:0] sum,
output carry );
wire[4:0] result = (Cin)? a - b : a + b;
assign sum = result[3:0];
assign carry = result[4];
// assign carry = (Cin)? ~result[4] : result[4];
endmodule
<Simulation>
<RTL Analysis>
<Synthesis>
3. Behavioral Modeling of 4 bit parallel adder / subtractor
- 입력 데이터 : 4 bit 크기를 갖는 a, b와 1 bit 크기를 갖는 Cin
- 따라서 모든 경우의 수를 따져보기 위해서는 총 2^9 = 512가지의 입력 값을 줘야 한다.
- 그런데, 512가지의 입력에 대해서 출력을 정의하는 것은 힘들기 때문에 해당 설계 방식은 넘어간다.
4. 여담) Dataflow Modeling은 32bit 데이터 기준으로 연산하기 때문에 5번째 비트의 Carry 값이 다르다.
- Dataflow Modeling에서도 5번찌 비트의 Carry 값을 Structural Modeling과 맞춰주기 위해서는 추가적인 작업이 필요하다.
- 따라서 아래와 같이 코드를 수정한다면 5번째 비트의 값을 동일하게 맞춰줄 수 있다.
// Dataflow Modeling of 4bit parallel adder / subtractor.
module Parallel_4bit_adder_subtractor_Dataflow_Modeling(
input [3:0] a, b,
input Cin,
output [3:0] sum,
output carry );
wire[4:0] result = (Cin)? a - b : a + b;
assign sum = result[3:0];
assign carry = (Cin)? ~result[4] : result[4];
endmodule
5. Dataflow Modeling에서는 if 문을 사용할 수 없다.
- Dataflow Modeling 4bit parallel adder / subtractor를 설계하는 과정에서 if문을 사용했는데, if문을 포함하고 있는 명령문에서 문제가 발생했다.
// Dataflow Modeling of 4bit parallel adder / subtractor.
module Parallel_4bit_adder_subtractor_Dataflow_Modeling(
input [3:0] a, b,
input Cin,
output [3:0] sum,
output carry );
wire[4:0] result;
if(Cin) assign result = a - b;
else assign result = a + b;
endmodule
- Dataflow Modeling에서 if문을 사용할 수 없는 이유는 다음과 같다.
- Dataflow Modeling은 병렬적으로 처리한다. 즉, 입력값의 변화가 발생하면 모든 할당문을 병렬적으로 동시에 처리한다.
- 그러나 if문은 위에서부터 순차적으로 처리한다.
- 이는 병렬 처리를 하는 Dataflow Modeling의 특성과 맞지않기 때문에 Dataflow Modeling에서는 if문을 사용할 수 없고, 대신 삼항 연산자인 조건 연산자를 사용할 수 있다. - 따라서 조건 연산자로 다시 표현하면 다음과 같다.
// Dataflow Modeling of 4bit parallel adder / subtractor.
module Parallel_4bit_adder_subtractor_Dataflow_Modeling(
input [3:0] a, b,
input Cin,
output [3:0] sum,
output carry );
wire[4:0] result = (Cin)? a - b : a + b;
endmodule
'RTL Design > Verilog 연습' 카테고리의 다른 글
4 bit Comparator / 32 bit Comparator (0) | 2024.06.30 |
---|---|
1 bit Comparator (0) | 2024.06.30 |
4 bit parallel adder (0) | 2024.06.30 |
Full adder (0) | 2024.06.29 |
Half adder (0) | 2024.06.29 |