설계, 가산기, 디코더, 인코더, 스위칭 인코더
2023. 6. 8. 09:53ㆍ[Harman] 세미콘(semiconductor) 아카데미-반도체설계/Verilog를 이용한 RTL 시스템 반도체 설계
728x90
Xilinx ISE Design Suite를 이용한 schematic 설계
- 구조적 기술
- 컴포넌트 간의 접속
- 동작적 기술
- 알고리즘 기술
- 데이터 흐름 기술
구조적 기술 + 동작적 기술 => 물리적 구현
- wire
회로에서 물리적인 연결선 나타낸다. 게이트 또는 모듈을 연결, function, block에서 일을 수 있지만 값을 할당받지는 못하며 저장도 못한다.
- reg
프로시저 할당문에서 값을 저장,function, always와 같은 프로시저 블록에서만 사용가능.
- procedural(blocking) assignment (=)
- always와 같은 프로시저에서 reeg변수와 integer에만 할당
- 변수a에서 b를 통해 c로 전다될 때 세 변수가 동시에 같은 값을 가짐, 한클럭에서 세 변수에 모두 전달, 문장의 나열 순서에 영향을 받지 않는다.
- RTL nonblocking assignment (<=)
- 한 클럭에 a에서 b로 전달되고,. 다음클럭에선 b에서 c로 전달된다.
- always 블럭
- RTL 모델링의 기본적인 구조체이며, 한 module은 여러 개 always 블록을 포함 가능
- 각 always 블록이 연속 할당문 처럼 동시에 실행
- 래치. 플립플롭, 조합논리회로의 동작을 표현
- always 블록 형식
- 전가산기
진리표를 Verilog형식으로 표현
- 간소화 과정이 필요 없으므로 설계 시간 감소. 간소화 오류를 없앰
- 진리표를 작성하며, 입력이 많아지면 코드의 길이 증가
설계는
- 진리표를 이용한 설계
- 논리식 유도를 이용한 설계
가 존재.
//진리표를 이용한 설계
module full_adder(x,y,z,S,C);
input x,y,z;
output S,C;
reg S,C;
wire [2:0] k;
assign k = {x,y,z};
always @ (k)
begin
case(k)
3'b000 : begin
S <= 1'b0;
C <= 1'b0;
end
3'b001 : begin
S <= 1'b1;
C <= 1'b0;
end
3'b001 : begin
S <= 1'b1;
C <= 1'b0;
end
3'b011 : begin
S <= 1'b0;
C <= 1'b1;
end
3'b100 : begin
S <= 1'b1;
C <= 1'b0;
end
3'b101 : begin
S <= 1'b0;
C <= 1'b1;
end
3'b110 : begin
S <= 1'b0;
C <= 1'b1;
end
3'b111 : begin
S <= 1'b1;
C <= 1'b1;
end
endcase
end
endmodule
//논리식을 이용한 Verilog 표현
module full_adder(x,y,z,S,C);
input x,y,z;
output S,C;
assign S = (~x&~y&z) | (~x&y&~z) | (x&~y&~z) | (x&y&z);
assign C = (x&y) | (x&z) | (y&z);
endmodule
- 진리표를 작성하거나 논리식을 세우는 과정이 없으므로 시간을 줄이고 설계과정에서 오류가 발생할 확률도 감소
- 가산기의 입력 비트가 증가해도 코드의 길이는 증가하지 않음
- 디코더
n개의 입력을 받아서 최대 2^n개의 최소항을 발생시키는 회로
//디코더 코드
module decoder(x, D, en);
input [2:0] x;
input en;
output [7:0] D;
reg [7:0] D;
always @ (en or x)
begin
D = 8'h00;
if(en) begin
case (x)
3'h0 : D = 8'h01;
3'h1 : D = 8'h02;
3'h2 : D = 8'h04;
3'h3 : D = 8'h08;
3'h4 : D = 8'h10;
3'h5 : D = 8'h20;
3'h6 : D = 8'h40;
3'h7 : D = 8'h80;
endcase
end
end
endmodule
// 테스트벤치 코드
module decoder_tb;
// 모듈 인스턴스화
decoder dut (
.x(x),
.en(en),
.D(D)
);
// 입력 신호 선언
reg [2:0] x;
reg en;
// 출력 신호 선언
wire [7:0] D;
// 테스트 시나리오
initial begin
// 입력 값 설정
x = 3'b000;
en = 0;
// 0 입력에 대한 시뮬레이션
#10;
x = 3'b000;
en = 1;
#10;
en = 0;
// 1 입력에 대한 시뮬레이션
#10;
x = 3'b001;
en = 1;
#10;
en = 0;
// 2 입력에 대한 시뮬레이션
#10;
x = 3'b010;
en = 1;
#10;
en = 0;
// 3 입력에 대한 시뮬레이션
#10;
x = 3'b011;
en = 1;
#10;
en = 0;
// 4 입력에 대한 시뮬레이션
#10;
x = 3'b100;
en = 1;
#10;
en = 0;
// 5 입력에 대한 시뮬레이션
#10;
x = 3'b101;
en = 1;
#10;
en = 0;
// 6 입력에 대한 시뮬레이션
#10;
x = 3'b110;
en = 1;
#10;
en = 0;
// 7 입력에 대한 시뮬레이션
#10;
x = 3'b111;
en = 1;
#10;
en = 0;
// 시뮬레이션 종료
#10;
$finish;
end
// 입력 신호 및 출력 신호 값 출력
always @(x or en or D)
$display("x = %b, en = %b, D = %h", x, en, D);
endmodule
//Basys_3_Master.xdc
## Clock signal
set_property -dict { PACKAGE_PIN W5 IOSTANDARD LVCMOS33 } [get_ports clk]
create_clock -add -name sys_clk_pin -period 10.00 -waveform {0 5} [get_ports clk]
## Switches
set_property -dict { PACKAGE_PIN V17 IOSTANDARD LVCMOS33 } [get_ports {en}]
set_property -dict { PACKAGE_PIN V16 IOSTANDARD LVCMOS33 } [get_ports {x[0]}]
set_property -dict { PACKAGE_PIN W16 IOSTANDARD LVCMOS33 } [get_ports {x[1]}]
set_property -dict { PACKAGE_PIN W17 IOSTANDARD LVCMOS33 } [get_ports {x[2]}]
## LEDs
set_property -dict { PACKAGE_PIN U16 IOSTANDARD LVCMOS33 } [get_ports {D[0]}]
set_property -dict { PACKAGE_PIN E19 IOSTANDARD LVCMOS33 } [get_ports {D[1]}]
set_property -dict { PACKAGE_PIN U19 IOSTANDARD LVCMOS33 } [get_ports {D[2]}]
set_property -dict { PACKAGE_PIN V19 IOSTANDARD LVCMOS33 } [get_ports {D[3]}]
set_property -dict { PACKAGE_PIN W18 IOSTANDARD LVCMOS33 } [get_ports {D[4]}]
set_property -dict { PACKAGE_PIN U15 IOSTANDARD LVCMOS33 } [get_ports {D[5]}]
set_property -dict { PACKAGE_PIN U14 IOSTANDARD LVCMOS33 } [get_ports {D[6]}]
set_property -dict { PACKAGE_PIN V14 IOSTANDARD LVCMOS33 } [get_ports {D[7]}]
## Configuration options, can be used for all designs
set_property CONFIG_VOLTAGE 3.3 [current_design]
set_property CFGBVS VCCO [current_design]
## SPI configuration mode options for QSPI boot, can be used for all designs
set_property BITSTREAM.GENERAL.COMPRESS TRUE [current_design]
set_property BITSTREAM.CONFIG.CONFIGRATE 33 [current_design]
set_property CONFIG_MODE SPIx4 [current_design]
- 인코더
module encoder(d, en, a, v);
input[7:0] d ;
input en ;
output[2:0] a ;
output v;
reg [2:0] a;
reg v;
always @ (en or d)
begin
a = 0;
v = 1'b0;
if (en) begin
if (d[7]) begin
a = 7;
v = 1'b1;
end else if (d[6]) begin
a = 6;
v = 1'b1;
end else if (d[5]) begin
a = 5;
v = 1'b1;
end else if (d[4]) begin
a = 4;
v = 1'b1;
end else if (d[3]) begin
a = 3;
v = 1'b1;
end else if (d[2]) begin
a = 2;
v = 1'b1;
end else if (d[1]) begin
a = 1;
v = 1'b1;
end else if (d[0]) begin
a = 0;
v = 1'b1;
end else begin
a = 0;
v = 1'b0;
end
end
end
endmodule
module encoder_tb;
reg [7:0] d;
reg en;
wire [2:0] a;
wire v;
encoder dut (
.d(d),
.en(en),
.a(a),
.v(v)
);
initial begin
// 인풋 값 설정
d = 8'b00000000;
en = 0;
// 인에이블 신호 활성화
en = 1;
#10;
// 입력 값 테스트
d = 8'b00000100;
#10;
d = 8'b00010000;
#10;
d = 8'b10000000;
#10;
// 인에이블 신호 비활성화
en = 0;
#10;
$finish;
end
endmodule
//Basys_3_Master
## Switches
set_property -dict { PACKAGE_PIN V17 IOSTANDARD LVCMOS33 } [get_ports {d[0]}]
set_property -dict { PACKAGE_PIN V16 IOSTANDARD LVCMOS33 } [get_ports {d[1]}]
set_property -dict { PACKAGE_PIN W16 IOSTANDARD LVCMOS33 } [get_ports {d[2]}]
set_property -dict { PACKAGE_PIN W17 IOSTANDARD LVCMOS33 } [get_ports {d[3]}]
set_property -dict { PACKAGE_PIN W15 IOSTANDARD LVCMOS33 } [get_ports {d[4]}]
set_property -dict { PACKAGE_PIN V15 IOSTANDARD LVCMOS33 } [get_ports {d[5]}]
set_property -dict { PACKAGE_PIN W14 IOSTANDARD LVCMOS33 } [get_ports {d[6]}]
set_property -dict { PACKAGE_PIN W13 IOSTANDARD LVCMOS33 } [get_ports {d[7]}]
set_property -dict { PACKAGE_PIN R2 IOSTANDARD LVCMOS33 } [get_ports {en}]
## LEDs
set_property -dict { PACKAGE_PIN U16 IOSTANDARD LVCMOS33 } [get_ports {a[0]}]
set_property -dict { PACKAGE_PIN E19 IOSTANDARD LVCMOS33 } [get_ports {a[1]}]
set_property -dict { PACKAGE_PIN U19 IOSTANDARD LVCMOS33 } [get_ports {a[2]}]
set_property -dict { PACKAGE_PIN V19 IOSTANDARD LVCMOS33 } [get_ports {v}]
- 스위칭 인코더
module sw_encoder(clk, key, keyVal);
input clk;
input [15:0] key;
output [3:0] keyVal;
reg [3:0] keyVal;
always @ (posedge clk)
begin
case(key)
16'b0000000000000001 : keyVal = 4'b0000;
16'b0000000000000010 : keyVal = 4'b0001;
16'b0000000000000100 : keyVal = 4'b0010;
16'b0000000000001000 : keyVal = 4'b0011;
16'b0000000000010000 : keyVal = 4'b0100;
16'b0000000000100000 : keyVal = 4'b0101;
16'b0000000001000000 : keyVal = 4'b0110;
16'b0000000010000000 : keyVal = 4'b0111;
16'b0000000100000000 : keyVal = 4'b1000;
16'b0000001000000000 : keyVal = 4'b1001;
16'b0000010000000000 : keyVal = 4'b1010;
16'b0000100000000000 : keyVal = 4'b1011;
16'b0001000000000000 : keyVal = 4'b1100;
16'b0010000000000000 : keyVal = 4'b1101;
16'b0100000000000000 : keyVal = 4'b1110;
16'b1000000000000000 : keyVal = 4'b1111;
default :;
endcase
end
endmodule
module sw_encoder_tb1;
reg clk;
reg [15:0] key;
wire [3:0] keyVal;
sw_encoder dut (
.clk(clk),
.key(key),
.keyVal(keyVal)
);
always #5 clk = ~clk;
initial begin
// 초기화
clk = 0;
key = 16'b0000000000000000;
#5 key = key + 1;
end
always @ (clk) begin
key <= key << 1'b1;
#10;
end
endmodule
## Clock signal
set_property -dict { PACKAGE_PIN W5 IOSTANDARD LVCMOS33 } [get_ports clk]
create_clock -add -name sys_clk_pin -period 10.00 -waveform {0 5} [get_ports clk]
## Switches
set_property -dict { PACKAGE_PIN V15 IOSTANDARD LVCMOS33 } [get_ports {key[5]}]
set_property -dict { PACKAGE_PIN W14 IOSTANDARD LVCMOS33 } [get_ports {key[6]}]
set_property -dict { PACKAGE_PIN W13 IOSTANDARD LVCMOS33 } [get_ports {key[7]}]
set_property -dict { PACKAGE_PIN V2 IOSTANDARD LVCMOS33 } [get_ports {key[8]}]
set_property -dict { PACKAGE_PIN T3 IOSTANDARD LVCMOS33 } [get_ports {key[9]}]
set_property -dict { PACKAGE_PIN T2 IOSTANDARD LVCMOS33 } [get_ports {key[10]}]
set_property -dict { PACKAGE_PIN R3 IOSTANDARD LVCMOS33 } [get_ports {key[11]}]
set_property -dict { PACKAGE_PIN W2 IOSTANDARD LVCMOS33 } [get_ports {key[12]}]
set_property -dict { PACKAGE_PIN U1 IOSTANDARD LVCMOS33 } [get_ports {key[13]}]
set_property -dict { PACKAGE_PIN T1 IOSTANDARD LVCMOS33 } [get_ports {key[14]}]
set_property -dict { PACKAGE_PIN R2 IOSTANDARD LVCMOS33 } [get_ports {key[15]}]
## LEDs
set_property -dict { PACKAGE_PIN U16 IOSTANDARD LVCMOS33 } [get_ports {keyVal[0]}]
set_property -dict { PACKAGE_PIN E19 IOSTANDARD LVCMOS33 } [get_ports {keyVal[1]}]
set_property -dict { PACKAGE_PIN U19 IOSTANDARD LVCMOS33 } [get_ports {keyVal[2]}]
set_property -dict { PACKAGE_PIN V19 IOSTANDARD LVCMOS33 } [get_ports {keyVal[3]}]
##Buttons
set_property -dict { PACKAGE_PIN U18 IOSTANDARD LVCMOS33 } [get_ports key[0]]
set_property -dict { PACKAGE_PIN T18 IOSTANDARD LVCMOS33 } [get_ports key[1]]
set_property -dict { PACKAGE_PIN W19 IOSTANDARD LVCMOS33 } [get_ports key[2]]
set_property -dict { PACKAGE_PIN T17 IOSTANDARD LVCMOS33 } [get_ports key[3]]
set_property -dict { PACKAGE_PIN U17 IOSTANDARD LVCMOS33 } [get_ports key[4]]
'[Harman] 세미콘(semiconductor) 아카데미-반도체설계 > Verilog를 이용한 RTL 시스템 반도체 설계' 카테고리의 다른 글
FND&디코더 (0) | 2023.06.15 |
---|---|
7-세그먼트 디코더, 크기 비교기 (0) | 2023.06.09 |
7 Segment Decoder, D - Flip Flop, Register (0) | 2023.06.07 |
조합회로, 순차회로, Multiplexer (0) | 2023.06.02 |
vivado, AND 게이트 (1) | 2023.06.01 |