반가산기
전가산기
4bit 전가산기
4bit Full Subtractor
Comparator
2x4 디코더
enable 신호가 들어올 때 동작하는 decoder
3x8 decoder
4x16 decoder
`timescale 1ns / 1ps
// 반가산기 모듈 정의
module half_adder(
input a, b, // 입력 비트
output sum, carry // 합과 자리올림 비트 출력
);
assign sum = a ^ b; // XOR 연산을 통한 합
assign carry = a & b; // AND 연산을 통한 자리올림
endmodule
// 반가산기 동작 모델링
module halfadder_behaviors(
input a, b, // 입력 비트
output reg s, c // reg 선언을 통한 동작 모델링
);
always @(a, b) begin
case ({a, b})
2'b00: begin s = 0; c = 0; end
2'b01: begin s = 1; c = 0; end
2'b10: begin s = 1; c = 0; end
2'b11: begin s = 0; c = 1; end
endcase
end
endmodule
// 전가산기 구조적 모델링
module fulladder_structural(
input a, b, cin, // 입력 비트와 자리올림 입력
output sum, carry // 합과 자리올림 비트 출력
);
wire sum_0, carry_0, carry_1; // 내부 와이어 선언
// 반가산기 인스턴스화
half_adder ha0 (.a(a), .b(b), .sum(sum_0), .carry(carry_0));
half_adder ha1 (.a(sum_0), .b(cin), .sum(sum), .carry(carry_1));
// OR 게이트를 통한 자리올림 계산
or(carry, carry_0, carry_1);
endmodule
// 전가산기 데이터 모델링
module full_adder(
input a, b, cin, // 입력 비트와 자리올림 입력
output sum, carry // 합과 자리올림 비트 출력
);
assign #2 sum = a ^ b ^ cin; // XOR 연산을 통한 합
assign #3 carry = (cin & (a ^ b)) | (a & b); // AND, OR 연산을 통한 자리올림
endmodule
// 4비트 가산기 구조적 모델링
module fadder_4bit_s(
input [3:0] a, b, // 4비트 입력
input cin, // 자리올림 입력
output [3:0] sum, // 4비트 합 출력
output carry // 출력 자리올림
);
wire [2:0] carry_in; // 내부 와이어 선언
// 전가산기 인스턴스화
full_adder fa0 (.a(a[0]), .b(b[0]), .cin(cin), .sum(sum[0]), .carry(carry_in[0]));
full_adder fa1 (.a(a[1]), .b(b[1]), .cin(carry_in[0]), .sum(sum[1]), .carry(carry_in[1]));
full_adder fa2 (.a(a[2]), .b(b[2]), .cin(carry_in[1]), .sum(sum[2]), .carry(carry_in[2]));
full_adder fa3 (.a(a[3]), .b(b[3]), .cin(carry_in[2]), .sum(sum[3]), .carry(carry));
endmodule
// 4비트 가산기 데이터 모델링
module fadder_4bit(
input [3:0] a, b, // 4비트 입력
input cin, // 자리올림 입력
output [3:0] sum, // 4비트 합 출력
output carry // 출력 자리올림
);
wire [4:0] temp; // 내부 와이어 선언
// 합과 자리올림 계산
assign temp = a + b + cin;
assign sum = temp[3:0];
assign carry = temp[4];
endmodule
// 4비트 가산기/뺄셈 구조적 모델링
module fadd_sub_4bit_s(
input [3:0] a, b, // 4비트 입력
input s, // 덧셈(0) 또는 뺄셈(1) 선택 신호
output [3:0] sum, // 4비트 합 출력
output carry // 출력 자리올림
);
wire [2:0] carry_in; // 내부 와이어 선언
// 전가산기 인스턴스화
full_adder fa0 (.a(a[0]), .b(b[0] ^ s), .cin(s), .sum(sum[0]), .carry(carry_in[0]));
full_adder fa1 (.a(a[1]), .b(b[1] ^ s), .cin(carry_in[0]), .sum(sum[1]), .carry(carry_in[1]));
full_adder fa2 (.a(a[2]), .b(b[2] ^ s), .cin(carry_in[1]), .sum(sum[2]), .carry(carry_in[2]));
full_adder fa3 (.a(a[3]), .b(b[3] ^ s), .cin(carry_in[2]), .sum(sum[3]), .carry(carry));
endmodule
// 4비트 가산기/뺄셈 데이터 모델링
module fadd_sub_4bit(
input [3:0] a, b, // 4비트 입력
input s, // 덧셈(0) 또는 뺄셈(1) 선택 신호
output [3:0] sum, // 4비트 합 출력
output carry // 출력 자리올림
);
wire [4:0] temp; // 내부 와이어 선언
// 덧셈 또는 뺄셈 결과 계산
assign temp = s ? a - b : a + b;
assign sum = temp[3:0];
assign carry = temp[4];
endmodule
// 4비트 비교기 모듈 정의
module comparator #(parameter N = 4)(
input [N-1:0] a, b, // 비교할 입력 비트
output equal, greater, less // 결과 비트 출력
);
// 결과 비교
assign equal = (a == b) ? 1'b1 : 1'b0;
assign greater = (a > b) ? 1'b1 : 1'b0;
assign less = (a < b) ? 1'b1 : 1'b0;
endmodule
// 2-4 디코더 (case 문 사용)
module decoder_2_4_case(
input [1:0] a, // 2비트 입력
output reg [3:0] y // 4비트 출력
);
always @(a) begin
case (a)
2'b00: y = 4'b0001;
2'b01: y = 4'b0010;
2'b10: y = 4'b0100;
2'b11: y = 4'b1000;
endcase
end
endmodule
// 2-4 디코더 (if 문 사용)
module decoder_2_4_if(
input [1:0] a, // 2비트 입력
output reg [3:0] y // 4비트 출력
);
always @(a) begin
if (a == 2'b00) y = 4'b0001;
else if (a == 2'b01) y = 4'b0010;
else if (a == 2'b10) y = 4'b0100;
else y = 4'b1000;
end
endmodule
// 2-4 디코더 (data flow)
module decoder_2_4(
input [1:0] a, // 2비트 입력
output [3:0] y // 4비트 출력
);
// 조건 연산자를 통한 디코딩
assign y = (a == 2'b00) ? 4'b0001 : (a == 2'b01) ? 4'b0010 : (a == 2'b10) ? 4'b0100 : 4'b1000;
endmodule
// 2-4 디코더 (enable 기능 추가)
module decoder_2_4_en(
input [1:0] a, // 2비트 입력
input en, // 활성화 신호
output [3:0] y // 4비트 출력
);
// 활성화 신호에 따라 출력 결정
assign y = (~en) ? 4'b0000 : (a == 2'b00) ? 4'b0001 : (a == 2'b01) ? 4'b0010 : (a == 2'b10) ? 4'b0100 : 4'b1000;
endmodule
// 3-8 디코더 (enable 기능 추가)
module decoder_3_8_1(
input [2:0] a, // 3비트 입력
input en, // 활성화 신호
output reg [7:0] y // 8비트 출력
);
always @(a) begin
if (en) begin
case (a)
3'b000: y = 8'b0000_0001;
3'b001: y = 8'b0000_0010;
3'b010: y = 8'b0000_0100;
3'b011: y = 8'b0000_1000;
3'b100: y = 8'b0001_0000;
3'b101: y = 8'b0010_0000;
3'b110: y = 8'b0100_0000;
3'b111: y = 8'b1000_0000;
endcase
end
else
y = 0;
end
endmodule
// 4-16 디코더 (enable 기능 추가)
module decoder_4_16_1(
input en, // 활성화 신호
input [3:0] a, // 4비트 입력
output [15:0] y // 16비트 출력
);
wire [7:0] y1; // 내부 와이어 선언
wire [15:8] y2; // 내부 와이어 선언
assign y = (en == 1'b1) ? ({y1, 8'b0}) : ({8'b0, y2});
// 하위 8비트 디코더
decoder_3_8_1 copy1 (.a(a), .y(y1));
// 상위 8비트 디코더
decoder_3_8_1 copy2 (.a(a), .y(y2));
endmodule
'VERILOG' 카테고리의 다른 글
Check the status of your licenses in the Vivado License Manager error (1) | 2024.02.27 |
---|---|
Verilog - Sequential logic code(rs_latch,D_flipflop,T_flipflop,counter,ring_counter,edge_detector,fsm_led,SISO,PISO,SIPO,Shift_register,sram_8bit)순차논리회로 (0) | 2024.02.14 |
Verilog - DSP FIR Lowpass Filter(2MHz + 30MHz sin PHASE) (0) | 2024.02.13 |
Verilog HDL 문법2 (0) | 2024.02.02 |
조합논리회로 코드모음 (0) | 2024.02.02 |