일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- ros
- 조합
- dfs
- 왕실의기사대결
- 이진탐색
- DP
- 삼성기출
- 구현
- 슈퍼컴퓨터클러스터
- 수영대회결승전
- 소프티어
- 3Dreconstruction
- 토끼와 경주
- 시뮬레이션
- 코드트리
- 포탑부수기
- ICER
- BFS
- Calibration
- 마이크로프로세서
- 순서대로방문하기
- 나무박멸
- ARM
- 백준
- 마법의숲탐색
- 싸움땅
- ISER
- DenseDepth
- 루돌프의반란
- 코드트리빵
Archives
- Today
- Total
from palette import colorful_colors
[verilog] Full Adder, 4bit Adder 구현 본문
fa.v 파일 (full adder)
module fa(s, cout, a, b, cin); //full adder 모듈
input a, b, cin;
output s, cout;
assign {cout, s} = a + b + cin; //시스템 내의 full adder 계산
endmodule
/*
다르게 짜는 방법 1
module fa(s, cout, a, b, cin);
input a, b, cin;
output s, cout;
wire w1, w2, w3;
xor u1 (w1, a, b);
and u2 (w2, a, b);
xor u3 (s, w1, cin);
and u4 (w3, w1, cin);
or u5 (cout, w3, w2);
endmodule
*/
/*
다르게 짜는 방법 2
module fa(s, cout, a, b, cin);
assign s = (a^b)&cin;
assign cout = (a&b)|((a^b)&(cin));
endmodule
*/
add4bit.v 파일 (fa.v에서 만든 full adder를 가져와 4비트 덧셈기를 만든다)
module add4bit(s, cout, a, b); //4bit Adder 모듈
input [3:0]a, b;
output [3:0]s;
output cout;
wire c0, c1, c2;
//reg cin = 1'b0; //맨 처음 들어오는 carry는 0
fa fa1 (s[0], c0, a[0], b[0], 0); //FA1
fa fa2 (s[1], c1, a[1], b[1], c0); //FA2
fa fa3 (s[2], c2, a[2], b[2], c1); //FA3
fa fa4 (s[3], cout, a[3], b[3], c2); //FA4
endmodule
/* 다르게 짜는 방법:
module add4b1(a, b, sum, cout);
input [3:0] a, b;
output [3:0] sum;
output cout;
wire [4:0] sum1; sum1 vector 새로 정의
assign sum1 = a + b;
assign cout = sum1[4]; sum1의 최상위 비트만 저장
assign sum1 = sum1[3:0]; sum1에는 [3:0]까지만 저장
endmodule
*/
add4_tb.v 파일
module add4_tb(); //testbench에는 cin(carry in)을 넣지 않았다.
reg [3:0] a;
reg [3:0] b;
wire [3:0] s_0609;
wire cout;
add4bit u1 (.s(s_0609), .cout(cout), .a(a), .b(b));
initial begin
a=4'b0000;
b=4'b0000;
#32 $finish; //16번 always문 반복하고 종료
end
always begin //2ns마다 a와 b는 0000~1111 중 random하게 바뀐다.
#2 a = $urandom%4'b1111;
end
always begin
#2 b = $urandom%4'b1111;
end
always @(a or b) begin //cmd창에서 출력
$monitor("%d + %d -> sum: %d, carryout: %b", a, b, s_0609, cout);
end
initial begin
$display("%m");
$display("---------4bit adder test---------");
$dumpfile("output.vcd");
$dumpvars(0);
end
endmodule
/* 다르게 짠 코드
module add4_tb();
reg [3:0] a, b;
wire [3:0] sum1, sum2;
wire cout1, cout2;
add4b1 u1(a, b, sum1, cout1);
initial begin
a = 0; b=0;
#20 $finish;
end
always begin
# 1 a = $random; b = $random;
end
initial begin
$dumpfile("output.vcd");
$dumpvars(0);
end
endmodule
*/
'EE 학부과목 > verilog' 카테고리의 다른 글
[verilog] 1:4 DEMUX 구현 (디멀티플렉서, Demultiplexer) (0) | 2023.03.13 |
---|---|
[verilog] 4:1 MUX 구현 (멀티플렉서, multiplexer) (0) | 2023.03.13 |
[verilog] NAND 구현 (0) | 2023.03.13 |
[verilog] inverter(인버터), bufer(버퍼) (0) | 2023.03.13 |
[verilog] 논리회로설계의 시작, verilog 설치와 문법 기초 (0) | 2023.03.13 |