2023. 6. 9. 12:04ㆍ[Harman] 세미콘(semiconductor) 아카데미-반도체설계/Verilog를 이용한 RTL 시스템 반도체 설계
- 7-세그먼트 디코더
하나의 7-세그먼트에서는 한 자리 16진수 출력이 가능. 그러나 FPGA에서 16진수를저장하기 위한 비트의 크기는 4비트이며, 4비트에 저장된 수를 7-세그먼트로 출력하기 위해서는 디코딩 과정이 필요
-> 4비트에 저장된 하나의 16진수를 7-세그먼트에 출력하는 디코더 설계
- 스위치로 입력된 값을 16진수로 7-세그먼트에 출력되도록 설계
- 스위치에 입력된 키 값은 signal seg에 저장되고, case~when에서 seg에 저장된 값에따라 7-세그먼트에 출력할 값을 지정
→ 스위치 인코더에 디코딩을 실행하는 프로세스 추가
module fnd_decoder(
input clk, //clk
input [3:0] a, b, //fnd input 2select
output reg [6:0] FND, // fnd output 2select
output reg FNDSel1, FNDSel2, FNDSel3, FNDSel4
);
reg [6:0] FNDa, FNDb;
reg clk100Hz;
integer m = 0;
always @ (posedge clk) begin
if (m >= 499_999) begin
m <= 0;
clk100Hz <= ~clk100Hz;
end else begin
m <= m + 1;
end
end
always @ (posedge clk) begin
case (a)
4'b0000: FNDa <= 7'h40;
4'b0001: FNDa <= 7'h79;
4'b0010: FNDa <= 7'h24;
4'b0011: FNDa <= 7'h30;
4'b0100: FNDa <= 7'h19;
4'b0101: FNDa <= 7'h12;
4'b0110: FNDa <= 7'h02;
4'b0111: FNDa <= 7'h58;
4'b1000: FNDa <= 7'h00;
4'b1001: FNDa <= 7'h10;
4'b1010: FNDa <= 7'h20;
4'b1011: FNDa <= 7'h03;
4'b1100: FNDa <= 7'h27;
4'b1101: FNDa <= 7'h21;
4'b1110: FNDa <= 7'h04;
4'b1111: FNDa <= 7'h0e;
endcase
case (b)
4'b0000: FNDb <= 7'h40;
4'b0001: FNDb <= 7'h79;
4'b0010: FNDb <= 7'h24;
4'b0011: FNDb <= 7'h30;
4'b0100: FNDb <= 7'h19;
4'b0101: FNDb <= 7'h12;
4'b0110: FNDb <= 7'h02;
4'b0111: FNDb <= 7'h58;
4'b1000: FNDb <= 7'h00;
4'b1001: FNDb <= 7'h10;
4'b1010: FNDb <= 7'h20;
4'b1011: FNDb <= 7'h03;
4'b1100: FNDb <= 7'h27;
4'b1101: FNDb <= 7'h21;
4'b1110: FNDb <= 7'h04;
4'b1111: FNDb <= 7'h0e;
endcase
end
always @ (clk100Hz, FNDa, FNDb) begin
if (clk100Hz) begin
FNDSel1 <= 1'b1;
FNDSel2 <= 1'b0;
FNDSel3 <= 1'b1;
FNDSel4 <= 1'b1;
FND = FNDb;
end else begin
FNDSel1 <= 1'b0;
FNDSel2 <= 1'b1;
FNDSel3 <= 1'b1;
FNDSel4 <= 1'b1;
FND = FNDa;
end
end
endmodule
//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 {a[0]}]
set_property -dict { PACKAGE_PIN V16 IOSTANDARD LVCMOS33 } [get_ports {a[1]}]
set_property -dict { PACKAGE_PIN W16 IOSTANDARD LVCMOS33 } [get_ports {a[2]}]
set_property -dict { PACKAGE_PIN W17 IOSTANDARD LVCMOS33 } [get_ports {a[3]}]
set_property -dict { PACKAGE_PIN W15 IOSTANDARD LVCMOS33 } [get_ports {b[0]}]
set_property -dict { PACKAGE_PIN V15 IOSTANDARD LVCMOS33 } [get_ports {b[1]}]
set_property -dict { PACKAGE_PIN W14 IOSTANDARD LVCMOS33 } [get_ports {b[2]}]
set_property -dict { PACKAGE_PIN W13 IOSTANDARD LVCMOS33 } [get_ports {b[3]}]
##7 Segment Display
set_property -dict { PACKAGE_PIN W7 IOSTANDARD LVCMOS33 } [get_ports {FND[0]}]
set_property -dict { PACKAGE_PIN W6 IOSTANDARD LVCMOS33 } [get_ports {FND[1]}]
set_property -dict { PACKAGE_PIN U8 IOSTANDARD LVCMOS33 } [get_ports {FND[2]}]
set_property -dict { PACKAGE_PIN V8 IOSTANDARD LVCMOS33 } [get_ports {FND[3]}]
set_property -dict { PACKAGE_PIN U5 IOSTANDARD LVCMOS33 } [get_ports {FND[4]}]
set_property -dict { PACKAGE_PIN V5 IOSTANDARD LVCMOS33 } [get_ports {FND[5]}]
set_property -dict { PACKAGE_PIN U7 IOSTANDARD LVCMOS33 } [get_ports {FND[6]}]
set_property -dict { PACKAGE_PIN U2 IOSTANDARD LVCMOS33 } [get_ports {FNDSel1}]
set_property -dict { PACKAGE_PIN U4 IOSTANDARD LVCMOS33 } [get_ports {FNDSel2}]
set_property -dict { PACKAGE_PIN V4 IOSTANDARD LVCMOS33 } [get_ports {FNDSel3}]
set_property -dict { PACKAGE_PIN W4 IOSTANDARD LVCMOS33 } [get_ports {FNDSel4}]
- 멀티플렉서(Multiplexer, MUX)
n비트의 선택 신호로 2n 비트의 입력 신호 중 하나를 선택하여 출력
4x1 멀티플렉서 : 2비트의 선택 신호로 4(=22) 비트의 입력 신호 중 하나를선택하여 출력
-> 4 개의 입력중 하나를 선택해서 출력 à case 혹은 if 조건문 사용 가장 용이
- case문 이용하여 설계 시
- 일반적으로 begin과 end는 그룹화하기 위해 if 혹은 case문장과 함께 사용
- [Begin : MUX] -> 블록 이름을 MUX로 지정해 블록 구분 가능 / 순차블록
- [Note]
- 이름을 가진 블록 [Begin : MUX ~ end]
- 순차블록은 begin ~ end로 구성되며, 문장을 그룹화하기 위해 if, case또는 for과 함께 사용
- Begin ~ end로 구분되는 다수의 문장을 구분하기 위해 '이름을 가진 블록' 구조를 제공
- case와 if로 설계된 멀티플렉서에서 블록 이름 'MUX'를 사용
- 디멀티플렉서
하나의 입력을 여러 개의 출력중 하나로 전송
1x4 디멀티플렉서 : 입력을 4개의 출력중 하나로 전송
-> 4개의 출력중 하나를 선택하려면 선택 신호 2개가 필요
입력 | 출력 | |||||
data | a1 | a0 | y3 | y2 | y1 | |
D | 0 | 0 | 0 | 0 | 0 | 0 |
D | 0 | 1 | 0 | 0 | D | 0 |
D | 1 | 0 | 0 | D | 0 | 0 |
D | 1 | 1 | D | 0 | 0 | 0 |
- 크기 비교기
조합논리회로로서 두 수를 비교하는 동작
2개의 n비트의 수 비교를 위한 회로는 2^2n개의 입력
입력에 대해 1001 / xor가 서로다른입력이들어왔을 때 1 -> nxor를 이용해 출력 구성가능
Verilog에선 비교기대신 관계연산자를 사용해도 비교기의 기능을 사용할 수 있다.
관계 연산자 식 | 의미 |
a < b | a가 b보다 작다 |
a > b | a가 b보다 크다 |
a <= b | a가 b보다 작거나 같다 |
a >= b | a가 b보다 크거나 같다 |
정렬(Sorting) 회로: 두 수를 입력 받아 크기를 비교한 후에 큰 수를 max 7-세그먼트에 출력하고 작은 수를 min 7-세그먼트에 출력
→ 앞의 비교기 회로와 매우 유사하게 입력되는 두 수를 비교해서 큰 수와 작은 수로 분류를 한 후 출력하는 회로
- 수 정렬회로: 두 수를 입력받아 크기를 비교한 후 큰 수(max)를 FND 에 / 작은 수(min)를 FND에 출력
- 크기 비교기와 유사하게 입력된느 두 수를 비교해서 큰수와 작은 수로 분류한 다음 출력하는 회로
'[Harman] 세미콘(semiconductor) 아카데미-반도체설계 > Verilog를 이용한 RTL 시스템 반도체 설계' 카테고리의 다른 글
FND, 가산기, 감산기 (0) | 2023.06.16 |
---|---|
FND&디코더 (0) | 2023.06.15 |
설계, 가산기, 디코더, 인코더, 스위칭 인코더 (0) | 2023.06.08 |
7 Segment Decoder, D - Flip Flop, Register (0) | 2023.06.07 |
조합회로, 순차회로, Multiplexer (0) | 2023.06.02 |