일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- DenseDepth
- 왕실의기사대결
- 루돌프의반란
- dfs
- BFS
- ARM
- ros
- 코드트리빵
- 싸움땅
- 슈퍼컴퓨터클러스터
- 마법의숲탐색
- 순서대로방문하기
- 포탑부수기
- 삼성기출
- 조합
- 시뮬레이션
- 토끼와 경주
- 코드트리
- 나무박멸
- 수영대회결승전
- 백준
- Calibration
- ISER
- 소프티어
- 이진탐색
- 구현
- DP
- 3Dreconstruction
- ICER
- 마이크로프로세서
Archives
- Today
- Total
from palette import colorful_colors
[verilog] 16bit ALU구현 본문
add, sub, mux, div, mux41 모듈을 각각 구현하고 최종적으로 alu16 모듈에 합친 파일.
add, sub, mux, div, mix41이 alu16의 하위 모듈에 해당한다.
module add(out, a, b); //adder 모듈
input [15:0] a, b;
output [15:0] out;
assign out = a + b;
endmodule
module sub(out, a, b); //subtractor 모듈
input [15:0] a, b;
output [15:0] out;
assign out = a - b;
endmodule
module mul(out, a, b); //multiplyer 모듈
input [15:0] a, b;
output [15:0] out;
assign out = a * b;
endmodule
module div(out, a, b); //divider 모듈
input [15:0] a, b;
output [15:0] out;
assign out = a / b;
endmodule
module mux41(out, in0, in1, in2, in3, sel);
input [15:0] in0, in1, in2, in3;
input [1:0]sel;
output reg [15:0] out;
always @(*) begin //always문 안에는 모듈이 들어갈 수 없음!!!
case(sel)
2'b00 : out = in0;
2'b01 : out = in1;
2'b10 : out = in2;
2'b11 : out = in3;
endcase
end
endmodule
module test(out, ov, a, b);
input [3:0] a, b;
output [3:0] out;
output ov;
assign {ov, out} = a * b;
endmodule
module alu16 (out, a, b, sel);
input [15:0] a, b;
input [1:0] sel;
output [15:0] out;
wire [15:0] out0, out1, out2, out3; //add, sub, mul, div와 mux를 연결해줄 wire 선언
add u1 (.out(out0), .a(a), .b(b)); //
sub u2 (.out(out1), .a(a), .b(b)); //out1
mul u3 (.out(out2), .a(a), .b(b));
div u4 (.out(out3), .a(a), .b(b));
mux41 u5 (.out(out), .in0(out0), .in1(out1), .in2(out2), .in3(out3), .sel(sel));
// mux41 u5 (out, out0, out1, out2, out3, sel); 요렇게 불러와도 된다.
/* mux 모듈을 사용하지 않을 경우 (add~ div모듈만)
always @(*) begin //
!!!!!!always문 안에는 모듈이 들어갈 수 없음 참고!!!
case(sel)
2'b00 : out = out0;
2'b01 : out = out1;
2'b10 : out = out2;
2'b11 : out = out3;
endcase
end
*/
endmodule
/* //모듈들 없이 alu16만으로 코드 만드는 경우
always @(*) begin
case(sel)
2'b00 : out = a + b;
2'b01 : out = a - b;
2'b10 : out = a * b;
2'b11 : out = a / b;
endcase
end
*/
alu16_tb.v 파일
`timescale 1ns / 1ns
module alu16_tb;
integer i; //for문을 위해 integer 변수 선언
reg [3:0] a, b;
reg [1:0] sel;
wire [3:0] out;
wire ov;
//alu16 alu (.out(out), .a(a), .b(b), .sel(sel));
test u1 (out, ov, a, b);
initial begin
a = 16'd3; b = 16'd3; sel = 0;
#10 $finish;
//for(i = 1 ;i<20; i=i+1) #2 sel = $random;
end
initial begin
$dumpfile("output.vcd");
$dumpvars(0);
end
endmodule
'EE 학부과목 > verilog' 카테고리의 다른 글
[verilog] counter 구현 (0) | 2023.03.13 |
---|---|
[verilog] d-flipflop 구현 (0) | 2023.03.13 |
[verilog] 1:4 DEMUX 구현 (디멀티플렉서, Demultiplexer) (0) | 2023.03.13 |
[verilog] 4:1 MUX 구현 (멀티플렉서, multiplexer) (0) | 2023.03.13 |
[verilog] Full Adder, 4bit Adder 구현 (2) | 2023.03.13 |