[21] Verilog HDL 조합회로 설계과제 (Decoder, Encoder)UVM & RTL/Verilog HDL2022. 3. 5. 19:00
Table of Contents
★ Active-low enable신호를 갖는 4 : 2 이진 인코더를 다음의 방법으로 모델링하고 시뮬레이션을 통해 검증한다. enable신호가 0이면 인코더의 출력도 0이 되도록 한다.
① case문을 사용하는 방법
② if 조건문을 사용하는 방법
③ for 반복문을 사용하는 방법
// 설계과제 10.6
module en_encoder(en, a, y);
input en;
input [3:0] a;
output reg [1:0] y;
// 1. case문 사용.
always@(*)begin
if(!en) y=2'b0;
else begin
case(a)
4'b0001 : y = 2'b00;
4'b0010 : y = 2'b01;
4'b0100 : y = 2'b10;
4'b1000 : y = 2'b11;
default : y=2'bx;
endcase
end
end
// 2. if문 사용
always@(*)begin
if(!en) y =2'b0;
else begin
if(a==4'b0001) y = 2'b00;
else if(a==4'b0010) y = 2'b01;
else if(a==4'b0100) y = 2'b10;
else if(a==4'b1000) y = 2'b11;
else y = 2'bx;
end
end
// 3. for문 사용
integer i;
reg [3:0] temp;
always@(*)begin
if(!en) y=2'b0;
else begin
temp = 4'b0001;
y = 2'bx;
for(i=0;i<4;i=i+1)begin
if(a==temp) y = i;
temp = temp << 1;
end
end
end
endmodule
▣ TESTBENCH
// 설계과제 10.6 testbench
module tb_en_encoder;
reg en;
reg [3:0] a;
wire [1:0] y;
integer i;
en_encoder u0(en,a,y);
initial begin
a = 4'b0001;
en = 0;
#40 en = 1;
#40 en = 0;
#40 en = 1;
end
initial begin
for(i=1;i<17;i=i+1)begin
#20 a = i;
end
end
endmodule
★ Active-low enable신호를 갖는 4 : 2 우선순위 인코더를 다음의 방법으로 모델링하고, 시뮬레이션을 통해 검증한다. enable신호가 0이면 인코더의 출력도 0이 되도록 한다.
① case문을 사용하는 방법
② if 조건문을 사용하는 방법
③ for 반복문을 사용하는 방법
// 설계과제 10.7
module pri_en_encoder(en,a,y,valid);
input en;
input [3:0] a;
output reg [1:0] y;
output reg valid;
// 1. case문.
always@(*)begin
valid =1;
if(!en) y = 4'b0000;
else begin
casex(a)
4'b1xxx : y = 2'b11;
4'b01xx : y = 2'b10;
4'b001x : y = 2'b01;
4'b0001 : y = 2'b00;
default : begin
valid = 0;
y = 2'bx;
endcase
end
end
// 2. if문
always@(*)begin
valid =1 ;
if(!en) y =2'b0;
else begin
if(a==4'b1xxx) y = 2'b11;
else if(a==4'b01xx) y = 2'b10;
else if(a==4'b001x) y = 2'b01;
else if(a==4'b0001) y = 2'b00;
else begin
y = 2'bx;
valid = 0;
end
end
end
// 3. for문
integer i;
always@(*)begin : LOOP
valid = 0;
if(!en) y=2'b00;
else begin
y = 2'bx;
for(i=3;i>=0;i=i-1)begin
if(a[i]) begin
valid = 1;
y = i;
diable LOOP;
end
end
end
end
endmodule
▣ TESTBENCH
// 설계과제 10.7 testbench
module tb_en_encoder;
reg en;
reg [3:0] a;
wire [1:0] y;
wire valid
integer i;
en_encoder u0(en,a,y,valid);
initial begin
a = 4'b0001;
en = 0;
#40 en = 1;
#40 en = 0;
#40 en = 1;
end
initial begin
for(i=1;i<17;i=i+1)begin
#20 a = i;
end
end
endmodule
★ Active-high enable 신호를 갖는 3 : 6 디코더를 다음의 방법으로 모델링하고, 시뮬레이션을 통해 검증한다. enable신호가 0이면 입력에 무관하게 디코더 출력은 0이된다.
① if 조건문을 사용하는 방법
module dec_param(en,a,y);
parameter in_width =3 , out_width =6;
input en;
input [in_width-1:0] a;
output reg [out_width-1:0] y;
integer n;
always @(*) begin
if(!en) y=0;
else
if(a>out_width-1)
for(n=0;n<=out_width;n=n+1)
y[n] = 1'bx;
else
for(n=0;n<out_width;n=n+1)
if(a==n) y[n] = 1'b1;
else y[n] = 1'b0;
end
endmodule
② enable신호와 입력 a를 결합 연산자 { }로 묶어 case문의 조건으로 사용하는 방법
module dec_param(en,a,y);
input en;
input [2:0] a;
output reg [5:0] y;
wire temp;
assign temp = {en,a};
always@(*)begin
casex(temp)
4'b0xxx : y = 6'b0;
4'b1000 : y = 6'b000001;
4'b1001 : y = 6'b000010;
4'b1010 : y = 6'b000100;
4'b1011 : y = 6'b001000;
4'b1100 : y = 6'b010000;
4'b1101 : y = 6'b100000;
4'b1110 : y = 6'b000000;
4'b1111 : y = 6'b000000;
default : y=6'bx;
endcase
end
endmodule
▣ TESTBENCH
module tb_dec_param;
reg en;
reg [2:0] a;
wire [5:0] y;
integer n;
dec_param u0(en,a,y);
always begin
en=1;
for(n=0;n<8;n=n+1)begin
#20 a=n;
end
en=0;
for(n=0;n<8;n=n+1)begin
#20 a=n;
end
end
endmodule
'UVM & RTL > Verilog HDL' 카테고리의 다른 글
[23] Verilog HDL 순차회로 설계과제 (COMPARATOR, TRI-STATE) (0) | 2022.03.05 |
---|---|
[22] Verilog HDL 조합회로 구현 (COMPARATOR, TRI-STATE) (0) | 2022.03.05 |
[20] Verilog HDL 조합회로 구현 (ENCODER, DECODER) (0) | 2022.03.05 |
[19] Verilog HDL 조합회로 설계과제1 (NAND, NOR, BOOL, TRUTH TABLE, MUX) (0) | 2022.03.05 |
[18] Verilog HDL 조합회로 구현(NAND, NOR, BOOL, TRUTH TABLE, MUX) (0) | 2022.03.05 |
@Return :: Return
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!