hong.com
Final
2025-08-06
2025-08-07
2025-08-08
2025-08-11
2025-08-12
2025-08-13
2025-08-14
2025-08-18
2025-08-19
Project
C Language
game instructions
FFT
game instructions
Study
C Language
ARM System Programming
C Programming - Challenges
C programming
Linux
Day1
Day2
Day3
Day4
Day5
Day6
Day7
Day8
SKIN_Project copy
SKIN_Project
perceptron
System Verilog
Day1
Day2
Day3
VLSI Circuits Design
Day1
Subsubcategory 1
Subsubcategory 2
example
Home
Contact
Copyright ยฉ 2024 |
Yankos
Home
> Final
๐ ๆ้ใขใค (โโขแดโขโ)โก โง*ใ
Final
2025-08-19
RISC-V I-TYPE Review funct3 ๋ฅผ ํตํด SLTI, SLTIU ๊ตฌ๋ถ ํด์ผํจ SLTI ๊ฒฝ์ฐ ๋ถํธ๋นํธ๋ฅผ ์๊ฐํด์ ๋๋ ค์ค์ผ ํจ shift ๋ ์ ๋ถ unsigned, ๊ทธ๋์ SLTIU ๋ immExtend ์์ ๊ฐ์ด ์ฒ๋ฆฌ /*** immExtend ***/ `OP_TYPE_I: begin case (func3) 3'b001: immExt = {27'b0, instrCode[24:20]}; // SLLI 3'b011: immExt = {20'b0, instrCode[31:20]}; // SRLI, SRAI 3'b101: immExt = {27'b0, instrCode[24:20]}; // SLTIU default:immExt = {{20{instrCode[31]}}, instrCode[31:20]}; endcase end /*** ROM ***/ //rom[x]=32'b imm12 _ rs1 _f3 _ rd _ op // I-Type rom[6] = 32'b000000000001_00001_000_01001_0010011;// addi x9, x1, 1 rom[7] = 32'b000000000100_00010_111_01010_0010011;// andi x10, x2, 4 rom[8] = 32'b000000000001_00010_110_01011_0010011;// ori x11, x2, 1 rom[9] = 32'b000000000011_00001_001_01100_0010011;// slli x12, x1, 1 โ 2b00001000 << 3 = 11 * 2^3 = 88 ์ผ์ชฝ ์ฌํํธ: x ยซย n = x ร 2โฟ ์ค๋ฅธ์ชฝ ์ฌํํธ: xย ยป n = floor(x รท 2โฟ) RISC-V B-TYPE ๋น๊ตํด์ ์ ํํ๊ฒ ๋ค. ๊ฒฐ๊ตญ ๋ช ๋ น์ด์ ์ฃผ์๋ฅผ ๋ฐ๊พธ๊ฒ ๋ค๋ ๋ป. PC์ ๊ฐ์ ๋ฐ๊พธ๋ฉด ๋์ค๋ ๋ช ๋ น์ด๊ฐ ๋ฐ๋ = Branch (C์ธ์ด: if, for, while, switch ๋ฑ) (rs1, rs2๋ก ์ฐ์ฐํ๊ธฐ ์ํด) ALU ์์ ๋น๊ต๊ธฐ ์ฒ๋ฆฌ /*** ControlUnit ***/ `OP_TYPE_B: aluControl = operator; /*** alu ***/ always_comb begin : branch btaken = 1'b0; case (aluControl[2:0]) `BEQ: btaken = (a == b); `BNE: btaken = (a != b); `BLT: btaken = ($signed(a) < $signed(b)); `BGE: btaken = ($signed(a) >= $signed(b)); `BLTU: btaken = (a < b); `BGEU: btaken = (a >= b); endcase end /*** DataPath ***/ logic [3:0] PC_4_AdderResult, PC_Imm_AdderResult, PCSrcMuxOut; logic PCSrcMuxSel; logic btaken; adder U_PC_Imm_Adder ( .a(immExt), .b(PCOutData), .y(PC_Imm_AdderResult) ); adder U_PC_4_Adder ( .a(32'd4), .b(PCOutData), .y(PC_4_AdderResult) ); assign PCSrcMuxSel = btaken & branch; mux_2x1 U_PCSrcMux ( .sel(PCSrcMuxSel), .x0 (PC_4_AdderResult), .x1 (PC_Imm_AdderResult), .y (PCSrcMuxOut) ); ROM[5] ์ฐธ -> rom[8] ์ ํ (20->32) /*** ROM ***/ //rom[x]=32'b imm7 _ rs2 _ rs1 _f3 _ imm5_ op // B-Type rom[5] = 32'b0000000_00010_00010_000_01100_1100011; // beq x2, x2, 12 //rom[x]=32'b imm12 _ rs1 _f3 _ rd _ op // L-Type rom[6] = 32'b000000001000_00000_010_01000_0000011; // lw x8, 8(x0) //rom[x]=32'b imm12 _ rs1 _f3 _ rd _ op // I-Type rom[7] = 32'b000000000001_00001_000_01001_0010011; // addi x9, x1, 1 rom[8] = 32'b000000000100_00010_111_01010_0010011; // andi x10, x2, 4 ROM[5] ๊ฑฐ์ง -> rom[8] (20->24) /*** ROM ***/ //rom[x]=32'b imm7 _ rs2 _ rs1 _f3 _ imm5_ op // B-Type rom[5] = 32'b0000000_00010_00000_000_01100_1100011; // beq x2, x0, 12 //rom[x]=32'b imm12 _ rs1 _f3 _ rd _ op // L-Type rom[6] = 32'b000000001000_00000_010_01000_0000011; // lw x8, 8(x0) RISC-V TYPE C์ธ์ด๋ก if๋ฌธ ํด์ ์ ํ, ์ปดํ์ผ๋ฌ์์ ๋ง๋ค์ด์ค ๊ท์น์ฑ
Final
ยท 2025-08-19
2025-08-18
RISC-V (RV32I Instruction Set) โR-Typeโ RA1 : โRead Address 1โ โ ์ฝ์ ๋ ์ง์คํฐ์ ์ฃผ์(๋ฒํธ). rs1(๋ช ๋ น์ด [19:15])๊ฐ ๋ค์ด๊ฐ. 5๋นํธ. RA2 : โRead Address 2โ โ ์ฝ์ ๋ ์ง์คํฐ์ ์ฃผ์(๋ฒํธ). rs2(๋ช ๋ น์ด [24:20])๊ฐ ๋ค์ด๊ฐ. 5๋นํธ. WA : โWrite Addressโ โ ์ธ ๋ ์ง์คํฐ์ ์ฃผ์(๋ฒํธ). rd(๋ช ๋ น์ด [11:7]). 5๋นํธ. RD1 : โRead Data 1โ โ x[rs1]์์ ์ฝํ ๋์จ ๋ฐ์ดํฐ. ALU ํผ์ฐ์ฐ์ a๋ก ์ฐ๊ฒฐ. RD2 : โRead Data 2โ โ x[rs2]์์ ์ฝํ ๋์จ ๋ฐ์ดํฐ. ALU ํผ์ฐ์ฐ์ b๋ก ์ฐ๊ฒฐ. WD : โWrite Dataโ โ ์ธ ๋ฐ์ดํฐ. R-type์ด๋ฉด ๋ณดํต ALU ๊ฒฐ๊ณผ(aluResult). we : โWrite Enableโ โ ํด๋ก ์์น์ฃ์ง์ we=1์ด๋ฉด x[WA] โ WD๋ก ๊ธฐ๋ก. Instruction Memory(ROM/Flash) : ๋ช ๋ น์ด๋ฅผ ์ ์ฅํ๊ณ PC๊ฐ ์ง์ ํ ์ฃผ์์ ๋ช ๋ น์ด๋ฅผ ์ฝ์ด์ค๋ค. PC(Program Counter) : ํ์ฌ ๋ช ๋ น์ด์ ์ฃผ์๋ฅผ ๋ณด๊ดํ๊ณ ๋ค์ ์ฃผ์(๋ณดํต PC+4 ๋๋ ๋ถ๊ธฐ/์ ํ)๋ฅผ ์ ์ํ๋ค. Control Unit : opcode(+funct3/7)๋ฅผ ํด๋ ํด ALUยท๋ ์ง์คํฐยท๋ฉ๋ชจ๋ฆฌยทPC ์ ์ด ์ ํธ(aluControl ๋ฑ)๋ฅผ ์์ฑํ๋ค. ํจ์จ์ ์ด๊ณ ๋ฒ์ฉ์ ์ธ ๋ช ๋ น์ด๋ฅผ ๋ง๋ค๊ธฐ ์ํด ๊ต์๋๊ณผ ๊ฐ์ด R-Type ์ค๊ณ I_Type๊ณผ ๋์ผํ funtion ๋ถ๋ถ์ด ๋ช ๊ตฐ๋ฐ ๋ณด์ ControlUnit ์์ operator ๊ฐ๊ณผ aluControl ์ ํธ๊ฐ ๋์ผํ๋ฏ๋ก R-Type ์ด๋ฉด aluControl = operator โ 7โb0110011: aluControl = operator; ๊ฐ๋ ์ฑ์ ๋์ด๊ธฐ ์ํด defines.sv ์์ฑ โ `include โdefines.svโ S-Type (Store) ์ค๊ณ, RAM ํ์ R-Type(์ฐ์ /๋ ผ๋ฆฌ): ๋ ์ง์คํฐ๋ผ๋ฆฌ๋ง ์ฐ์ฐํด ๊ฒฐ๊ณผ๋ฅผ ๋ค์ ๋ ์ง์คํฐ์ ์. ์คํ ์ค โ๋ฐ์ดํฐ ๋ฉ๋ชจ๋ฆฌโ๋ฅผ ์ฝ๊ฑฐ๋ ์ฐ์ง ์์. ํ์ํ ๋ฉ๋ชจ๋ฆฌ๋ ๋ช ๋ น์ ์ฝ์ด์ค๋ Instruction Memory(๋ณดํต ROM/Flash)๋ฟ. S-Type(Store): ๋ ์ง์คํฐ ๊ฐ์ ๋ฐ์ดํฐ ๋ฉ๋ชจ๋ฆฌ๋ก ์ ์ฅ(์ฐ๊ธฐ) ํด์ผ ํจ. ์คํ ์ค ๋ด์ฉ์ด ๋ฐ๋์ด์ผ ํ๋ฏ๋ก ์ฐ๊ธฐ ๊ฐ๋ฅํ ๋ฉ๋ชจ๋ฆฌ(RAM)๊ฐ ํ์. S-Type Descript : Memory[์ฃผ์] = Data โ M[rs1+imm] = rs2 (Memory[์ฃผ์]=RAM, imm=์์) imm exted : ๋ถํธ๋นํธ๋ฅผ ์๊ฐํด์ ์ฒ๋ฆฌ, imm=opset ๊ฐ, ํด๋น ์ฃผ์๋ก๋ถํฐ ์ฌ๋ผ๊ฐ(+) ์๋ ์๊ณ ๋ด๋ ค๊ฐ(-) ์๋ ์์, ๋นํธ๋ถํธ ํ์ฅ ํ์, ์ต์์ ๋นํธ๋ฅผ 20๋ฒ copy signals ๋์ด๋จ์ ๋ฐ๋ผ ๋ฌถ์ด์ค. โ {regFileWe, aluSrcMuxSel, busWe} = signals; // [2:0]signals L-Type I-Type
Final
ยท 2025-08-18
2025-08-14
RISC-V Design RISC-V (๋ฆฌ์คํฌ ํ์ด๋ธ) 2010๋ ๋ถํฐ ๋ฏธ๊ตญ UC ๋ฒํด๋ฆฌ์์ ๊ฐ๋ฐ ์ค์ธ ๋ฌด๋ฃ ์คํ ์์ค RISC ๋ช ๋ น์ด์ ์ํคํ ์ฒ Base: RV32I Version: 2.0 1. Single-Cycle Architecture ๋ชจ๋ ๋ช ๋ น์ด๊ฐ 1 clock์ ๋์ ๊ฐ์ฅ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฌ๋ ๋ช ๋ น์ด๋ฅผ ๊ธฐ์ค์ผ๋ก ํด๋ญ ์ฃผ๊ธฐ๋ฅผ ์ค๊ณํด์ผ ํจ ์ฅ์ : ๊ตฌ์กฐ๊ฐ ๋งค์ฐ ๋จ์ํจ ๋จ์ : ์ ์ฒด ์คํ ์๋๊ฐ ๋๋ฆผ 2. Multi-Cycle Architecture ๋ช ๋ น์ด ์ ํ(type)์ ๋ฐ๋ผ ํ์ํ clock ์๊ฐ ๋ค๋ฆ ๋ช ๋ น์ด์ ๋ฐ๋ผ ์คํ ์๊ฐ์ ๋จ์ถํ ์ ์์ ์ฅ์ : Single-Cycle๋ณด๋ค ๋น ๋ฆ ๋จ์ : ๊ตฌ์กฐ๊ฐ ๋ค์ ๋ณต์กํจ ๊ตฌํ ๋ชฉํ โ Single-Cycle๋ก ๋จผ์ ๊ตฌํ ๋ฐ ์ดํด โก Multi-Cycle๋ก ์ ํ + ARMA BUS + ์ฃผ๋ณ์ฅ์น(Peripherals) ์ฐ๋ 3. Pipeline Architecture (ํ์ฌ ๊ตฌํ X) ์ฅ์ : Single-Cycle๋ณด๋ค ํจ์ฌ ๋น ๋ฆ ๋จ์ : ๊ตฌ์กฐ๊ฐ ๋งค์ฐ ๋ณต์กํจ x0 โ zero : ํญ์ 0 ๊ฐ์ ๊ฐ์ง๋ ๋ ์ง์คํฐ x1 โ ra (Return Address) : ํจ์ ํธ์ถ ํ ๋ณต๊ท ์ฃผ์ ์ ์ฅ x2 โ sp (Stack Pointer) : ์คํ์ ์ต์๋จ ์ฃผ์ ์ ์ฅ x3 โ gp (Global Pointer) : ์ ์ญ ๋ณ์ ์ ๊ทผ์ฉ ํฌ์ธํฐ โฆ (์ดํ x31๊น์ง ๊ฐ์ ์ฉ๋ ์ง์ ) โ ์ด์ ๋ธ๋ฆฌ์ด์์๋ x0, x1 ๋์ zero, ra, sp, gp ๋ฑ์ ๋ณ์นญ(alias)์ผ๋ก ํ๊ธฐ๋จ CPU ๊ธฐ๋ณธ ๋ชจ๋ (ํ๋ฒ๋ ๊ตฌ์กฐ) Register File โ CPU ๋ด๋ถ ๋ ์ง์คํฐ ์งํฉ, ์ฐ์ฐ ๋ฐ ๋ฐ์ดํฐ ์์ ์ ์ฅ ALU (Arithmetic Logic Unit) โ ์ฐ์ ๋ฐ ๋ ผ๋ฆฌ ์ฐ์ฐ ์ํ ROM / Flash (Instruction Memory) โ ํ๋ก๊ทธ๋จ ๋ช ๋ น์ด ์ ์ฅ โป ROM์ ํ ๋ฒ ์ฐ๋ฉด ์ง์ธ ์ ์์ผ๋ฏ๋ก, ๋๋ถ๋ถ Flash ๋ฉ๋ชจ๋ฆฌ(๋นํ๋ฐ์ฑ) ์ฌ์ฉ RAM (Data Memory) โ ํ๋ก๊ทธ๋จ ์คํ ์ค ๋ฐ์ดํฐ ์์ ์ ์ฅ (ํ๋ฐ์ฑ) PC (Program Counter) โ ํ์ฌ ์คํ ์ค์ธ ๋ช ๋ น์ด์ ์ฃผ์๋ฅผ ๊ฐ๋ฆฌํค๋ ๋ ์ง์คํฐ Instruction, CPU, RAM ๊น์ง Single-Cycle ๊ตฌํ Peri๋ Multi-Cycle ์ดํ ๊ตฌํ Block Diagram Signal ์ดํด Register Source 1 (5) : 5bit RS1 Register Source 2 (5) : 5bit RS2 Register Destination (5) : 5bit RD Opcode (7) : 7bit type ๊ตฌ๋ถ Funct7 (7) : 7bit ์ฐ์ฐ ๊ตฌ๋ถ Funct3 (3) : 3bit ์ฐ์ฐ ๊ตฌ๋ถ ADD : rd(WAddr) = rs1(RA1) + rs2(RA2) / add : x7(rd), x5(rs1), x6(rs2) = x7 = x5(Data) + x6(Data) < Data Path > < Code : Data Path > `timescale 1ns / 1ps module DataPath ( input logic clk, input logic reset, input logic [31:0] instrCode, input logic regFileWe, input logic [ 1:0] aluControl, output logic [31:0] instrMemAddr ); logic [31:0] aluResult, RFData1, RFData2; logic [31:0] PCSrcData, PCOutData; assign instrMemAddr = PCOutData; RegisterFile U_RegFile ( .clk(clk), .we (regFileWe), .RA1(instrCode[19:15]), .RA2(instrCode[24:20]), .WA (instrCode[11:7]), .WD (aluResult), .RD1(RFData1), .RD2(RFData2) ); alu U_ALU ( .aluControl(aluControl), .a (RFData1), .b (RFData2), .result (aluResult) ); register U_PC ( .clk (clk), .reset(reset), .en (1'b1), .d (PCSrcData), .q (PCOutData) ); adder U_PC_Adder ( .a(32'd4), .b(PCOutData), .y(PCSrcData) ); endmodule module alu ( input logic [ 1:0] aluControl, input logic [31:0] a, input logic [31:0] b, output logic [31:0] result ); always_comb begin result = a + b; case (aluControl) 2'b00: result = a + b; 2'b01: result = a - b; 2'b10: result = a & b; 2'b11: result = a | b; endcase end endmodule module RegisterFile ( input logic clk, input logic we, input logic [ 4:0] RA1, input logic [ 4:0] RA2, input logic [ 4:0] WA, input logic [31:0] WD, output logic [31:0] RD1, output logic [31:0] RD2 ); logic [31:0] mem[0:2**5-1]; always_ff @(posedge clk) begin if (we) mem[WA] <= WD; end assign RD1 = (RA1 != 0) ? mem[RA1] : 32'b0; assign RD2 = (RA2 != 0) ? mem[RA2] : 32'b0; endmodule module register ( input logic clk, input logic reset, input logic en, input logic [31:0] d, output logic [31:0] q ); always_ff @(posedge clk, posedge reset) begin if (reset) begin q <= 0; end else begin if (en) q <= d; end end endmodule module adder ( input logic [31:0] a, input logic [31:0] b, output logic [31:0] y ); assign y = a + b; endmodule < Schematic : DataPath > < Code : Control Unit > `timescale 1ns / 1ps module ControlUnit ( input logic [31:0] instrCode, output logic regFileWe, output logic [ 1:0] aluControl ); // logic ์ ์ ์ธํ๋ฉด์ ์ฐ๊ฒฐ์ด ์๋๊ธฐ ๋๋ฌธ์ wire ์ฌ์ฉ (logic ์ฌ์ฉ์ assign ํ์) wire [6:0] opcode = instrCode[6:0]; wire [3:0] operator = {instrCode[30], instrCode[14:12]}; always_comb begin regFileWe = 1'b0; case (opcode) 7'b0110011: regFileWe = 1'b1; endcase end always_comb begin aluControl = 2'bx; case (opcode) 7'b0110011: begin // R-Type aluControl = 2'bx; case (operator) 4'b0000: aluControl = 2'b00; // add 4'b1000: aluControl = 2'b01; // sub 4'b0111: aluControl = 2'b10; // and 4'b0110: aluControl = 2'b11; // or endcase end endcase end endmodule < Code : CPU_RV32I > `timescale 1ns / 1ps module CPU_RV32I ( input logic clk, input logic reset, input logic [31:0] instrCode, output logic [31:0] instrMemAddr ); logic regFileWe; logic [1:0] aluControl; ControlUnit U_ControlUnit (.*); DataPath U_DataPath (.*); endmodule < Schematic : CPU_RV32I > < Code : ROM > `timescale 1ns / 1ps module ROM ( input logic [31:0] addr, output logic [31:0] data ); logic [31:0] rom[0:61]; initial begin //rom[x]=32'b func7 _ rs2 _ rs1 _f3 _ rd _ op rom[0] = 32'b0000000_00001_00010_000_00100_0110011; // add x4, x2, x1 rom[1] = 32'b0100000_00001_00010_000_00101_0110011; // sub x5, x2, x1 rom[2] = 32'b0000000_00000_00011_111_00110_0110011; // and x6, x3, x0 rom[3] = 32'b0000000_00000_00011_110_00111_0110011; // or x7, x3, x0 end // ํ์ 2bit ๋ฅผ ์์ ๋ฉด 4(2^2)์ ๋ฐฐ์๋ก ํํ์ด ๋จ, 4byte ๋จ์๋ก ์ด๋ ๊ฐ๋ฅ assign data = rom[addr[31:2]]; endmodule < Code : MCU > `timescale 1ns / 1ps module MCU ( input logic clk, input logic reset ); logic [31:0] instrCode; logic [31:0] instrMemAddr; ROM U_ROM ( .addr(instrMemAddr), .data(instrCode) ); CPU_RV32I U_CPU_RV32I (.*); endmodule < Schematic : MCU > < Simulation > < ํ์ผ > sources (Class) MCU.sv ROM.sv CPU_RV32I.sv ControlUnit.sv DataPath.sv sim (Class) RV32I_tb.sv HW < Design Specification > RISC-V RV32I R-Type ๋ช ๋ น์ด ์ค๊ณ < Code : DataPath (alu) > //... module alu ( input logic [ 3:0] aluControl, input logic [31:0] a, input logic [31:0] b, output logic [31:0] result ); always_comb begin result = 32'b0; case (aluControl) 4'b0000: result = a + b; 4'b0001: result = a - b; 4'b0010: result = a << b; 4'b0011: result = a >> b; 4'b0100: result = a >>> b; 4'b0101: result = ($signed(a) < $signed(b)) ? 1 : 0; 4'b0110: result = (a < b) ? 1 : 0; 4'b0111: result = a ^ b; 4'b1000: result = a | b; 4'b1001: result = a & b; endcase end endmodule //... < Code : ControlUnit > `timescale 1ns / 1ps module ControlUnit ( input logic [31:0] instrCode, output logic regFileWe, output logic [ 3:0] aluControl ); // logic ์ ์ ์ธํ๋ฉด์ ์ฐ๊ฒฐ์ด ์๋๊ธฐ ๋๋ฌธ์ wire ์ฌ์ฉ (logic ์ฌ์ฉ์ assign ํ์) wire [6:0] opcode = instrCode[6:0]; wire [3:0] operator = {instrCode[30], instrCode[14:12]}; always_comb begin regFileWe = 1'b0; case (opcode) 7'b0110011: regFileWe = 1'b1; endcase end always_comb begin aluControl = 4'bx; case (opcode) 7'b0110011: begin // R-Type aluControl = 4'bx; case (operator) 4'b0000: aluControl = 4'b0000; // ADD 4'b1000: aluControl = 4'b0001; // SUB 4'b0001: aluControl = 4'b0010; // SLL 4'b0101: aluControl = 4'b0011; // SRL 4'b1101: aluControl = 4'b0100; // SRA 4'b0010: aluControl = 4'b0101; // SLT 4'b0011: aluControl = 4'b0110; // SLTU 4'b0100: aluControl = 4'b0111; // XOR 4'b0110: aluControl = 4'b1000; // OR 4'b0111: aluControl = 4'b1001; // AND endcase end endcase end endmodule < Code : ROM > `timescale 1ns / 1ps module ROM ( input logic [31:0] addr, output logic [31:0] data ); logic [31:0] rom[0:61]; initial begin //rom[x]=32'b func7 _ rs2 _ rs1 _f3 _ rd _ op rom[0] = 32'b0000000_00010_00001_000_00011_0110011; // add x3, x1, x2 rom[1] = 32'b0100000_00010_00001_000_00011_0110011; // sub x3, x1, x2 rom[2] = 32'b0000000_00010_00001_001_00011_0110011; // sll x3, x1, x2 rom[3] = 32'b0000000_00010_00001_101_00011_0110011; // srl x3, x1, x2 rom[4] = 32'b0100000_00010_00001_101_00011_0110011; // sra x3, x1, x2 rom[5] = 32'b0000000_00010_00001_010_00011_0110011; // slt x3, x1, x2 rom[6] = 32'b0000000_00010_00001_011_00011_0110011; // sltu x3, x1, x2 rom[7] = 32'b0000000_00010_00001_100_00011_0110011; // xor x3, x1, x2 rom[8] = 32'b0000000_00010_00001_110_00011_0110011; // or x3, x1, x2 rom[9] = 32'b0000000_00010_00001_111_00011_0110011; // and x3, x1, x2 end // ํ์ 2bit ๋ฅผ ์์ ๋ฉด 4(2^2)์ ๋ฐฐ์๋ก ํํ์ด ๋จ, 4byte ๋จ์๋ก ์ด๋ ๊ฐ๋ฅ assign data = rom[addr[31:2]]; endmodule < Simulation > < ํ์ผ > sources (HW) MCU ROM CPU_RV32I ControlUnit DataPath sim (HW) RV32I_tb
Final
ยท 2025-08-14
2025-08-13
๐ ์ง๋ฌด๋ถ์ ๋ฐฉ๋ฒ ๋ณธ์ธ์ ์ง๋ฌด์ ํ ๊ธฐ์ค๊ณผ ์ ํ ์ง๋ฌด์ ๊ตฌ์ฒด์ ์ญํ ๋ฐ ํ์ ์ญ๋ ํ์ธ ์ง์ ์ง๋ฌด ์ํ์ ํ์ํ ๋ณธ์ธ์ด ์ค๋นํ ์ญ๋ ํ์ ์ง๋ฌด ์ํ์ ์์ด ๊ฐ์ฅ ๋ถ์กฑํ ์ญ๋ ํ์ธ ๋ถ์กฑํ ์ญ๋ ๋ณด์์ ์ํ ๋ ธ๋ ฅ ๊ณํ ๋ฐ ์ ์ฌ ํ ํฌ๋ถ ์์ฑ KSA ๋ถ์ ํด๋น ์ง๋ฌด์ ํ์ํ ์ง์(K), ๊ธฐ์ (S), ํ๋(A) ๊ธฐ์ ์์ฃผ์ ํํ ๊ฒฝํ ๊ธฐ์ฌ ๊ตฌ์กฐ ์์ : ํ๋ ์ผ โ ํ์ํ KSA โ ์์ ์ด ๋ณด์ ํ KSA โ ๊ทผ๊ฑฐ ์ฌ๋ก โ ๋ฏธ๋ณด์ KSA โ ๋ณด์ ๊ณํ ์์ฑ ์ ์์ฌํญ ๊ฒธ์ X / ๊ฐ์ ์ญ๋ O ์ฌ๋ก๋ฅผ ํตํ ์ ์ฆ ํ ๋จ์์ ์ง๋ฌด ๊ด๋ จ ๊ฒฝํ ๊ฐ์กฐ (ํ์๊ณผ์ ๋ถํ ์์์ ๊ฐ์ ์ ์ผ๋ก ์ ๋ฌ) ๐ ๊ตฌ์ฒด์ ์ธ ์ง๋ฌด๋ถ์ ๋ฐฉ๋ฒ 1.๊ณ ์ฉ24 + NCS ์ง์ ์ ๋ณด, ํ๊ฐ๊ธฐ์ค, ์ง๋ฌด๊ธฐ์ ์ ํ์ธ 2.๊ธฐ์ ํํ์ด์ง ์ง๋ฌด์๊ฐ ํ์ด์ง, ํ์ฌ ๊ณต์ ์ ๋ณด 3.๋์์ ์ฑ๋ ํ์ง์ ์ธํฐ๋ทฐ, ์ ๊ณ ๊ทผํฉ 4.์ทจ์ ํฌํธ ์ฌ์ดํธ ์์์ค, ์ฌ๋์ธ(ํ์ง์ ์ธํฐ๋ทฐ, 7~10๋ ์ฐจ ๊ฒฝ๋ ฅ์ ์ญ๋ ์ฐธ๊ณ ), ์ก์ฝ๋ฆฌ์, ์กํ๋๋ 5.์ง๋ฌด ๊ด๋ จ ์ปค๋ฎค๋ํฐ ๋ธ๋ผ์ธ๋, ์ฝ๋ฉํ , ์๋ค 6.๊ธฐํ ์ฐ์ ๊ธฐ์ฌ ์๊ฒฉ์ฆ์ด ์๋ค๋ฉด ์ค์ ๊ธฐ์ฌ์ ๋งค์นญ ํ ๊ฒฌํด ๋ฐ์ ํฌํธํด๋ฆฌ์คยท๋ฉด์ ์ค์์ฑ ์์น ๐ ์ง๋ฌด๋ถ์ ๊ตฌ์กฐ ์์ ๊ธฐ์ ๊ธฐ๋ณธ์ ๋ณด ๋น์ , ๋ฏธ์ , ์ ๋ต ๋น์ ์๋ฆฝ ์ด์ , ์ค์ฒ ์ฌ๋ก ํ์ฌ๊ฐ์, ์ฐฝ์ ์ด๋ , ๊ฒฝ์ํ๋, CEO ์ธ์ฌ๋ง, ์ ๋ ์ฌ, ๊ธฐ์ SNS, ์ฌ๋ณด โ โ๊ทธ ๋ฏธ์ ์ ํจ๊ป ์ํํ๊ธฐ ์ํด ์ง์ํจโ ์ธ์ฌ์ยทํต์ฌ๊ฐ์น ๊ธฐ์ ์ ์ธ์ฌ์ ์ ์ ๋ฐ ์ฌํด์ ํด๋น ์ธ์ฌ์์ด ํ์ํ ์ด์ ์ดํด ์ฌ์ ํํฉ ์์ต ๊ตฌ์กฐ, ์์ดํ , ๋งค์ถยท์์ ์ด์ต ์ถ์ง๊ณผ์ ์ฐ์ ๊ฒฝ์์์ ๊ธฐ์ค ๊ฐ์ ยท์ฝ์ ๋ถ์ ์ฅ๊ธฐ ๋ฐ์ ๊ฐ๋ฅ์ฑ, ์ต์ ์ด์, ์ง์ ์ ๋ณด ์ ๋ ์ฌ์์ ํค์๋ ํ์ฉ Note: ์์์๋ 1ยท2๋ฒ๊น์ง๋ง, ๋ฉด์ ์ 4๊ฐ ์ ๋ถ ์ค๋น ๐ ๊ธฐ์ ๋ถ์ ํ์ ์๋ฃ ๊ธฐ์ ํํ์ด์ง ํ์ฌ์๊ฐ, ์ฐํ, ๊ฒฝ์์ด๋ , ์ธ์ฌ์, ๋น์ ยท๋ฏธ์ , ์ ํยท์๋น์ค, ๋ธ๋๋, ์ฌ๋ด์์ ์ต๊ทผ ๋ณด๋์๋ฃ ์ ๊ท์ฌ์ , ์ค์ ์ฌ์ , ์ ๊ณ ์ด์, ์ ๋ ์ฌ ์ฌ์ ๋ชฉํ DART(์ฌ์ ๋ณด๊ณ ์) ์ฌ์ ๊ท๋ชจ, ์ ๋ต, ์ฌ๋ฌดํํฉ ์ฌ์ ์๊ฐ, ๋ถ๊ธฐ๋ณด๊ณ ์, ์ฌ๋ฌด์ ํ, ๋งค์ถยท์์ด์ตยท์ฆ๊ฐ์จ ํ์ ์ถ๊ฐ ์ฐธ๊ณ ๊ตฌ๊ธ ๊ธฐ์ ์ฌ์ ๋ณด๊ณ ์, IRํ๋ณด์๋ฃ ์ค์๊ธฐ์ : ๊ธฐ์ ๋ก๋๋งต, ํํฉ ์ ๋ณด์์คํ , ๋์ด์ค ๊ธฐ์ ์ ๋ณด, ํ๊ตญ๊ธฐ์ ํ๊ฐ ๐ ์ฐ์ ๋ถ์ ์ฃผ์ ์ฐ์ ๊ณผ ์ด์์ ๋งฅ๋ฝ ํ์ ๊ณต๊ธฐ์ ์ฐธ๊ณ ์ฌ์ดํธ: ALIO, ๋๋ฒ ์ดํ ๋ฐ์ด, ์กํ๋๋ (์๊ธฐ ๊ธฐ์ค ์ค์ ), DBR ๐ ์ ์ฌ์ง์์ ์์ฑ ํฌ์ธํธ ์ง๋ฌด ๊ฒฝํ๊ณผ KSA ๋ถ์ ๋ฐ์ ํ์ฌ ๋ง์ถคํ ์คํ ๋ฆฌ ์ ๋งคํ ์ด๋ ฅ์ โ ์๋ฅ ํ๋ฝ ์ํ ํฌํธํด๋ฆฌ์ค: ๊ทธ๋ฆผ ์์ฃผ, ๊ฐ๊ฒฐํ๊ฒ ์์ฑ ์ ์ ๊ฒ์ฌํญ ํ์๋ถ์ ์ฌ๋ถ ๊ฐ์ /๊ฒฝํ ์ ๋ฆฌ ์ง๋ฌด์ ํฉ์ฑ(์ 3์ ๊ด์ ๊ฒํ ) ์ง๋์น ๊ฒธ์ X / ์ ์ ํ ์ดํ O ๋จ์ ๋ถํ์ ๋ ธ์ถ ๐ ์ด๋ ฅ์ ํ(KDT) ์ฃผ์: ๋๋ก๋ช ๊น์ง๋ง ํ๋ ฅ: ์ต๊ทผ ์กธ์ 2๊ฐ๋ง ์๊ฒฉ์ฌํญ: ์ค์๋ ์ ๊ธฐ์ฌ ๐ ์์์ ์์ฑ ํ๋ฆ ์ง๋ฌด ํ์ ํ์ํ ์ญ๋ ๋ถ์ ํด๋น ์ญ๋ ์ ๋ฆฌ ๊ฒฝํ ์ฌ๋ก ์ ๋ฆฌ ํญ๋ชฉ๋ณ ๋ฐฐ์น KSA ์ฐ์ ์์ ๊ณ ๋ ค ์์ฑ ์๋ น ์ธ์ฌ๋ด๋น์ ๊ด์ ๊ฐ๊ดํยท์์นํ ๋๊ด์ โ ๊ฒฐ๋ก (๊ฐ์ ) โ ๋ณธ๋ก (STAR) โ ๊ฒฐ๋ก ๐ ์์์ ๊ธฐ๋ณธ ๊ตฌ์ฑ ์ฑ์ฅ๊ณผ์ : ์ง๋ฌด์ ๋ง๋ ์ฑํฅ ์ฑ๊ฒฉ์๊ฐ: ๊ฐ์ + ๋ณด์ ๋ ธ๋ ฅ ์ง๋ฌด๊ฒฝํ: ์ญํ , ์ญ๋ ํฅ์, ๋ฐฐ์ด ์ ์ง์๋๊ธฐยทํฌ๋ถ: ์ฐ์ ํน์ฑยท์ด์, ํ์ฌ ๋ฐฉํฅ, ์ง๋ฌด ํ์์ฑ, ์ ํฉ์ฑ, ํฅํ ๊ณํ
Final
ยท 2025-08-13
2025-08-12
Dedicated Processor Sum Counter Design < C์ธ์ด > i = 0; sum = 0; while (i <= 10) { sum = sum + i i = i + 1; outport = sum; } halt; < Design Specification > i ์ ์ฅ โ Register 1๊ฐ sum ์ ์ฅํ โ Register 1๊ฐ ์ถ๋ ฅ์ ์ ์ฅํ โ Register 1๊ฒ while ๋ฌธ โ Comparator ๋ง์ ์ฐ์ฐ โ Adder < Data Path > < ASM > < Code : DataPath > `timescale 1ns / 1ps module DataPath ( input logic clk, input logic reset, input logic SumSrcMuxSel, input logic ISrcMuxSel, input logic SumEn, input logic IEn, input logic AdderSrcMuxSel, input logic OutPortEn, output logic ILe10, output logic [7:0] OutPort ); logic [7:0] SumSrcMuxOut, ISrcMuxOut; logic [7:0] SumRegOut, IRegOut; logic [7:0] AdderResult, AdderSrcMuxOut; Mux_2x1 U_SumSrcMux ( .sel(SumSrcMuxSel), .x0 (0), .x1 (AdderResult), .y (SumSrcMuxOut) ); Mux_2x1 U_ISrcMux ( .sel(ISrcMuxSel), .x0 (0), .x1 (AdderResult), .y (ISrcMuxOut) ); Register U_SumReg ( .clk (clk), .reset(reset), .en (SumEn), .d (SumSrcMuxOut), .q (SumRegOut) ); Register U_IReg ( .clk (clk), .reset(reset), .en (IEn), .d (ISrcMuxOut), .q (IRegOut) ); Comparator U_ILe10 ( .a (IRegOut), .b (10), .lt(ILe10) ); Mux_2x1 U_AdderSrcMux ( .sel(AdderSrcMuxSel), .x0 (SumRegOut), .x1 (1), .y (AdderSrcMuxOut) ); Adder U_Adder ( .a (AdderSrcMuxOut), .b (IRegOut), .sum(AdderResult) ); Register U_OutPort ( .clk (clk), .reset(reset), .en (OutPortEn), .d (SumRegOut), .q (OutPort) ); endmodule module Register ( input logic clk, input logic reset, input logic en, input logic [7:0] d, output logic [7:0] q ); always_ff @(posedge clk, posedge reset) begin if (reset) begin q <= 0; end else begin if (en) begin q <= d; end end end endmodule module Mux_2x1 ( input logic sel, input logic [7:0] x0, input logic [7:0] x1, output logic [7:0] y ); always_comb begin y = 8'b0; case (sel) 1'b0: y = x0; 1'b1: y = x1; endcase end endmodule module Adder ( input logic [7:0] a, input logic [7:0] b, output logic [7:0] sum ); assign sum = a + b; endmodule module Comparator ( input logic [7:0] a, input logic [7:0] b, output logic lt ); assign lt = a < b; endmodule module OutBuf ( input logic en, input logic [7:0] x, output logic [7:0] y ); assign y = en ? x : 8'bx; endmodule < Schematic > < Code : ControlUnit > `timescale 1ns / 1ps module ControlUnit ( input logic clk, input logic reset, input logic ILe10, output logic SumSrcMuxSel, output logic ISrcMuxSel, output logic SumEn, output logic IEn, output logic AdderSrcMuxSel, output logic OutPortEn ); typedef enum { S0, S1, S2, S3, S4, S5 } state_e; state_e state, next_state; always_ff @(posedge clk, posedge reset) begin if (reset) begin state <= S0; end else begin state <= next_state; end end always_comb begin next_state = state; SumSrcMuxSel = 0; ISrcMuxSel = 0; SumEn = 0; IEn = 0; AdderSrcMuxSel = 0; OutPortEn = 0; case (state) S0: begin // i = 0, sum = 0 SumSrcMuxSel = 0; ISrcMuxSel = 0; SumEn = 1; IEn = 1; AdderSrcMuxSel = 0; // X OutPortEn = 0; next_state = S1; end S1: begin // iLe10 SumSrcMuxSel = 0; ISrcMuxSel = 0; SumEn = 0; IEn = 0; AdderSrcMuxSel = 0; OutPortEn = 0; if (ILe10) next_state = S2; else next_state = S5; end S2: begin // sum = sum + i SumSrcMuxSel = 1; ISrcMuxSel = 1; SumEn = 1; IEn = 0; AdderSrcMuxSel = 0; OutPortEn = 0; next_state = S3; end S3: begin // i = i + 1 SumSrcMuxSel = 1; ISrcMuxSel = 1; SumEn = 0; IEn = 1; AdderSrcMuxSel = 1; OutPortEn = 0; next_state = S4; end S4: begin // OutPort = sum SumSrcMuxSel = 1; ISrcMuxSel = 1; SumEn = 0; IEn = 0; AdderSrcMuxSel = 0; OutPortEn = 1; next_state = S1; end S5: begin // halt SumSrcMuxSel = 1; ISrcMuxSel = 1; SumEn = 0; IEn = 0; AdderSrcMuxSel = 0; OutPortEn = 0; next_state = S5; end endcase end endmodule < Code : DedicatedProcessor > `timescale 1ns / 1ps module DedicatedProcessor ( input logic clk, input logic reset, output logic [7:0] OutPort ); logic SumSrcMuxSel; logic ISrcMuxSel; logic SumEn; logic IEn; logic AdderSrcMuxSel; logic OutPortEn; logic ILe10; DataPath U_DataPath (.*); ControlUnit U_ControlUnit (.*); endmodule < Comment > IReg์ SumReg ๋ ๊ฐ์ ๋ ์ง์คํฐ๋ก ๊ฐ๊ฐ i ๊ฐ๊ณผ ๋์ ํฉ(sum)์ ์ ์ฅํ๋ค. OutPort ๋ ์ง์คํฐ๋ ์ต์ข ์ถ๋ ฅ๊ฐ์ ํด๋ญ ๊ฒฝ๊ณ์์ ์์ ์ ์ผ๋ก ๋ด๋ณด๋ธ๋ค. ๊ฐ ์ฐ์ฐ์ ํ์ํ ํผ์ฐ์ฐ์ ์ ํ์ MUX๋ฅผ ํตํด ์ด๋ฃจ์ด์ง๋ฉฐ, ํ๋์ Adder๋ฅผ ๊ณต์ ํ๋ค. Comparator(ILe10)๋ i โค 10 ์กฐ๊ฑด์ ํ๋์จ์ด ์ ํธ๋ก ๋ณํํด Control Unit์ด ๋ฃจํ ์ข ๋ฃ๋ฅผ ํ๋จํ๋๋ก ํ๋ค. < ๊ณ ์ฐฐ > ํ๋์ Adder๋ก ๋ ์ฐ์ฐ์ ๋ฒ๊ฐ์ ์ฒ๋ฆฌํ๋ฏ๋ก ํ๋์จ์ด ์์ ์ ์ฝ MUX์ Enable ์ ํธ๋ก ๋์ ํ์ด๋ฐ๊ณผ ๋ฐ์ดํฐ ๊ฒฝ๋ก๋ฅผ ์์ ํ ์ ์ด ๊ฐ๋ฅ < Simulation > < Code : top > `timescale 1ns / 1ps module top ( input logic clk, input logic reset, output logic [3:0] fndCom, output logic [7:0] fndFont ); logic clk_10hz; logic [7:0] OutPort; clk_div_10hz U_ClkDiv ( .clk (clk), .reset (reset), .clk_10hz(clk_10hz) ); DedicatedProcessor U_DedicatedProcessor ( .clk (clk_10hz), .reset (reset), .OutPort(OutPort) ); fndController U_FndController ( .clk (clk), .reset (reset), .number ({6'b0, OutPort}), .fndCom (fndCom), .fndFont(fndFont) ); endmodule module clk_div_10hz ( input logic clk, input logic reset, output logic clk_10hz ); //logic [23:0] div_counter; logic [$clog2(10_000_000)-1:0] div_counter; always_ff @(posedge clk, posedge reset) begin if (reset) begin div_counter <= 0; clk_10hz <= 1'b0; end else begin if (div_counter == 10_000_000 - 1) begin div_counter <= 0; clk_10hz <= 1'b1; end else begin div_counter <= div_counter + 1; clk_10hz <= 1'b0; end end end endmodule < Schematic > < ํ์ผ > sources (Class) top.sv DedicatedProcessor.sv DataPath.sv ControlUnit.sv fndController.sv simulation (Class) DedicatedProcessor_tb.sv constrs (Class) Basys-3-Master.xdc Register File Design < Design Specification > ๋ฐ์ดํฐ ์ถ๋ ฅ: 2๊ฐ์ Read Port(RD1, RD2)๋ฅผ ํตํด ALU๋ก ๋ฐ์ดํฐ ์ ๋ฌ ์ฃผ์ ์ง์ : ๊ฐ Read Port๋ ๋ณ๋์ Read Address ์ ๋ ฅ์ ๊ฐ์ง ์: RD1 ์ฃผ์ ์ ๋ ฅ์ 0์ ์ฃผ๋ฉด, ๋ ์ง์คํฐ 0๋ฒ ๋ฐ์ดํฐ ์ถ๋ ฅ RD2 ์ฃผ์ ์ ๋ ฅ์ 2๋ฅผ ์ฃผ๋ฉด, ๋ ์ง์คํฐ 2๋ฒ ๋ฐ์ดํฐ ์ถ๋ ฅ ๋ฐ์ดํฐ ์ฐ๊ธฐ: Write Address ์ ๋ ฅ์ ์ ์ฅํ ๋ ์ง์คํฐ ๋ฒํธ ์ง์ write_en ์ ํธ๋ฅผ 1๋ก ํ๊ณ ํด๋ญ ์ฃ์ง์ ๋ง์ถฐ ๋ฐ์ดํฐ ์ ์ฅ ์: Write Address = 3, write_en = 1 โ ๋ ์ง์คํฐ 3๋ฒ์ ๋ฐ์ดํฐ ์ ์ฅ ์ถ๋ ฅ ํน์ฑ: ๋ณ๋์ read_enable ์์ด, ์ฃผ์๊ฐ ์ ํจํ๋ฉด ํญ์ ํด๋น ๋ฐ์ดํฐ ์ถ๋ ฅ ์ฃผ์ ๋ณ๊ฒฝ ์ ์ฆ์ ํด๋น ๋ ์ง์คํฐ ๊ฐ ์ถ๋ ฅ < C์ธ์ด > R1 = 0; // i R2 = 0; // sum R3 = 1; while (R1 <= 10) { R2 = R2 + R1 R1 = R1 + R3; outport = R2; } halt; < Data Path > < Code : DataPath > `timescale 1ns / 1ps module DataPath ( input logic clk, input logic reset, input logic RFSrcMuxSel, input logic [2:0] RAddr1, input logic [2:0] RAddr2, input logic [2:0] WAddr, input logic we, input logic OutPortEn, output logic R1Le10, output logic [7:0] OutPort ); logic [7:0] AddrResult, RFSrcMuxOut; logic [7:0] RData1, RData2; Mux_2x1 U_RFSrcMux ( .sel(RFSrcMuxSel), .x0 (AddrResult), .x1 (8'b1), .y (RFSrcMuxOut) ); RegFile U_RegFile ( .clk (clk), .RAddr1(RAddr1), .RAddr2(RAddr2), .WAddr (WAddr), .we (we), .Wdata (RFSrcMuxOut), .RData1(RData1), .RData2(RData2) ); Comparator U_R1Le10 ( .a (RData1), .b (8'd10), .lte(R1Le10) ); Adder U_Adder ( .a (RData1), .b (RData2), .sum(AddrResult) ); Register U_Register ( .clk (clk), .reset(reset), .en (OutPortEn), .d (RData1), .q (OutPort) ); endmodule module RegFile ( input logic clk, input logic [2:0] RAddr1, input logic [2:0] RAddr2, input logic [2:0] WAddr, input logic we, input logic [7:0] Wdata, output logic [7:0] RData1, output logic [7:0] RData2 ); logic [7:0] mem[0:2**3-1]; // [0:2**(Number of addresses)-1] always_ff @(posedge clk) begin if (we) begin mem[WAddr] <= Wdata; end end assign RData1 = (RAddr1 == 0) ? 8'b0 : mem[RAddr1]; assign RData2 = (RAddr2 == 0) ? 8'b0 : mem[RAddr2]; endmodule module Register ( input logic clk, input logic reset, input logic en, input logic [7:0] d, output logic [7:0] q ); always_ff @(posedge clk, posedge reset) begin if (reset) begin q <= 0; end else begin if (en) begin q <= d; end end end endmodule module Mux_2x1 ( input logic sel, input logic [7:0] x0, input logic [7:0] x1, output logic [7:0] y ); always_comb begin y = 8'b0; case (sel) 1'b0: y = x0; 1'b1: y = x1; endcase end endmodule module Adder ( input logic [7:0] a, input logic [7:0] b, output logic [7:0] sum ); assign sum = a + b; endmodule module Comparator ( input logic [7:0] a, input logic [7:0] b, output logic lte ); assign lte = a <= b; endmodule < Schematic > Homework_1 < Design Specification > Register File ์ Data Path ์ด์ด์ ControlUnit, DedicatedProcessor ์ค๊ณ ๋์: RegisterFile ์ ์ด์ฉํ์ฌ 0 ~ 10 ๋์ ํฉ์ fnd์ ์ถ๋ ฅ < ASM > < Code : ControlUnit > `timescale 1ns / 1ps module ControlUnit ( input logic clk, input logic reset, input logic R1Le10, output logic RFSrcMuxSel, output logic [2:0] RAddr1, output logic [2:0] RAddr2, output logic [2:0] WAddr, output logic we, output logic OutPortEn ); typedef enum { S0, S1, S2, S3, S4, S5, S6, S7 } state_e; state_e state, next_state; always_ff @(posedge clk, posedge reset) begin if (reset) begin state <= S0; end else begin state <= next_state; end end always_comb begin next_state = state; RFSrcMuxSel = 0; RAddr1 = 0; RAddr2 = 0; WAddr = 0; we = 0; OutPortEn = 0; case (state) S0: begin RFSrcMuxSel = 0; RAddr1 = 4'd0; RAddr2 = 4'd0; WAddr = 4'd1; we = 1; OutPortEn = 0; next_state = S1; end S1: begin RFSrcMuxSel = 0; RAddr1 = 4'd0; RAddr2 = 4'd0; WAddr = 4'd2; we = 1; OutPortEn = 0; next_state = S2; end S2: begin RFSrcMuxSel = 1; RAddr1 = 4'd0; RAddr2 = 4'd0; WAddr = 4'd3; we = 1; OutPortEn = 0; next_state = S3; end S3: begin RFSrcMuxSel = 0; RAddr1 = 4'd1; RAddr2 = 4'd0; WAddr = 4'd0; we = 0; OutPortEn = 0; if (R1Le10) next_state = S4; else next_state = S7; end S4: begin RFSrcMuxSel = 0; RAddr1 = 4'd1; RAddr2 = 4'd2; WAddr = 4'd2; we = 1; OutPortEn = 0; next_state = S5; end S5: begin RFSrcMuxSel = 0; RAddr1 = 4'd1; RAddr2 = 4'd3; WAddr = 4'd1; we = 1; OutPortEn = 0; next_state = S6; end S6: begin RFSrcMuxSel = 0; RAddr1 = 4'd2; RAddr2 = 4'd0; WAddr = 4'd0; we = 0; OutPortEn = 1; next_state = S3; end S7: begin RFSrcMuxSel = 0; RAddr1 = 4'd0; RAddr2 = 4'd0; WAddr = 4'd0; we = 0; OutPortEn = 0; next_state = S7; end endcase end endmodule < Code : DedicatedProcessor > `timescale 1ns / 1ps module DedicatedProcessor ( input logic clk, input logic reset, output logic [7:0] OutPort ); logic RFSrcMuxSel; logic [2:0] RAddr1; logic [2:0] RAddr2; logic [2:0] WAddr; logic we; logic OutPortEn; logic R1Le10; DataPath U_DataPath (.*); ControlUnit U_ControlUnit (.*); endmodule < Commnet > RegFile์ i, sum, (ํ์ ์) ์์ ๋ ์ง์คํฐ๋ฅผ ๋ฐฐ์นํ๊ณ , RAddr1/2๋ก ๋ ํผ์ฐ์ฐ์๋ฅผ ์ ํ, WAddr๋ก ์ฐ์ฐ ๊ฒฐ๊ณผ์ ๋ชฉ์ ์ง๋ฅผ ์ง์ ํ๋ค. RFSrcMux๋ ์ฐ์ฐ ๊ฒฐ๊ณผ(AddrResult) ๋๋ ์ฆ์น๊ฐ 1 ์ค ํ๋๋ฅผ Wdata๋ก ์ ํํด ์ด๊ธฐํ/์ฆ๊ฐ๋ฅผ ๋ชจ๋ ํ๋์ Adder๋ก ์ฒ๋ฆฌํ ์ ์๊ฒ ํ๋ค. OutPort๋ RData1์ ์ํ/ํ๋ํ์ฌ ์ธ๋ถ๋ก ์์ ์ ์ผ๋ก ์ถ๋ ฅํ๋ค(Enable๋ก ์ถ๋ ฅ ํ์ด๋ฐ ์ ์ด). < ๊ณ ์ฐฐ > ์ ์ฐ์ฑ: ์ฃผ์๋ง ๋ฐ๊ฟ i, sum, ์์ ๋ฑ ๋ค์ํ ์กฐํฉ์ ๊ฐ์ ํ๋์จ์ด๋ก ์ฒ๋ฆฌ ์์ ๊ณต์ : Adder 1๊ฐ๋ก ์ฆ๊ฐ์ ๋์ ์ ๋ชจ๋ ์ํ โ ๋ฉด์ ์ ์ฝ ๊ฐ๋ ์ฑ/ํ์ฅ์ฑ: ์์ 0์ ์ฃผ์ 0๋ก, ์์ 1์ ํ ๋ฒ ๊ธฐ๋ก ํ ์ฌ์ฌ์ฉํ๋ ํจํด์ผ๋ก ์ปจํธ๋กค์ด ๋จ์ < Video > < ํ์ผ > sources (Homework) top.sv ControlUnit.sv DataPath.sv DedicatedProcessor.sv fndController.sv constrs (Homework) Basys-3-Master.xdc Homework_2 < Design Specification > ALU๋ฅผ ๋ง๋ค์ด DedicatedProcessor ์ค๊ณ R1 = 1, R2 = 0, R3 = 0, R4 = 0 R2 = R1 + R1 R3 = R2 + R1 R4 = R3 - R1 R1 = R1 | R2 R4 < R2; // Yes: R4 = R3 - R1; // No: R4 = R4 & R3; R4 = R4 & R3 R4 = R2 + R3 R2 < R4 // Yes: R2 = R1 + R1; // No: hlat hlat < Data Path > < ASM > < Code : ControlUnit > `timescale 1ns / 1ps module ControlUnit ( input logic clk, input logic reset, input logic lte, output logic RFSrcMuxSel, output logic [2:0] RAddr1, output logic [2:0] RAddr2, output logic [2:0] WAddr, output logic we, output logic OutPortEn, output logic [1:0] ALUop ); typedef enum { S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10, S11, S12, S13 } state_e; state_e state, next_state; always_ff @(posedge clk, posedge reset) begin if (reset) begin state <= S0; end else begin state <= next_state; end end always_comb begin next_state = state; RFSrcMuxSel = 0; RAddr1 = 4'd0; RAddr2 = 4'd0; WAddr = 4'd0; we = 0; OutPortEn = 0; ALUop = 4'd0; case (state) S0: begin // R1 = 1 RFSrcMuxSel = 1; RAddr1 = 4'd0; RAddr2 = 4'd0; WAddr = 4'd1; we = 1; OutPortEn = 0; ALUop = 4'd0; next_state = S1; end S1: begin // R2 = 0 RFSrcMuxSel = 0; RAddr1 = 4'd0; RAddr2 = 4'd0; WAddr = 4'd2; we = 1; OutPortEn = 0; ALUop = 4'd0; next_state = S2; end S2: begin // R3 = 0 RFSrcMuxSel = 0; RAddr1 = 4'd0; RAddr2 = 4'd0; WAddr = 4'd3; we = 1; OutPortEn = 0; ALUop = 4'd0; next_state = S3; end S3: begin // R4 = 0 RFSrcMuxSel = 0; RAddr1 = 4'd0; RAddr2 = 4'd0; WAddr = 4'd4; we = 1; OutPortEn = 0; ALUop = 4'd0; next_state = S4; end S4: begin // R2 = R1 + R1 RFSrcMuxSel = 0; RAddr1 = 4'd1; RAddr2 = 4'd1; WAddr = 4'd2; we = 1; OutPortEn = 0; ALUop = 4'd0; next_state = S5; end S5: begin // R3 = R2 + R1 RFSrcMuxSel = 0; RAddr1 = 4'd2; RAddr2 = 4'd1; WAddr = 4'd3; we = 1; OutPortEn = 0; ALUop = 4'd0; next_state = S6; end S6: begin // R4 = R3 = R1 RFSrcMuxSel = 0; RAddr1 = 4'd3; RAddr2 = 4'd1; WAddr = 4'd4; we = 1; OutPortEn = 0; ALUop = 4'd1; next_state = S7; end S7: begin // R1 = R1 | R2 RFSrcMuxSel = 0; RAddr1 = 4'd1; RAddr2 = 4'd2; WAddr = 4'd1; we = 1; OutPortEn = 0; ALUop = 4'd3; next_state = S8; end S8: begin // R4 < R2 RFSrcMuxSel = 0; RAddr1 = 4'd4; RAddr2 = 4'd2; WAddr = 4'd0; we = 0; OutPortEn = 0; ALUop = 4'd0; if (lte) next_state = S5; else next_state = S9; end S9: begin // R4 = R4 & R3 RFSrcMuxSel = 0; RAddr1 = 4'd4; RAddr2 = 4'd3; WAddr = 4'd4; we = 1; OutPortEn = 0; ALUop = 4'd2; next_state = S10; end S10: begin // R4 = R2 + R3 RFSrcMuxSel = 0; RAddr1 = 4'd2; RAddr2 = 4'd3; WAddr = 4'd4; we = 1; OutPortEn = 0; ALUop = 4'd0; next_state = S11; end S11: begin // OutProt = R4 RFSrcMuxSel = 0; RAddr1 = 4'd4; RAddr2 = 4'd0; WAddr = 4'd0; we = 0; OutPortEn = 1; ALUop = 4'd0; next_state = S12; end S12: begin // R2 < R4 RFSrcMuxSel = 0; RAddr1 = 4'd2; RAddr2 = 4'd4; WAddr = 4'd0; we = 0; OutPortEn = 0; ALUop = 4'd0; if (lte) next_state = S4; else next_state = S13; end S13: begin // half RFSrcMuxSel = 0; RAddr1 = 4'd0; RAddr2 = 4'd0; WAddr = 4'd0; we = 0; OutPortEn = 0; ALUop = 4'd0; next_state = S13; end endcase end endmodule < Code : Data Path > //... module ALU ( input logic [1:0] sel, input logic [7:0] a, input logic [7:0] b, output logic [7:0] alu_result ); always_comb begin alu_result = a + b; case (sel) 2'd0: alu_result = a + b; 2'd1: alu_result = a - b; 2'd2: alu_result = a & b; 2'd3: alu_result = a | b; endcase end endmodule //... < Schematic > < Comment > ๋ฐ๋ณต๋ณ ๋ ์ง์คํฐ ๊ฐ 1ํ: R1=3, R2=2, R3=3, R4=5 โ Yes 2ํ: R1=7, R2=6, R3=9, R4=15 โ Yes 3ํ: R1=15, R2=14, R3=21, R4=35 โ Yes 4ํ: R1=31, R2=30, R3=45, R4=75 โ Yes 5ํ: R1=63, R2=62, R3=93, R4=155 โ Yes 6ํ: R1=127, R2=126, R3=189, R4=59 โ No โ halt ์ฒซ ๋ฒ์งธ ๋ฐ๋ณต ์์ ๊ฐ: (R1, R2, R3, R4) = (1, 0, 0, 0) ๊ณ์ฐ ์์: R2 = R1 + R1 (1 + 1 = 2) โ (1, 2, 0, 0) R3 = R2 + R1 (2 + 1 = 3) โ (1, 2, 3, 0) R4 = R3 - R1 (3 - 1 = 2) โ (1, 2, 3, 2) R1 = R1 | R2 (1 | 2 = 3) โ (3, 2, 3, 2) R4 = R4 & R3 (2 & 3 = 2) โ (3, 2, 3, 2) R4 = R2 + R3 (2 + 3 = 5) โ (3, 2, 3, 5) ์กฐ๊ฑด ํ์ธ: R4 > R2 (5 > 2) โ Yes, ๊ณ์ ์งํ ๋ ๋ฒ์งธ ๋ฐ๋ณต ์์ ๊ฐ: (R1, R2, R3, R4) = (3, 2, 3, 5) ๊ณ์ฐ ์์: R2 = R1 + R1 (3 + 3 = 6) โ (3, 6, 3, 5) R3 = R2 + R1 (6 + 3 = 9) โ (3, 6, 9, 5) R4 = R3 - R1 (9 - 3 = 6) โ (3, 6, 9, 6) R1 = R1 | R2 (3 | 6 = 7) โ (7, 6, 9, 6) R4 = R4 & R3 (6 & 9 = 0) โ (7, 6, 9, 0) R4 = R2 + R3 (6 + 9 = 15) โ (7, 6, 9, 15) ์กฐ๊ฑด ํ์ธ: R4 > R2 (15 > 6) โ Yes, ๊ณ์ ์งํ ์ธ ๋ฒ์งธ ๋ฐ๋ณต ์์ ๊ฐ: (R1, R2, R3, R4) = (7, 6, 9, 15) ๊ณ์ฐ ์์: R2 = R1 + R1 (7 + 7 = 14) โ (7, 14, 9, 15) R3 = R2 + R1 (14 + 7 = 21) โ (7, 14, 21, 15) R4 = R3 - R1 (21 - 7 = 14) โ (7, 14, 21, 14) R1 = R1 | R2 (7 | 14 = 15) โ (15, 14, 21, 14) R4 = R4 & R3 (14 & 21 = 4) โ (15, 14, 21, 4) R4 = R2 + R3 (14 + 21 = 35) โ (15, 14, 21, 35) ์กฐ๊ฑด ํ์ธ: R4 > R2 (35 > 14) โ Yes, ๊ณ์ ์งํ ๋ค ๋ฒ์งธ ๋ฐ๋ณต ์์ ๊ฐ: (R1, R2, R3, R4) = (15, 14, 21, 35) ๊ณ์ฐ ์์: R2 = R1 + R1 (15 + 15 = 30) โ (15, 30, 21, 35) R3 = R2 + R1 (30 + 15 = 45) โ (15, 30, 45, 35) R4 = R3 - R1 (45 - 15 = 30) โ (15, 30, 45, 30) R1 = R1 | R2 (15 | 30 = 31) โ (31, 30, 45, 30) R4 = R4 & R3 (30 & 45 = 12) โ (31, 30, 45, 12) R4 = R2 + R3 (30 + 45 = 75) โ (31, 30, 45, 75) ์กฐ๊ฑด ํ์ธ: R4 > R2 (75 > 30) โ Yes, ๊ณ์ ์งํ ๋ค์ฏ ๋ฒ์งธ ๋ฐ๋ณต ์์ ๊ฐ: (R1, R2, R3, R4) = (31, 30, 45, 75) ๊ณ์ฐ ์์: R2 = R1 + R1 (31 + 31 = 62) โ (31, 62, 45, 75) R3 = R2 + R1 (62 + 31 = 93) โ (31, 62, 93, 75) R4 = R3 - R1 (93 - 31 = 62) โ (31, 62, 93, 62) R1 = R1 | R2 (31 | 62 = 63) โ (63, 62, 93, 62) R4 = R4 & R3 (62 & 93 = 28) โ (63, 62, 93, 28) R4 = R2 + R3 (62 + 93 = 155) โ (63, 62, 93, 155) ์กฐ๊ฑด ํ์ธ: R4 > R2 (155 > 62) โ Yes, ๊ณ์ ์งํ ์ฌ์ฏ ๋ฒ์งธ ๋ฐ๋ณต (๋ง์ง๋ง) ์์ ๊ฐ: (R1, R2, R3, R4) = (63, 62, 93, 155) ๊ณ์ฐ ์์ R2 = R1 + R1 (63 + 63 = 126) โ (63, 126, 93, 155) R3 = R2 + R1 (126 + 63 = 189) โ (63, 126, 189, 155) R4 = R3 - R1 (189 - 63 = 126) โ (63, 126, 189, 126) R1 = R1 | R2 (63 | 126 = 127) โ (127, 126, 189, 126) R4 = R4 & R3 (126 & 189 = 120) โ (127, 126, 189, 120) R4 = R2 + R3 (126 + 189 = 315) โ (127, 126, 189, 59) ์กฐ๊ฑด ํ์ธ: R4 > R2 (59 > 126) โ No, ์ค๋จ (Halt) 8bit Wrapping (์ค๋ฒํ๋ก์ฐ): 8๋นํธ ๋ ์ง์คํฐ๋ 255๊น์ง๋ง ํํ ๊ฐ๋ฅํ๋ฏ๋ก, 315๋ 256์ ๋บ ๋๋จธ์ง ๊ฐ์ธ 59๊ฐ ๋๋ค. < ํ์ผ > sources (Homework) ControlUnit.sv DataPath.sv DedicatedProcessor.sv simulation (Homework) DedicatedProcessor_tb.sv
Final
ยท 2025-08-12
2025-08-11
Uart + UpDownCounter Design < Block Design > < Code : uart > `timescale 1ns / 1ps module uart ( // global signal input logic clk, input logic reset, // transmitter signal input logic start, input logic [7:0] tx_data, output logic tx_busy, output logic tx_done, output logic tx, // receiver signal output logic [7:0] rx_data, output logic rx_done, input logic rx ); logic br_tick; baudrate_gen U_BRAUD_GEN ( .clk (clk), .reset (reset), .br_tick(br_tick) ); transmitter U_Transmitter ( .clk (clk), .reset (reset), .br_tick(br_tick), .start (start), .tx_data(tx_data), .tx_busy(tx_busy), .tx_done(tx_done), .tx (tx) ); receiver U_Receiver ( .clk (clk), .reset (reset), .br_tick(br_tick), .rx_data(rx_data), .rx_done(rx_done), .rx (rx) ); endmodule module baudrate_gen ( input logic clk, input logic reset, output logic br_tick ); logic [$clog2(100_000_000 / 9600 / 16)-1:0] br_counter; //logic [3:0] br_counter; always_ff @(posedge clk, posedge reset) begin if (reset) begin br_counter <= 0; br_tick <= 1'b0; end else begin if (br_counter == 100_000_000 / 9600 / 16 - 1) begin //if (br_counter == 10 - 1) begin br_counter <= 0; br_tick <= 1'b1; end else begin br_counter <= br_counter + 1; br_tick <= 1'b0; end end end endmodule module transmitter ( input logic clk, input logic reset, input logic br_tick, input logic start, input logic [7:0] tx_data, output logic tx_busy, output logic tx_done, output logic tx ); typedef enum { IDLE, START, DATA, STOP } tx_state_e; tx_state_e tx_state, tx_next_state; logic [7:0] temp_data_reg, temp_data_next; logic tx_reg, tx_next; logic [3:0] tick_cnt_reg, tick_cnt_next; logic [2:0] bit_cnt_reg, bit_cnt_next; logic tx_done_reg, tx_done_next; logic tx_busy_reg, tx_busy_next; assign tx = tx_reg; assign tx_busy = tx_busy_reg; assign tx_done = tx_done_reg; always_ff @(posedge clk, posedge reset) begin if (reset) begin tx_state <= IDLE; temp_data_reg <= 0; tx_reg <= 1'b1; tick_cnt_reg <= 0; bit_cnt_reg <= 0; tx_done_reg <= 0; tx_busy_reg <= 0; end else begin tx_state <= tx_next_state; temp_data_reg <= temp_data_next; tx_reg <= tx_next; tick_cnt_reg <= tick_cnt_next; bit_cnt_reg <= bit_cnt_next; tx_done_reg <= tx_done_next; tx_busy_reg <= tx_busy_next; end end always_comb begin tx_next_state = tx_state; temp_data_next = temp_data_reg; tx_next = tx_reg; tick_cnt_next = tick_cnt_reg; bit_cnt_next = bit_cnt_reg; tx_done_next = tx_done_reg; tx_busy_next = tx_busy_reg; case (tx_state) IDLE: begin tx_next = 1'b1; tx_done_next = 0; tx_busy_next = 0; if (start) begin tx_next_state = START; temp_data_next = tx_data; tick_cnt_next = 0; bit_cnt_next = 0; tx_busy_next = 1; end end START: begin tx_next = 1'b0; if (br_tick) begin if (tick_cnt_reg == 15) begin tx_next_state = DATA; tick_cnt_next = 0; end else begin tick_cnt_next = tick_cnt_reg + 1; end end end DATA: begin tx_next = temp_data_reg[0]; if (br_tick) begin if (tick_cnt_reg == 15) begin tick_cnt_next = 0; if (bit_cnt_reg == 7) begin tx_next_state = STOP; bit_cnt_next = 0; end else begin temp_data_next = {1'b0, temp_data_reg[7:1]}; bit_cnt_next = bit_cnt_reg + 1; end end else begin tick_cnt_next = tick_cnt_reg + 1; end end end STOP: begin tx_next = 1'b1; if (br_tick) begin if (tick_cnt_reg == 15) begin tx_next_state = IDLE; tx_done_next = 1; tx_busy_next = 0; tick_cnt_next = 0; end else begin tick_cnt_next = tick_cnt_reg + 1; end end end endcase end endmodule module receiver ( input logic clk, input logic reset, input logic br_tick, output logic [7:0] rx_data, output logic rx_done, input logic rx ); typedef enum { IDLE, START, DATA, STOP } rx_state_e; rx_state_e rx_state, rx_next_state; logic [4:0] tick_cnt_reg, tick_cnt_next; logic [2:0] bit_cnt_reg, bit_cnt_next; logic [7:0] rx_data_reg, rx_data_next; logic rx_done_next, rx_done_reg; assign rx_data = rx_data_reg; assign rx_done = rx_done_reg; always_ff @(posedge clk, posedge reset) begin if (reset) begin rx_state <= IDLE; tick_cnt_reg <= 0; bit_cnt_reg <= 0; rx_data_reg <= 0; rx_done_reg <= 0; end else begin rx_state <= rx_next_state; tick_cnt_reg <= tick_cnt_next; bit_cnt_reg <= bit_cnt_next; rx_data_reg <= rx_data_next; rx_done_reg <= rx_done_next; end end always_comb begin rx_next_state = rx_state; rx_done_next = rx_done; tick_cnt_next = tick_cnt_reg; bit_cnt_next = bit_cnt_reg; rx_data_next = rx_data_reg; case (rx_state) IDLE: begin rx_done_next = 0; if (rx == 1'b0) begin rx_next_state = START; tick_cnt_next = 0; bit_cnt_next = 0; rx_data_next = 0; end end START: begin if (br_tick) begin if (tick_cnt_reg == 7) begin tick_cnt_next = 0; rx_next_state = DATA; end else begin tick_cnt_next = tick_cnt_reg + 1; end end end DATA: begin if (br_tick) begin if (tick_cnt_reg == 15) begin tick_cnt_next = 0; rx_data_next = {rx, rx_data_reg[7:1]}; if (bit_cnt_reg == 7) begin bit_cnt_next = 0; rx_next_state = STOP; end else begin bit_cnt_next = bit_cnt_reg + 1; end end else begin tick_cnt_next = tick_cnt_reg + 1; end end end STOP: begin if (br_tick) begin if (tick_cnt_reg == 23) begin tick_cnt_next = 0; rx_done_next = 1; rx_next_state = IDLE; end else begin tick_cnt_next = tick_cnt_reg + 1; end end end endcase end endmodule < Simulation : uart > < Code : UpDownCounter > `timescale 1ns / 1ps module UpDownCounter ( input logic clk, input logic reset, input logic btn_mode, input logic btn_run_stop, input logic btn_clear, input logic [ 7:0] rx_data, input logic rx_done, output logic [ 1:0] led_mode, output logic [ 1:0] led_run_stop, output logic [13:0] count ); logic tick_10hz; logic mode, run_stop, clear; clk_div_10hz U_CLK_DIV_10hz ( .clk (clk), .reset (reset), .run_stop (run_stop), .clear (clear), .tick_10hz(tick_10hz) ); up_down_counter U_UP_DOWN_COUNTER ( .clk (clk), .reset(reset), .tick (tick_10hz), .mode (mode), .clear(clear), .count(count) ); control_unit U_CU ( .clk (clk), .reset (reset), .btn_mode (btn_mode), .btn_run_stop(btn_run_stop), .btn_clear (btn_clear), .rx_data (rx_data), .rx_done (rx_done), .mode (mode), .run_stop (run_stop), .clear (clear), .led_mode (led_mode), .led_run_stop(led_run_stop) ); endmodule // ... module control_unit ( input logic clk, input logic reset, input logic btn_mode, input logic btn_run_stop, input logic btn_clear, input logic [7:0] rx_data, input logic rx_done, output logic mode, output logic run_stop, output logic clear, output logic [1:0] led_mode, output logic [1:0] led_run_stop ); /************************** MODE FSM **************************/ typedef enum { UP, DOWN } state_mode_e; state_mode_e state_mode, next_state_mode; // transition logic always_ff @(posedge clk, posedge reset) begin if (reset) begin state_mode <= UP; end else begin state_mode <= next_state_mode; end end // output logic always_comb begin next_state_mode = state_mode; mode = 0; led_mode = 2'b00; case (state_mode) UP: begin led_mode = 2'b01; mode = 0; if (btn_mode) begin next_state_mode = DOWN; end if (rx_done) begin if (rx_data == 8'h4d || rx_data == 8'h6d) begin // M, m next_state_mode = DOWN; end end end DOWN: begin led_mode = 2'b10; mode = 1; if (btn_mode) begin next_state_mode = UP; end if (rx_done) begin if (rx_data == 8'h4d || rx_data == 8'h6d) begin // M, m next_state_mode = UP; end end end endcase end /********************* RUN STOP CLEAR FSM *********************/ typedef enum { STOP, RUN, CLEAR } state_counter_e; state_counter_e state_counter, next_state_counter; always_ff @(posedge clk, posedge reset) begin if (reset) begin state_counter <= STOP; end else begin state_counter <= next_state_counter; end end always_comb begin next_state_counter = state_counter; run_stop = 0; clear = 0; led_run_stop = 2'b00; case (state_counter) STOP: begin led_run_stop = 2'b01; if (btn_run_stop) next_state_counter = RUN; else if (btn_clear) next_state_counter = CLEAR; if (rx_done) begin if (rx_data == 8'h52 || rx_data == 8'h72) begin // R, r next_state_counter = RUN; end end if (rx_done) begin if (rx_data == 8'h43 || rx_data == 8'h63) begin // C, c next_state_counter = CLEAR; end end end RUN: begin run_stop = 1; led_run_stop = 2'b10; if (btn_run_stop) next_state_counter = STOP; if (rx_done) begin if (rx_data == 8'h53 || rx_data == 8'h73) begin // S, s next_state_counter = STOP; end end end CLEAR: begin clear = 1; next_state_counter = STOP; end endcase end endmodule < Schematic > < ํ์ผ > sources (Class) top_UpDownCounter.sv uart.sv button_detector.sv UpDownCounter.sv tfndController.svext simulation (Class) uart_tb.sv constrs (Class) Basys-3-Master.xdc CPU CISC(Complex Instruction Set Computer) micro processor์๊ฒ ๋ช ๋ น์ ๋ด๋ฆฌ๋๋ฐ ํ์ํ ๋ชจ๋ ๋ช ๋ น์ด ์ ์ ๊ฐ์ถ๊ณ ์๋ processor์ด๋ค. ๋ฐ๋ผ์ ๋ณต์กํ๊ณ ๊ธฐ๋ฅ์ด ๋ง์ ๋ช ๋ น์ด๋ก ๊ตฌ์ฑ๋์ด์๋ค. ๊ณผ๊ฑฐ์๋ ์ปดํจํฐ ๋ฉ๋ชจ๋ฆฌ ์ฉ๋์ด ํฌ์ง ์์์ sw ํ๋ก๊ทธ๋จ์ ์ฉ๋์ ์ค์ด๊ธฐ ์ํด ํ๋์ ๋ช ๋ น์ด๋ก ์ฌ๋ฌ ์์ ์ ์ํํ๋๋ก ํ๊ธฐ ๋๋ฌธ์ CISC๋ฅผ ๋ง์ด ์ฌ์ฉํ์๋ค. ์ฅ์ : ๋ณตํฉ์ ์ด๊ณ ๊ธฐ๋ฅ์ด ๋ง๊ธฐ ๋๋ฌธ์ ํ์ ํธํ์ฑ?์ด ์ข๋ค. ๋ฐ๋ผ์ ํธํ์ฑ์ด ์ ๋์ ์ผ๋ก ํ์ํ PC ํ๊ฒฝ์์๋ CISC๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค. ๋จ์ : ํ์ง๋ง ํธ๋์ง์คํฐ ์ง์ ์ ์์ด์ ํจ์จ์ฑ์ด ๋จ์ด์ง๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ ํฅ์์ ๋ฐฉํดํ๋ ์์ธ์ด ๋ ์ ์์ผ๋ฉฐ, ์ ๋ ฅ ์๋ชจ๊ฐ ํฌ๊ณ , ๊ฐ๊ฒฉ์ด ๋น์ธ๋ค๋ ๋ฑ์ ๋จ์ ์ด ์๋ค. ์ฉ๋: ๋ค์ํ ๋ช ๋ น์ด๋ฅผ ํฌํจํ๊ณ ์์ด ์ผ๋ฐ์ ์ผ๋ก ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ๋ ๋ฒ์ฉ ์ปดํจํฐ(general purpose computer)์ CPU๋ก ๋ง์ด ์ฌ์ฉ๋๋ค. RISC(Reduced Instruction Set Computer) CISC ๋ด๋ถ์ ๊ฐ์ถ์ด์ง ๋ชจ๋ ๋ช ๋ น์ด๋ค ์ค ๋ถ๊ณผ 20%์ ํด๋นํ๋ ๋ช ๋ น์ด๋ค๋ง์ด ์ ์ฒด 80% ์ด์์ ์ผ์ ์ฒ๋ฆฌํ๋ค. ๋ฐ๋ผ์ CISC์ ๊ฐ์ด ํ์ํ ๋ชจ๋ ๋ช ๋ น์ด ์ ์ ๊ฐ๊ณ ์๋ ๊ฒ์ ๋นํจ์จ์ ์ผ ์ ์๋ค. ์ด๋ฅผ ๊ทน๋ณตํ๊ธฐ ์ํด ๋ฑ์ฅํ ๊ฒ์ด RISC์ด๋ค. ์ฅ์ : RISC๋ ์ ์ ์์ ๋ช ๋ น์ด๋ค(์ฌ์ฉ ๋น๋๊ฐ ๋์ 20%์ ๋ช ๋ น์ด๋ค)๋ก ๊ตฌ์ฑ๋ processor์ด๋ค. ๋ฐ๋ผ์ CISC๋ณด๋ค ๋ ๋น ๋ฅธ ์๋?๋ก ๋์ํ ์ ์์ผ๋ฉฐ, ๋จ์ํ๊ณ , ์ ๋ ฅ์๋ชจ๊ฐ ์ ๊ณ , ๊ฐ๊ฒฉ๋ ์ ๋ ดํ๋ค. (Tr ๊ฐฏ์ โ) ๋จ์ : ํ์ง๋ง ํ๋์จ์ด๊ฐ ๊ฐ๋จํ ๋์ ์ํํธ์จ์ด(Compiler)๊ฐ ํฌ๊ณ ๋ณต์กํด์ก์ผ๋ฉฐ, ํ์ ํธํ์ฑ์ด ๋ถ์กฑํ๋ค๋ ๋จ์ ์ด ์๋ค. ์ฉ๋: RISC ๊ตฌ์กฐ๋ ํ์ดํ๋ผ์ธ ์ค์ฒฉ์ด ๊ฐ๋ฅํด์ ๊ฐ์ ์์ ๋ช ๋ น์ด์ ๋ํด ์ ์ clock์ผ๋ก ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ฉฐ ๋ฐ์ด๊ณผ ์ ๋ ฅ ์๋ชจ๋ ์ค์ผ ์ ์๋ค. ๋ฐ๋ผ์ ์๋ฒ ๋๋ ํ๋ก์ธ์์์๋ RISC ๊ตฌ์กฐ๋ฅผ ๋ง์ด ์ฌ์ฉํ๋ค. (MIPS, ARM) ์์ผ๋ก์ ํ์ต ๋ฐ ๊ตฌํ ๊ณํ RISC-V Instruction Set ์ดํด RV32I (Base Integer ISA) ๊ตฌํ 1.Single-Cycle Processor (๋ชจ๋ ๋ช ๋ น์ด๋ฅผ 1 ํด๋ญ ๋ด์ ์คํ) 2.Multi-Cycle Processor (๋ช ๋ น์ด ์ข ๋ฅ์ ๋ฐ๋ผ ์คํ ํด๋ญ ์๊ฐ ๋ค๋ฆ) 3.Pipeline ๊ตฌ์กฐ CPU (์ ํ ์ฌํญ / ๋ฏธ๊ตฌํ ์์ ) DedicatedProcessor_Counter Design < Design Specification > 0~9 ๊น์ง ์นด์ดํธํ๋ Processor๋ฅผ ์ค๊ณ A = 0 (Data) < C ์ธ์ด > A = 0; while (A < 10) { output = A; A = A + 1; } halt; < Data Path > < ASM > < Code : DedicatedProcessor_Counter > `timescale 1ns / 1ps module DedicatedProcessor_Counter ( input logic clk, input logic reset, output logic [7:0] OutBuffer ); logic ASrcMuxSel; logic AEn; logic ALt10; logic OutBufEn; logic [$clog2(10_000_000)-1:0] div_counter; logic clk_10hz; always_ff @(posedge clk, posedge reset) begin if (reset) begin div_counter <= 0; end else begin if (div_counter == 10_000_000 - 1) begin div_counter <= 0; clk_10hz <= 1'b1; end else begin div_counter <= div_counter + 1; clk_10hz <= 1'b0; end end end ControlUnit U_ControlUnit ( .clk(clk_10hz), // bitstream .* ); DataPath U_DataPath ( .clk(clk_10hz), // bitstream .* ); endmodule module Register ( input logic clk, input logic reset, input logic en, input logic [7:0] d, output logic [7:0] q ); always_ff @(posedge clk, posedge reset) begin if (reset) begin q <= 0; end else begin if (en) begin q <= d; end end end endmodule module Mux_2x1 ( input logic sel, input logic [7:0] x0, input logic [7:0] x1, output logic [7:0] y ); always_comb begin y = 8'b0; case (sel) 1'b0: y = x0; 1'b1: y = x1; endcase end endmodule module Adder ( input logic [7:0] a, input logic [7:0] b, output logic [7:0] sum ); assign sum = a + b; endmodule module Comparator ( input logic [7:0] a, input logic [7:0] b, output logic lt ); assign lt = a < b; endmodule module OutBuf ( input logic en, input logic [7:0] x, output logic [7:0] y ); assign y = en ? x : 8'bx; endmodule module ControlUnit ( input logic clk, input logic reset, input logic ALt10, output logic ASrcMuxSel, output logic AEn, output logic OutBufEn ); typedef enum { S0, S1, S2, S3, S4 } state_e; state_e state, next_state; always_ff @(posedge clk, posedge reset) begin if (reset) begin state <= S0; end else begin state <= next_state; end end always_comb begin ASrcMuxSel = 0; AEn = 0; OutBufEn = 0; next_state = state; case (state) S0: begin ASrcMuxSel = 0; AEn = 1; OutBufEn = 0; next_state = S1; end S1: begin ASrcMuxSel = 1; AEn = 0; OutBufEn = 0; if (ALt10) next_state = S2; else next_state = S4; end S2: begin ASrcMuxSel = 1; AEn = 0; OutBufEn = 1; next_state = S3; end S3: begin ASrcMuxSel = 1; AEn = 1; OutBufEn = 0; next_state = S1; end S4: begin ASrcMuxSel = 1; AEn = 0; OutBufEn = 0; next_state = S4; end endcase end endmodule module DataPath ( input logic clk, input logic reset, input logic ASrcMuxSel, input logic AEn, input logic OutBufEn, output logic ALt10, output logic [7:0] OutBuffer ); logic [7:0] AdderResult, ASrcMuxOut, ARegOut; Mux_2x1 U_ASrcMux ( .sel(ASrcMuxSel), .x0 (8'b0), .x1 (AdderResult), .y (ASrcMuxOut) ); Register U_A_Reg ( .clk (clk), .reset(reset), .en (AEn), .d (ASrcMuxOut), .q (ARegOut) ); Comparator U_ALt10 ( .a (ARegOut), .b (8'd10), .lt(ALt10) ); Adder U_Adder ( .a (ARegOut), .b (8'd1), .sum(AdderResult) ); // OutBuf U_OutBuf ( // .en(OutBufEn), // .x (ARegOut), // .y (OutBuffer) // ); Register U_OutReg ( .clk (clk), .reset(reset), .en (OutBufEn), .d (ARegOut), .q (OutBuffer) ); endmodule < Comment > DataPath Comparator ์ถ๋ ฅ(ALt10)์ C์ while (A < 10)์ ํ๋์จ์ด๋ก ์นํํ ์ ์ด ๋ถ๊ธฐ ์ ๋ ฅ์ผ๋ก ํ์๋ค. ๋ ์ง์คํฐ๋ณ Enable์ A ์ ๋ฐ์ดํธ์ ์ถ๋ ฅ ์ํ๋ง์ ํ์ด๋ฐ์ ๋ ๋ฆฝ ์ ์ดํด ์ ํํ ์์ยท์ ์งยท์ด๊ธฐํ๋ฅผ ๋ณด์ฅํ๋ค. ๋์ผ ์ฃ์ง์์ OutReg์ AReg๋ฅผ ํจ๊ป ์ํ๋งํจ์ผ๋ก์จ C์ โoutput=A; A=A+1;โ๋ฅผ ํด๋ญ ํ๋๋ก ์ ํํ ๊ตฌํํ๋ค. < Schematic > < Simulation > < ํ์ผ > sources (Class) DedicatedProcessor_Counter.sv simulation (Class) DedicatedProcessor_Counter_tb.sv constrs (Class) Basys-3-Master.xdc Homework < Design Specification > 0+1+2+3+โฆ+9+10 = 55 ์ ๊ฐ์ด ๋์ ์ผ๋ก ๋ง์ ๊ฒฐ๊ณผ ์ถ๋ ฅ์ด ๋๋๋ก ๊ตฌํ FND์ ๋์ ๊ฐ์ ์ถ๋ ฅ < C ์ธ์ด > a = 0; b = 0; while (a <= 10) { b = b + a; // ๋์ a = a + 1; // ์ฆ๊ฐ } output = b; // 55 < Data Path > < ASM > < Code : top > `timescale 1ns / 1ps module top ( input logic clk, input logic reset, output logic [3:0] fndCom, output logic [7:0] fndFont ); logic [7:0] data; DedicatedProcessor U_DedicatedProcessor ( .clk(clk), .reset(reset), .OutBuffer(data) ); fndController U_fndController ( .clk(clk), .reset(reset), .number(data), .fndCom(fndCom), .fndFont(fndFont) ); endmodule < Code : DedicatedProcessor (DataPath) > //... module DataPath ( input logic clk, input logic reset, input logic ASrcMuxSel, input logic AEn, input logic OutBufEn, output logic ALt10, output logic [7:0] OutBuffer ); logic [7:0] AdderResult, ASrcMuxOut, ARegOut; logic [7:0] SumResult, BSrcMuxOut, BRegOut; Mux_2x1 U_ASrcMux ( .sel(ASrcMuxSel), .x0 (8'b0), .x1 (AdderResult), .y (ASrcMuxOut) ); Register U_A_Reg ( .clk (clk), .reset(reset), .en (AEn), .d (ASrcMuxOut), .q (ARegOut) ); Comparator U_ALt10 ( .a (ARegOut), .b (8'd11), // 8'd11 .lt(ALt10) ); Adder U_Adder ( .a (ARegOut), .b (8'd1), .sum(AdderResult) ); // OutBuf U_OutBuf ( // .en(OutBufEn), // .x (ARegOut), // .y (OutBuffer) // ); // Register U_OutReg ( // .clk (clk), // .reset(reset), // .en (OutBufEn), // .d (ARegOut), // .q (OutBuffer) // ); /*************** B ***************/ Mux_2x1 U_BSrcMux ( .sel(ASrcMuxSel), .x0 (8'b0), .x1 (SumResult), .y (BSrcMuxOut) ); Register U_B_Reg ( .clk (clk), .reset(reset), .en (AEn), .d (BSrcMuxOut), .q (BRegOut) ); Adder U_Sum ( .a (AdderResult), .b (BRegOut), .sum(SumResult) ); Register U_OutReg ( .clk (clk), .reset(reset), .en (OutBufEn), .d (BRegOut), .q (OutBuffer) ); endmodule //... < Comment > DataPath ๋์ ๊ฐ(B)์ ํ์ฌ ํญ(A ๋๋ A+1)์ ๋ํ๋ ๋ง์ ๊ธฐ์ ๋์ ๊ฐ์ ์ ์ฅํ๋ ๋ ์ง์คํฐ(B Reg)๋ฅผ ์ถ๊ฐ A์ B๋ ๋์ผํ Enable(AEn)๊ณผ ์ด๊ธฐํ ๊ฒฝ๋ก(ASrcMuxSel=0)๋ฅผ ๊ณต์ ํ์ฌ ๋ฃจํ ๊ฐฑ์ ์ ๋์ ์ ๋ฐ์ดํธ๊ฐ ๊ฐ๋ฅ ์ถ๋ ฅ ๋ ์ง์คํฐ๋ฅผ ๋์ด ๊ธ๋ฆฌ์น ๋ฐฉ์ง์ ํ์ด๋ฐ ์ฌ์ ๋ฅผ ํ๋ณด < simulation > < Video > < ๊ณ ์ฐฐ > DataPath์ ๋์ ๊ธฐ ๊ฒฝ๋ก๋ฅผ ์ถ๊ฐํจ์ผ๋ก์จ, ๋จ์ ์นด์ดํธ๊ฐ ์๋ ๋์ ์ฐ์ฐ๊น์ง ์ง์ํ๋ ๊ตฌ์กฐ๋ฅผ ๊ตฌํํ ์ ์์๋ค. ๊ฐ ๋ ์ง์คํฐ์ Enable๊ณผ ์กฐ๊ฑด ์ ์ด๋ฅผ ํตํด ์ถ๋ ฅ ์์ ์ฑ๊ณผ ์ฐ์ฐ ์ ํ์ฑ์ ํ๋ณดํ์๋ค. < ํ์ผ > sources (Homework) top.sv DedicatedProcessor.sv fndController.sv simulation (Homework) DedicatedProcessor_tb.sv constrs (Homework) Basys-3-Master.xdc
Final
ยท 2025-08-11
2025-08-08
Run_Stop_Clear_Counter Design < Code : UpDownCounter > `timescale 1ns / 1ps module UpDownCounter ( input logic clk, input logic reset, input logic btn_mode, input logic btn_run_stop, input logic btn_clear, output logic [ 1:0] led_mode, output logic [ 1:0] led_run_stop, output logic [13:0] count ); logic tick_10hz; logic mode, run_stop, clear; clk_div_10hz U_Clk_Div_10hz ( .clk (clk), .reset (reset), .run_stop (run_stop), .clear (clear), .tick_10hz(tick_10hz) ); up_down_counter U_Up_Down_Counter ( .clk (clk), .reset(reset), .tick (tick_10hz), .mode (mode), .clear(clear), .count(count) ); control_unit U_Control_Unit ( .clk (clk), .reset (reset), .btn_mode (btn_mode), .btn_run_stop(btn_run_stop), .btn_clear (btn_clear), .mode (mode), .run_stop (run_stop), .clear (clear), .led_mode (led_mode), .led_run_stop(led_run_stop) ); endmodule module clk_div_10hz ( input logic clk, input logic reset, input logic run_stop, input logic clear, output logic tick_10hz ); //logic [23:0] div_counter; logic [$clog2(10_000_000)-1:0] div_counter; always_ff @(posedge clk, posedge reset) begin if (reset) begin div_counter <= 0; tick_10hz <= 1'b0; end else begin if (run_stop) begin if (div_counter == 10_000_000 - 1) begin div_counter <= 0; tick_10hz <= 1'b1; end else begin div_counter <= div_counter + 1; tick_10hz <= 1'b0; end end if (clear) begin div_counter <= 0; tick_10hz <= 1'b0; end end end endmodule module up_down_counter ( input logic clk, input logic reset, input logic tick, input logic mode, input logic clear, output logic [13:0] count ); always_ff @(posedge clk, posedge reset) begin if (reset) begin count <= 0; end else begin if (clear) begin count <= 0; end if (mode == 1'b0) begin // up counter if (tick) begin if (count == 9999) begin count <= 0; end else begin count <= count + 1; end end end else begin // down counter if (tick) begin if (count == 0) begin count <= 9999; end else begin count <= count - 1; end end end end end endmodule module control_unit ( input logic clk, input logic reset, input logic btn_mode, input logic btn_run_stop, input logic btn_clear, output logic mode, output logic run_stop, output logic clear, output logic [1:0] led_mode, output logic [1:0] led_run_stop ); /******************** MODE FSM ********************/ typedef enum { UP, DOWN } state_mode_e; state_mode_e state_mode, next_state_mode; // state memory always_ff @(posedge clk, posedge reset) begin if (reset) begin state_mode <= UP; end else begin state_mode <= next_state_mode; end end // transition logic always_comb begin next_state_mode = state_mode; mode = 0; led_mode = 2'b00; case (state_mode) UP: begin led_mode = 2'b01; if (btn_mode) begin next_state_mode = DOWN; end end DOWN: begin mode = 1; led_mode = 2'b10; if (btn_mode) begin next_state_mode = UP; end end endcase end /******************** RUN STOP CLEAR FSM ********************/ typedef enum { STOP, RUN, CLEAR } state_counter_e; state_counter_e state_counter, next_state_counter; always_ff @(posedge clk, posedge reset) begin if (reset) begin state_counter <= STOP; end else begin state_counter <= next_state_counter; end end always_comb begin next_state_counter = state_counter; run_stop = 0; clear = 0; led_run_stop = 2'b00; case (state_counter) STOP: begin led_run_stop = 2'b01; if (btn_run_stop) next_state_counter = RUN; else if (btn_clear) next_state_counter = CLEAR; end RUN: begin run_stop = 1; led_run_stop = 2'b10; if (btn_run_stop) next_state_counter = STOP; end CLEAR: begin clear = 1; next_state_counter = STOP; end endcase end endmodule < Comment > clk_div_10hz run_stop๊ณผ clear ์ ํธ๋ฅผ ๋ฐ์ ์ํ์ ๋ฐ๋ผ ์นด์ดํฐ ๋์์ ์ ์ดํ๋ค. up_down_counter clear ์ ํธ๋ฅผ ๋ฐ์ ์นด์ดํฐ ๊ฐ์ ์ฆ์ ์ด๊ธฐํํ๋ค. โ ์๊ธฐ์น ์์ ์ํ์์๋ ์ํ๋ ์์ ์ ์นด์ดํฐ๋ฅผ ์์ ์ ์ผ๋ก ๋ฆฌ์ ํ ์ ์๋ค. control_unit ํ๋์ control_unit์์ ์ํ ๊ตฌ๋ถ์ฉ ์ ์ด ์ ํธ๋ฅผ ๋ฐ์ ์ฌ๋ฌ ๊ฐ์ FSM(mode, run/stop/clear)์ ๋์์ ์ฒ๋ฆฌํ๋ค. ๊ฐ FSM์์ led_mode์ led_run_stop ์ถ๋ ฅ์ ์ง์ ์์ฑํ๋๋ก ์ค๊ณํ์ฌ ๊ฐ๋ ์ฑ๊ณผ ์ง๊ด์ฑ์ด ํฅ์๋๋ค. < ํ์ผ > sources (Class) top_UpDownCounter.sv button_detector.sv UpDownCounter.sv fndController.sv constrs (Class) Basys-3-Master.xdc Serial ํต์ ํ๋กํ ์ฝ 1. UART ๋น๋๊ธฐ(Asynchronous) ํต์ ๋ฐฉ์ Baud rate(bps, bit per second) ์ค์ ๊ฐ์ ๋ฐ๋ผ ์ก์์ ์๋ ๊ฒฐ์ ์กยท์์ ์์ธก์ ์๋ ์ค์ ์ด ๋ค๋ฅด๋ฉด ํต์ ๋ถ๊ฐ ๋๊ธฐ ์ ํธ๊ฐ ์์ด ์๋ฌ์จ์ด ์๋์ ์ผ๋ก ๋์ ์ก์์ ์๋์ ์ ํ์ด ์์ 1:1 ํต์ ๋ง ๊ฐ๋ฅ (๋ฉํฐํฌ์ธํธ ๋ถ๊ฐ) ์กยท์์ ์ธก์์ ๋ด๋ถ ํด๋ญ์ ์์ฑํ์ฌ ํ์ด๋ฐ ์ ์ง 2. IยฒC ๋๊ธฐ(Synchronous) ํต์ ๋ฐฉ์ SCL(ํด๋ญ)๊ณผ SDA(๋ฐ์ดํฐ) 2์ ์ผ๋ก ๋์ ์ฌ๋ ์ด๋ธ ์ฃผ์(Address)๋ฅผ ์ง์ ํด ํต์ โ SPI๋ณด๋ค ์๋๊ฐ ๋๋ฆผ N:N ํต์ ๊ฐ๋ฅ (ํ๋์ ๋ฒ์ค์ ์ฌ๋ฌ ๋ง์คํฐยท์ฌ๋ ์ด๋ธ ์ฐ๊ฒฐ ๊ฐ๋ฅ) Chip Select ์ ํธ์ ๋ถํ์ (์ฃผ์๋ก ๊ตฌ๋ถ) ์ก์ ๋๋ ์์ ์ค ํ ๋ฐฉํฅ๋ง ๊ฐ๋ฅ (Half-duplex) 3. SPI ๋๊ธฐ(Synchronous) ํต์ ๋ฐฉ์ SCLK(ํด๋ญ), MOSI, MISO, CS(Chip Select) ์ ํธ ์ฌ์ฉ ํด๋ญ์ ๋ง์ถฐ ๋งค์ฐ ๋น ๋ฅธ ๋ฐ์ดํฐ ์ ์ก ๊ฐ๋ฅ โ ์ธ ๋ฐฉ์ ์ค ๊ฐ์ฅ ๋น ๋ฆ 1:N ํต์ (๋ง์คํฐ 1๊ฐ, ๋ค์ ์ฌ๋ ์ด๋ธ ๊ฐ๋ฅ) ์ฌ๋ ์ด๋ธ ์ ํ์ ์ํด Chip Select ์ ํธ์ ์ฌ์ฉ ์ก์์ ๋์ ๊ฐ๋ฅ (Full-duplex) UART / IยฒC / SPI ๋น๊ต ๊ตฌ๋ถ UART IยฒC SPI ํต์ ๋ฐฉ์ ๋น๋๊ธฐ ๋๊ธฐ ๋๊ธฐ ๋ฐ์ดํฐ์ Tx, Rx SDA, SCL MOSI, MISO, SCLK, CS ์๋ ๋ฎ์ ์ค๊ฐ ๋น ๋ฆ ํต์ ๊ตฌ์กฐ 1:1 N:N 1:N Chip Select X X O Duplex Full Half Full ์ฅ์ ๊ฐ๋จ, ๋ฐฐ์ ์ ์ ๋ฐฐ์ ์ ์, ๋ค์ค ์ง์ ๋น ๋ฆ, ๋์ ์ก์์ ๋จ์ ๋๋ฆผ, ๋ฉํฐ ๋ถ๊ฐ SPI๋ณด๋ค ๋๋ฆผ ๋ฐฐ์ ๋ง์, CS ๊ด๋ฆฌ ํ์ Uart (Transmitter) Design < Block Design > < FSM (Transmitter) > < ASM (Transmitter) > < Code : Uart (Transmitter) > `timescale 1ns / 1ps module uart ( input logic clk, input logic reset, input logic start, input logic [7:0] tx_data, output logic tx, output logic tx_busy, output logic tx_done ); logic br_tick; baudrate_gen U_Baudrate_Gen ( .clk (clk), .reset (reset), .br_tick(br_tick) ); transmitter U_Transmitter ( .clk (clk), .reset (reset), .br_tick(br_tick), .start (start), .tx_data(tx_data), .tx_busy(tx_busy), .tx_done(tx_done), .tx (tx) ); endmodule module baudrate_gen ( input logic clk, input logic reset, output logic br_tick ); //logic [$clog2(100_000_000/9600/16)-1:0] br_counter; logic [3:0] br_counter; always_ff @(posedge clk, posedge reset) begin if (reset) begin br_counter <= 0; br_tick <= 1'b0; end else begin //if (br_counter == 100_000_000 / 9600 / 16 - 1) begin // 9600hz 9600bps if (br_counter == 10 - 1) begin br_counter <= 0; br_tick <= 1'b1; end else begin br_counter <= br_counter + 1; br_tick <= 1'b0; end end end endmodule module transmitter ( input logic clk, input logic reset, input logic br_tick, input logic start, input logic [7:0] tx_data, output logic tx_busy, output logic tx_done, output logic tx ); typedef enum { IDLE, START, DATA, STOP } tx_state_e; tx_state_e tx_state, tx_next_state; logic [7:0] temp_data_next, temp_data_reg; logic tx_reg, tx_next; logic [3:0] tick_cnt_reg, tick_cnt_next; logic [2:0] bit_cnt_reg, bit_cnt_next; logic tx_done_reg, tx_done_next; logic tx_busy_reg, tx_busy_next; assign tx = tx_reg; assign tx_busy = tx_busy_reg; assign tx_done = tx_done_reg; always_ff @(posedge clk, posedge reset) begin if (reset) begin tx_state <= IDLE; temp_data_reg <= 0; tx_reg <= 1'b1; tick_cnt_reg <= 0; bit_cnt_reg <= 0; tx_done_reg <= 0; tx_busy_reg <= 0; end else begin tx_state <= tx_next_state; temp_data_reg <= temp_data_next; tx_reg <= tx_next; tick_cnt_reg <= tick_cnt_next; bit_cnt_reg <= bit_cnt_next; tx_done_reg <= tx_done_next; tx_busy_reg <= tx_busy_next; end end always_comb begin tx_next_state = tx_state; temp_data_next = temp_data_reg; tx_next = tx_reg; tick_cnt_next = tick_cnt_reg; bit_cnt_next = bit_cnt_reg; tx_done_next = tx_done_reg; tx_busy_next = tx_busy_reg; case (tx_state) IDLE: begin tx_next = 1'b1; tx_done_next = 0; tx_busy_next = 0; if (start) begin tx_next_state = START; temp_data_next = tx_data; tick_cnt_next = 0; bit_cnt_next = 0; tx_busy_next = 1; end end START: begin tx_next = 1'b0; if (br_tick) begin if (tick_cnt_reg == 15) begin tx_next_state = DATA; tick_cnt_next = 0; end else begin tick_cnt_next = tick_cnt_reg + 1; end end end DATA: begin tx_next = temp_data_reg[0]; if (br_tick) begin if (tick_cnt_reg == 15) begin tick_cnt_next = 0; if (bit_cnt_reg == 7) begin tx_next_state = STOP; bit_cnt_next = 0; end else begin temp_data_next = {1'b0, temp_data_reg[7:1]}; bit_cnt_next = bit_cnt_reg + 1; end end else begin tick_cnt_next = tick_cnt_reg + 1; end end end STOP: begin tx_next = 1'b1; if (br_tick) begin if (tick_cnt_reg == 15) begin tx_next_state = IDLE; tx_done_next = 1; tx_busy_next = 0; tick_cnt_next = 0; end else begin tick_cnt_next = tick_cnt_reg + 1; end end end endcase end endmodule < Comment > baudrate_gen ์์คํ ํด๋ญ(100 MHz)์์ UART ํต์ ์๋ 9600bps, 16๋ฐฐ ์ค๋ฒ์ํ๋ง(ํ์ค UART ์์ ๋ฐฉ์) ์กฐ๊ฑด์ ๋ง์ถฐ br_tick์ ์์ฑํ๋ ๋ชจ๋์ด๋ค. ์นด์ดํฐ ์ต๋๊ฐ์ 100_000_000 / 9600 / 16 - 1๋ก ์ค์ ํ์ฌ, ํด๋น ์ฃผ๊ธฐ๋ง๋ค br_tick์ 1ํด๋ญ ๋์ High๋ก ๋ง๋ค์ด transmitter์ receiver๊ฐ ๋์ผํ baudrate ํด๋ญ์ ๋๊ธฐํ๋๋๋ก ํ๋ค. transmitter UART ์ก์ ๊ธฐ๋ฅผ ๊ตฌํํ ๋ชจ๋๋ก, start ์ ํธ ์ ๋ ฅ ์ ๋ฐ์ดํฐ(tx_data)๋ฅผ UART ํ๋ ์ ๊ตฌ์กฐ(1 start bit + 8 data bits + 1 stop bit)๋ก ์ง๋ ฌ ์ ์กํ๋ค. FSM(IDLE โ START โ DATA โ STOP)์ผ๋ก ๋์ํ๋ฉฐ, ๊ฐ ๋นํธ ์ ์ก์ baudrate ์ค๋ฒ์ํ๋ง(16๋ฐฐ) ๊ธฐ์ค br_tick ์ ํธ์ ๋ง์ถฐ ์งํ๋๋ค. ๋ฐ์ดํฐ ๊ตฌ๋ ์ LSB๋ถํฐ ์์ฐจ์ ์ผ๋ก ์ ์กํ๋ฉฐ, ๋ชจ๋ ๋นํธ ์ ์ก์ด ์๋ฃ๋๋ฉด tx_done์ 1๋ก ์ค์ ํ๊ณ tx_busy๋ฅผ 0์ผ๋ก ๋ณต๊ท์์ผ ๋ค์ ์ ์ก์ ์ค๋นํ๋ค. < ํ์ผ > sources (Class) uart.sv sim (Class) uart_tb.sv Homework < Design Specification > receiver ์ค๊ณ โ uart ๊ตฌํ uart + up down counter โ PC ์ ์ด (ComPortMaster) โrโ : run ์ํ โsโ : stop ์ํ โcโ : clear ์ํ โmโ : mode๋ณ๊ฒฝ < Block Diagram > < FSM (receiver) > < ASM (receiver) > < Code : uart > `timescale 1ns / 1ps module uart ( input logic clk, input logic reset, input logic rx, output logic tx, output logic [7:0] uart_data ); logic br_tick; logic rx_done; logic [7:0] rx_data; assign uart_data = rx_done ? rx_data : 8'b0; baudrate_gen U_Baudrate_Gen ( .clk (clk), .reset (reset), .br_tick(br_tick) ); receiver U_Receiver ( .clk (clk), .reset (reset), .br_tick(br_tick), .rx (rx), .rx_data(rx_data), .rx_done(rx_done) ); transmitter U_Transmitter ( .clk (clk), .reset (reset), .br_tick(br_tick), .start (rx_done), .tx_data(rx_data), .tx_busy(), .tx_done(), .tx (tx) ); endmodule module baudrate_gen ( input logic clk, input logic reset, output logic br_tick ); logic [$clog2(100_000_000/9600/16)-1:0] br_counter; // logic [3:0] br_counter; always_ff @(posedge clk, posedge reset) begin if (reset) begin br_counter <= 0; br_tick <= 1'b0; end else begin if (br_counter == 100_000_000 / 9600 / 16 - 1) begin // 9600hz 9600bps // if (br_counter == 10 - 1) begin br_counter <= 0; br_tick <= 1'b1; end else begin br_counter <= br_counter + 1; br_tick <= 1'b0; end end end endmodule module receiver ( input logic clk, input logic reset, input logic br_tick, input logic rx, output logic [7:0] rx_data, output logic rx_done ); typedef enum { IDLE, START, DATA, STOP } rx_state_e; rx_state_e rx_state, rx_next_state; logic [7:0] rx_data_reg, rx_data_next; logic [4:0] tick_cnt_reg, tick_cnt_next; logic [2:0] bit_cnt_reg, bit_cnt_next; logic rx_done_reg, rx_done_next; assign rx_done = rx_done_reg; assign rx_data = rx_data_reg; always_ff @(posedge clk, posedge reset) begin if (reset) begin rx_state <= IDLE; rx_data_reg <= 0; tick_cnt_reg <= 0; bit_cnt_reg <= 0; rx_done_reg <= 0; end else begin rx_state <= rx_next_state; rx_data_reg <= rx_data_next; tick_cnt_reg <= tick_cnt_next; bit_cnt_reg <= bit_cnt_next; rx_done_reg <= rx_done_next; end end always_comb begin rx_next_state = rx_state; rx_data_next = rx_data_reg; tick_cnt_next = tick_cnt_reg; bit_cnt_next = bit_cnt_reg; rx_done_next = rx_done_reg; case (rx_state) IDLE: begin rx_done_next = 0; if (rx == 0) begin rx_next_state = START; rx_data_next = 0; tick_cnt_next = 0; bit_cnt_next = 0; end end START: begin if (br_tick) begin if (tick_cnt_reg == 7) begin rx_next_state = DATA; tick_cnt_next = 0; end else begin tick_cnt_next = tick_cnt_reg + 1; end end end DATA: begin if (br_tick) begin if (tick_cnt_reg == 15) begin tick_cnt_next = 0; rx_data_next = {rx, rx_data_reg[7:1]}; if (bit_cnt_reg == 7) begin rx_next_state = STOP; bit_cnt_next = 0; end else begin bit_cnt_next = bit_cnt_reg + 1; end end else begin tick_cnt_next = tick_cnt_reg + 1; end end end STOP: begin if (br_tick) begin if (tick_cnt_reg == 23) begin rx_next_state = IDLE; rx_done_next = 1; tick_cnt_next = 0; end else begin tick_cnt_next = tick_cnt_reg + 1; end end end endcase end endmodule module transmitter ( input logic clk, input logic reset, input logic br_tick, input logic start, input logic [7:0] tx_data, output logic tx_busy, output logic tx_done, output logic tx ); typedef enum { IDLE, START, DATA, STOP } tx_state_e; tx_state_e tx_state, tx_next_state; logic [7:0] temp_data_next, temp_data_reg; logic tx_reg, tx_next; logic [3:0] tick_cnt_reg, tick_cnt_next; logic [2:0] bit_cnt_reg, bit_cnt_next; logic tx_done_reg, tx_done_next; logic tx_busy_reg, tx_busy_next; assign tx = tx_reg; assign tx_busy = tx_busy_reg; assign tx_done = tx_done_reg; always_ff @(posedge clk, posedge reset) begin if (reset) begin tx_state <= IDLE; temp_data_reg <= 0; tx_reg <= 1'b1; tick_cnt_reg <= 0; bit_cnt_reg <= 0; tx_done_reg <= 0; tx_busy_reg <= 0; end else begin tx_state <= tx_next_state; temp_data_reg <= temp_data_next; tx_reg <= tx_next; tick_cnt_reg <= tick_cnt_next; bit_cnt_reg <= bit_cnt_next; tx_done_reg <= tx_done_next; tx_busy_reg <= tx_busy_next; end end always_comb begin tx_next_state = tx_state; temp_data_next = temp_data_reg; tx_next = tx_reg; tick_cnt_next = tick_cnt_reg; bit_cnt_next = bit_cnt_reg; tx_done_next = tx_done_reg; tx_busy_next = tx_busy_reg; case (tx_state) IDLE: begin tx_next = 1'b1; tx_done_next = 0; tx_busy_next = 0; if (start) begin tx_next_state = START; temp_data_next = tx_data; tick_cnt_next = 0; bit_cnt_next = 0; tx_busy_next = 1; end end START: begin tx_next = 1'b0; if (br_tick) begin if (tick_cnt_reg == 15) begin tx_next_state = DATA; tick_cnt_next = 0; end else begin tick_cnt_next = tick_cnt_reg + 1; end end end DATA: begin tx_next = temp_data_reg[0]; if (br_tick) begin if (tick_cnt_reg == 15) begin tick_cnt_next = 0; if (bit_cnt_reg == 7) begin tx_next_state = STOP; bit_cnt_next = 0; end else begin temp_data_next = {1'b0, temp_data_reg[7:1]}; bit_cnt_next = bit_cnt_reg + 1; end end else begin tick_cnt_next = tick_cnt_reg + 1; end end end STOP: begin tx_next = 1'b1; if (br_tick) begin if (tick_cnt_reg == 15) begin tx_next_state = IDLE; tx_done_next = 1; tx_busy_next = 0; tick_cnt_next = 0; end else begin tick_cnt_next = tick_cnt_reg + 1; end end end endcase end endmodule < Comment > uart Baudrate Generator: ์์คํ ํด๋ญ(์: 100 MHz)์์ UART ์๋(9600 bps, 16๋ฐฐ ์ค๋ฒ์ํ๋ง)์ ๋ง์ถ br_tick ์์ฑ. ์กยท์์ ๋ชจ๋ ๋ชจ๋ ์ด ์ ํธ๋ก ํ์ด๋ฐ ๋๊ธฐํ. Receiver: rx ์ ๋ ฅ์ ์ํ๋งํด 8๋นํธ ๋ฐ์ดํฐ(rx_data) ๋ณต์, ์์ ์๋ฃ ์ rx_done=1 ์ถ๋ ฅ. Transmitter: rx_done ์ ํธ๋ฅผ start๋ก ๋ฐ์, ์์ ํ ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋๋ก ์ง๋ ฌ ์ก์ (tx). uart_data: rx_done ์์ ์๋ง ์ ํจ ๋ฐ์ดํฐ๋ฅผ ์ถ๋ ฅ, ๊ทธ ์ธ์๋ 0 ์ ์ง. ์ ์ฒด์ ์ผ๋ก ์์ ํ ๋ฐ์ดํฐ๋ฅผ ์ฆ์ ์ฌ์ ์ก(Echo)ํ๋ ๊ตฌ์กฐ์ด๋ฉฐ, ๋ชจ๋ ์ํ์ค๋ br_tick ๊ธฐ๋ฐ์ผ๋ก ์กยท์์ ๋๊ธฐ๋ฅผ ์ ์งํ๋ค. receiver UART ์์ ๊ธฐ. rx์ start-bit(๋ํ) ๊ฐ์ง ํ 16๋ฐฐ ์ค๋ฒ์ํ๋ง ๊ธฐ์ค br_tick์ ๋ง์ถฐ ๋นํธ ์ค์์์ ์ํ๋งํ๋ค. < Code : top_Uart_UpDownCounter > `timescale 1ns / 1ps module top_Uart_UpDownCounter ( input logic clk, input logic reset, input logic [2:0] btn, input logic rx, output logic tx, output logic [1:0] led_mode, output logic [1:0] led_run_stop, output logic [3:0] fndCom, output logic [7:0] fndFont ); logic [7:0] uart_data; uart U_Uart ( .clk (clk), .reset (reset), .rx (rx), .tx (tx), .uart_data(uart_data) ); top_UpDownCounter U_Top_UpDownCounter ( .clk (clk), .reset (reset), .btn (btn), .uart_data (uart_data), .led_mode (led_mode), .led_run_stop(led_run_stop), .fndCom (fndCom), .fndFont (fndFont) ); endmodule < Code : UpDownCounter (control_unit) > // ... module control_unit ( input logic clk, input logic reset, input logic btn_mode, input logic btn_run_stop, input logic btn_clear, input logic [7:0] uart_data, output logic mode, output logic run_stop, output logic clear, output logic [1:0] led_mode, output logic [1:0] led_run_stop ); /******************** MODE FSM ********************/ typedef enum { UP, DOWN } state_mode_e; state_mode_e state_mode, next_state_mode; // state memory always_ff @(posedge clk, posedge reset) begin if (reset) begin state_mode <= UP; end else begin state_mode <= next_state_mode; end end // transition logic always_comb begin next_state_mode = state_mode; mode = 0; led_mode = 2'b00; case (state_mode) UP: begin led_mode = 2'b01; if (btn_mode || (uart_data == "m")) begin next_state_mode = DOWN; end end DOWN: begin mode = 1; led_mode = 2'b10; if (btn_mode || (uart_data == "m")) begin next_state_mode = UP; end end endcase end /******************** RUN STOP CLEAR FSM ********************/ typedef enum { STOP, RUN, CLEAR } state_counter_e; state_counter_e state_counter, next_state_counter; always_ff @(posedge clk, posedge reset) begin if (reset) begin state_counter <= STOP; end else begin state_counter <= next_state_counter; end end always_comb begin next_state_counter = state_counter; run_stop = 0; clear = 0; led_run_stop = 2'b00; case (state_counter) STOP: begin led_run_stop = 2'b01; if (btn_run_stop || (uart_data == "r")) next_state_counter = RUN; else if (btn_clear || (uart_data == "c")) next_state_counter = CLEAR; end RUN: begin run_stop = 1; led_run_stop = 2'b10; if (btn_run_stop || (uart_data == "s")) next_state_counter = STOP; end CLEAR: begin clear = 1; next_state_counter = STOP; end endcase end endmodule < Schematic > < Video > < ๊ณ ์ฐฐ > control_unit์์ UART ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฅ๋ฐ์ ์ํ ๋ณ๊ฒฝ ์ฌํญ์ ์ ๋ฐ์ดํธํ๋๋ก ์ค๊ณ โ ํ์ฅ์ฑ ํ๋ณด < ํ์ผ > sources (Homework) top_Uart_UpDownCounter.sv uart.sv top_UpDownCounter.sv button_detector.sv UpDownCounter.sv fndController.sv constrs (Homework) Basys-3-Master.xdc
Final
ยท 2025-08-08
2025-08-07
๋์งํธ ํ๋ก ๊ธฐ๋ณธ ๋ฐ ํ์ด๋ฐ ํน์ฑ D-flip flop , Latch ์ฐจ์ด ๋ฉ๋ชจ๋ฆฌ ๊ธฐ๋ฅ์ ์ ๋ฌด โ ๋ ๋ค ๋ฉ๋ชจ๋ฆฌ ๊ธฐ๋ฅ์ด ์์ง๋ง, ๋์ ๋ฐฉ์์ ์ฐจ์ด๊ฐ ์์ Latch: ์ ๋ ฅ ์ ํธ๊ฐ ํ์ฑํ๋ ๋์ ๊ฐ์ ๊ณ์ ๋ฐ์ํจ (๋ ๋ฒจ ๋ฏผ๊ฐ) D Flip-Flop: ํด๋ก ์์น/ํ๊ฐ ์์ง์์๋ง ๊ฐ์ ๋ฐ์ (์ฃ์ง ํธ๋ฆฌ๊ฑฐ) ์กฐํฉํ๋ก (Combinational Circuit) ํ์ฌ ์ ๋ ฅ์ ์ํด์๋ง ์ถ๋ ฅ์ด ๊ฒฐ์ ๋จ ๊ณผ๊ฑฐ ์ ๋ ฅ์ด๋ ์ํ์๋ ๋ฌด๊ด ์์: AND, OR, MUX, Decoder ๋ฑ ์์ฐจํ๋ก (Sequential Circuit) ํด๋ก ์ ํธ์ ๋ฐ๋ผ ๋์ (๋๊ธฐ์ ์ค๊ณ) ์ถ๋ ฅ์ ํ์ฌ ์ ๋ ฅ + ์ด์ ์ํ์ ์์กด ์์: D Flip-Flop, ๋ ์ง์คํฐ, FSM ๋ฑ SR Latch S=0, R=0 โ Q=์ ์ง, Qโฒ=์ ์ง โ ์ ์ ์ํ (Hold) S=0, R=1 โ Q=0, Qโฒ=1 โ Reset ๋์ S=1, R=0 โ Q=1, Qโฒ=0 โ Set ๋์ S=1, R=1 โ Q=0, Qโฒ=0 โ ๊ธ์ง ์ํ (Invalid) D Latch D=0, S=0, R=1 โ Reset D=1, S=1, R=0 โ Set Gated D Latch Gate=0, D=x, Q=์ ์ง, Qโ=์ ์ง โ Hold ์ํ Gate=1, D=0, Q=0, Qโ=1 โ Reset ๋์ Gate=1, D=1, Q=1, Qโ=0 โ Set ๋์ D-Filp Flop D Flip-Flop์ Master-Slave ๊ตฌ์กฐ์ ๋ ๊ฐ์ D-Latch๋ก ๊ตฌ์ฑ Master: ํด๋ก์ด 0์ผ ๋ ์ ๋ ฅ ๊ฐ์ ์ ์ฅ Slave: ํด๋ก์ด 1์ผ ๋ Master์ ๊ฐ์ ์ถ๋ ฅ์ ์ ๋ฌ ๋ฐ๋ผ์ ํด๋ก์ ์์น/ํ๊ฐ ์ฃ์ง์๋ง ์ถ๋ ฅ์ด ๋ฐ๋ (์ฃ์ง ํธ๋ฆฌ๊ฑฐ) Metastability ํด๋ก ์ฃ์ง ์์ ์ ์ ๋ ฅ(D)์ด ๋ณํ ๊ฒฝ์ฐ, ์ถ๋ ฅ(Q)์ด ์ผ์ ์๊ฐ ๋์ ์ ์๋์ง ์์ ์ํ์ ๋จธ๋ฌด๋ฅผ ์ ์์ Setup Time: ํด๋ก ์ฃ์ง ์ด์ ์ผ์ ์๊ฐ ๋์ D ์ ๋ ฅ์ด ์์ ์ ์ผ๋ก ์ ์ง๋์ด์ผ ํจ Hold Time: ํด๋ก ์ฃ์ง ์ดํ ์ผ์ ์๊ฐ ๋์๋ D ์ ๋ ฅ์ด ์ ์ง๋์ด์ผ ํจ Metastability ๋ฐฉ์ง ๋ฐฉ๋ฒ โ ๋๊ธฐํ ํ๋ก (Synchronizer) ์ธ๋ถ ์ ํธ(๋น๋๊ธฐ ์ ๋ ฅ ๋ฑ)๋ ํด๋ก ๋๋ฉ์ธ์ ๋ฐ๋ผ metastable ์ํ์ด ์์ D Flip-Flop์ 2๊ฐ ์ด์ ์ง๋ ฌ๋ก ์ฐ๊ฒฐ ์ฒซ ๋ฒ์งธ F/F๋ ์ ํธ๋ฅผ ์ ์ ๋ฐ์๋ค์ด๊ณ ๋ ๋ฒ์งธ F/F๋ ํด๋ก์ ๋๊ธฐํ๋ ์์ ๋ ์ถ๋ ฅ์ ์์ฑ Glitch (์๊ฐ ์ถ๋ ฅ ์ค๋ฅ) ์กฐํฉ ํ๋ก์์ ์ ๋ ฅ์ด ๋์์ ๋ณํ ๋, ๋ด๋ถ ๊ฒ์ดํธ์ ์ ํ ์ง์ฐ ์ฐจ์ด๋ก ์ธํด ์ผ์์ ์ธ ์๋ชป๋ ์ถ๋ ฅ์ด ๋ฐ์ํ ์ ์์ ํด๋ก ์ฃ์ง ์ง์ ๊น์ง ์ถ๋ ฅ์ด ์์ ๋์ง ์์ผ๋ฉด ์์คํ ์ค๋์ ๊ฐ๋ฅ์ฑ ์กด์ฌ Propagation Delay (์ ํ ์ง์ฐ) ์ ๋ ฅ ๋ณํ ์ดํ ์ถ๋ ฅ์ด ์์ ๋ ๋๊น์ง์ ์๊ฐ ์ง์ฐ ์กฐํฉ ํ๋ก๊ฐ ๋ณต์กํ๊ฑฐ๋ ๊น์ด๊ฐ ๊น์์๋ก ์ง์ฐ ์๊ฐ์ด ๊ธธ์ด์ง ์: FFT filter ์ค๊ณ ์ ๊ณฑ์ ์ฐ์ฐ์ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฌ๋ฏ๋ก, ์ค๊ฐ์ ๋ ์ง์คํฐ๋ฅผ ์ฝ์ ํ์ฌ ์ฒ๋ฆฌ Pipeline ์ฒ๋ฆฌ ์ฐ์ฐ ์ค๊ฐ์ ๋ ์ง์คํฐ๋ฅผ ์ถ๊ฐํ์ฌ ์ฐ์ฐ ๋จ๊ณ๋ฅผ ์ฌ๋ฌ ํด๋ก ์ฌ์ดํด๋ก ๋ถํ ์กฐํฉ ๋ ผ๋ฆฌ์ ๊ธธ์ด๋ฅผ ์ค์ฌ glitch๋ฅผ ๋ฐฉ์งํ ์ ์์ ๋ณต์กํ ์ฐ์ฐ์ ๋ถํ ์ฒ๋ฆฌํด ํด๋ก ํ์ด๋ฐ ์ฌ์ ํ๋ณด ๊ฐ๋ฅ ํ ํด๋ญ ๋ด์ ์ฐ์ฐ์ด ๋๋๋๋ก ํ๋ก๋ฅผ ๊ตฌ์ฑํ๋ฉด ์์ ์ ์ธ ์์คํ ์ค๊ณ ๊ฐ๋ฅ Button_Detector Design < Block Diagram > < Code : button_detector > `timescale 1ns / 1ps module button_detector ( input logic clk, input logic reset, input logic i_btn, output logic rising_edge, output logic falling_edge, output logic both_edge ); logic clk_1khz; logic debounce; logic [ 7:0] shift_reg; logic [$clog2(100_000)-1:0] div_counter; // create 1kHz pulse (for button sampling) always_ff @(posedge clk, posedge reset) begin if (reset) begin div_counter <= 0; clk_1khz <= 1'b0; end else begin if (div_counter == 100_000 - 1) begin div_counter <= 0; clk_1khz <= 1'b1; end else begin div_counter <= div_counter + 1; clk_1khz <= 1'b0; end end end shift_register U_SHIFT_REG ( .clk (clk_1khz), .reset (reset), .i_data(i_btn), .o_data(shift_reg) ); assign debounce = &shift_reg; // assign o_btn = debounce; logic [1:0] edge_reg; // edge detector (rising/falling/both) always_ff @(posedge clk, posedge reset) begin if (reset) begin edge_reg <= 0; end else begin edge_reg[0] <= debounce; edge_reg[1] <= edge_reg[0]; end end assign rising_edge = edge_reg[0] & ~edge_reg[1]; assign falling_edge = ~edge_reg[0] & edge_reg[1]; assign both_edge = rising_edge | falling_edge; endmodule module shift_register ( input logic clk, input logic reset, input logic i_data, output logic [7:0] o_data ); always_ff @(posedge clk, posedge reset) begin if (reset) begin o_data <= 0; end else begin o_data <= {i_data, o_data[7:1]}; // right shift //o_data <= {o_data[6:0], i_data};// left shift end end endmodule < Comment > shift_register ์ํํธ ๋ ์ง์คํฐ์ ๊ธฐ๋ณธ ํํ๋ฅผ ๊ตฌํํ ์์๋ก, ๊ตฌ์กฐ์ ๋์ ์๋ฆฌ๋ฅผ ์ตํ๋๋ฉด ์ข๋ค. Right shift : ์๋ก์ด ์ ๋ ฅ(i_data)์ด MSB ์์น๋ก ๋ค์ด๊ฐ๊ณ , ๊ธฐ์กด ๋ฐ์ดํฐ๋ ์ค๋ฅธ์ชฝ(LSB ๋ฐฉํฅ)์ผ๋ก ํ ๋นํธ์ฉ ์ด๋ํ๋ค. Left shift : ์๋ก์ด ์ ๋ ฅ(i_data)์ด LSB ์์น๋ก ๋ค์ด๊ฐ๊ณ , ๊ธฐ์กด ๋ฐ์ดํฐ๋ ์ผ์ชฝ(MSB ๋ฐฉํฅ)์ผ๋ก ํ ๋นํธ์ฉ ์ด๋ํ๋ค. edge detector edge_reg๋ฅผ ํตํด ํ์ฌ debounce์ ์ง์ ์ํ๋ฅผ ์ ์ฅ. rising_edge : 0โ1 ๋ณํ๋ฅผ ๊ฒ์ถ. falling_edge : 1โ0 ๋ณํ๋ฅผ ๊ฒ์ถ. both_edge : ์์น ๋๋ ํ๊ฐ ๋ณํ๋ฅผ ๋ชจ๋ ๊ฒ์ถ. < Code : UpDownCounter > `timescale 1ns / 1ps module UpDownCounter ( input logic clk, input logic reset, input logic button, output logic [13:0] count ); logic tick_10hz; logic mode; clk_div_10hz U_CLK_DIV_10hz ( .clk (clk), .reset (reset), .tick_10hz(tick_10hz) ); up_down_counter U_UP_DOWN_COUNTER ( .clk (clk), .reset(reset), .tick (tick_10hz), .mode (mode), .count(count) ); control_unit U_CU ( .clk(clk), .reset(reset), .button(button), .mode(mode) ); endmodule module up_down_counter ( input logic clk, input logic reset, input logic tick, input logic mode, output logic [13:0] count ); always_ff @(posedge clk, posedge reset) begin if (reset) begin count <= 0; end else begin if (mode == 1'b0) begin // up counter if (tick) begin if (count == 9999) begin count <= 0; end else begin count <= count + 1; end end end else begin // down counter if (tick) begin if (count == 0) begin count <= 9999; end else begin count <= count - 1; end end end end end endmodule module clk_div_10hz ( input logic clk, input logic reset, output logic tick_10hz ); //logic [23:0] div_counter; logic [$clog2(10_000_000)-1:0] div_counter; always_ff @(posedge clk, posedge reset) begin if (reset) begin div_counter <= 0; tick_10hz <= 1'b0; end else begin if (div_counter == 10_000_000 - 1) begin div_counter <= 0; tick_10hz <= 1'b1; end else begin div_counter <= div_counter + 1; tick_10hz <= 1'b0; end end end endmodule module control_unit ( input logic clk, input logic reset, input logic button, output logic mode ); typedef enum { UP, DOWN } state_e; state_e state, next_state; // transition logic always_ff @(posedge clk, posedge reset) begin if (reset) begin state <= UP; end else begin state <= next_state; end end // output logic always_comb begin next_state = state; case (state) UP: begin mode = 0; if (button) begin next_state = DOWN; end end DOWN: begin mode = 1; if (button) begin next_state = UP; end end endcase end endmodule < Comment > control_unit ๋ฒํผ ์ ๋ ฅ์ ๋ฐ๋ผ UP, DOWN ์ํ๋ฅผ ์ ํํ๋ FSM์ ๊ตฌํ typedef enum์ ์ฌ์ฉํ์ฌ ์ํ ์ด๋ฆ(UP, DOWN)์ ์ด๊ฑฐํ์ผ๋ก ์ ์ธ < Schematic > < ํ์ผ > sources (Class) top_UpDownCounter.sv button_detector.sv UpDownCounter.sv fndController.sv constrs (Class) Basys-3-Master.xdc Homework < Design Specification > button 3๊ฐ ์ฌ์ฉ : run_stop ๋ฒํผ, clear ๋ฒํผ, mode ๋ฒํผ mode = 0 : up counting / mode = 1 : down counting up counter : led[0] on down counter : led[1] on stop : led[2] on run : led[3] on < FSM > < Code : UpDownCounter > //... module up_down_counter ( input logic clk, input logic reset, input logic tick, input logic mode, input logic clear, output logic toggle_state, output logic [13:0] count ); always_ff @(posedge clk or posedge reset) begin if (reset) begin toggle_state <= 0; end else begin if (mode) begin toggle_state <= ~toggle_state; end end end always_ff @(posedge clk, posedge reset) begin if (reset | clear) begin count <= 0; end else begin if (toggle_state == 1'b0) begin // up counter if (tick) begin if (count == 9999) begin count <= 0; end else begin count <= count + 1; end end end else begin // down counter if (tick) begin if (count == 0) begin count <= 9999; end else begin count <= count - 1; end end end end end endmodule module cu ( input logic clk, input logic reset, input logic btn_L, input logic btn_R, output logic runstop, output logic clear ); typedef enum { STOP, RUN, CLEAR } state_e; state_e state, next_state; always_ff @(posedge clk, posedge reset) begin if (reset) begin state <= STOP; end else begin state <= next_state; end end always_comb begin next_state = state; runstop = 0; clear = 0; case (state) STOP: begin runstop = 0; clear = 0; if (btn_L) begin next_state = CLEAR; end else if (btn_R) begin next_state = RUN; end end CLEAR: begin clear = 1; if (btn_L) begin next_state = STOP; end end RUN: begin runstop = 1; if (btn_R) begin next_state = STOP; end end endcase end endmodule module state_led ( input logic runstop, input logic clear, input logic mode, output logic [3:0] led ); // (condition) ? true : false assign led[1:0] = mode ? 2'b10 : 2'b01; assign led[3:2] = runstop ? 2'b10 : 2'b01; endmodule < Schematic > < Video > < ๊ณ ์ฐฐ > led ๋ณ์๋ช ์ led_mode, led_runstop์ฒ๋ผ ์๋ฏธ๋ฅผ ๋ช ํํ ์ ์ ์๋๋ก ๊ฐ์ ํด์ผ ํจ ๊ธฐ๋ฅ๋ณ๋ก ๋ถ๋ฆฌํ์ฌ ์ฝ๋์ ํ์ฅ์ฑ์ ํ๋ณดํ ํ์๊ฐ ์์ ํ๋์ control_unit์์ ์ํ๋ฅผ ๊ตฌ๋ถํ๋ ์ ์ด ์ ํธ๋ค์ ๋ฐ์, ์ฌ๋ฌ ๊ฐ์ FSM์ ๋์์ ์ฒ๋ฆฌํ๋ ๊ตฌ์กฐ๋ฅผ ๊ณ ๋ คํจ. (mode FSM์ ๊ธฐ์กด๋๋ก ์ ์ง) < ํ์ผ > sources (Homework) top_UpDownCounter.sv button_debounce.sv UpDownCounter.sv fndController.sv constrs (Homework) Basys-3-Master.xdc
Final
ยท 2025-08-07
2025-08-06
Review : Counter Design < Design Specification > up/down counter ์ค๊ณ mode 0 : up counter mode 1 : down counter 0.1์ด ๊ฐ๊ฒฉ์ผ๋ก counting ๋์ FND์ ์ซ์๊ฐ ์ถ๋ ฅ (0000~9999) ์ ์์ด ์ธ๊ฐ๋๋ฉด mode์ ๋ง๊ฒ counting ๋์ < Block Design > < Code : UpDownCounter > `timescale 1ns / 1ps module UpDownCounter ( input logic clk, input logic reset, input logic sw_mode, output logic [13:0] count ); logic tick_10hz; clk_div_10hz U_CLK_DIV_10hz ( .clk (clk), .reset (reset), .tick_10hz(tick_10hz) ); up_down_counter U_UP_DOWN_COUNTER ( .clk (clk), .reset(reset), .tick (tick_10hz), .mode (sw_mode), .count(count) ); endmodule module clk_div_10hz ( input logic clk, input logic reset, output logic tick_10hz ); //logic [23:0] div_counter; logic [$clog2(10_000_000)-1:0] div_counter; always_ff @(posedge clk, posedge reset) begin if (reset) begin div_counter <= 0; tick_10hz <= 1'b0; end else begin if (div_counter == 10_000_000 - 1) begin div_counter <= 0; tick_10hz <= 1'b1; end else begin div_counter <= div_counter + 1; tick_10hz <= 1'b0; end end end endmodule module up_down_counter ( input logic clk, input logic reset, input logic tick, input logic mode, output logic [13:0] count ); always_ff @(posedge clk, posedge reset) begin if (reset) begin count <= 0; end else begin if (mode == 1'b0) begin // up counter if (tick) begin if (count == 9999) begin count <= 0; end else begin count <= count + 1; end end end else begin // down counter if (tick) begin if (count == 0) begin count <= 9999; end else begin count <= count - 1; end end end end end endmodule < Comment > clk_div_10hz system clock = 100_000_000Hz = 100MHz (1์ด์ 1์ต ์ธ์ดํด) clk_div_10hz โ 10_000_000 ์ธ์ดํด๋ง๋ค tick_10hz๋ฅผ 1๋ก ์ถ๋ ฅ (0.1์ด ์ฃผ๊ธฐ) ์ฆ, tick_10hz๋ 10Hz๋ก ๋์ (1์ด์ 10๋ฒ ํ์ค ๋ฐ์) up_down_counter ์ด๊ธฐ์ up_counter์ down_counter๋ฅผ ๊ฐ๊ฐ ๋ฐ๋ก ์ค๊ณํ๊ณ top ๋ชจ๋์์ sw๋ฅผ ํตํด ์ถ๋ ฅ๋ง ์ ํ(MUX)ํ๋ ค ํ์ผ๋, ์ด ๊ฒฝ์ฐ mode ์ ํ ์ ํ์ฌ ์นด์ดํฐ ๊ฐ์ด ์๋ ์ ํ๋ ๋ค๋ฅธ ์นด์ดํฐ์ ์ด์ ๊ฐ์ด ๊ฐ์๊ธฐ ์ถ๋ ฅ๋ ์ฐ๋ ค๊ฐ ์์๋ค. โ ๊ฒฐ๊ณผ์ ์ผ๋ก ์ถ๋ ฅ ๊ฐ์ด ๋ถ์ฐ์์ ์ผ๋ก ๋ณํ ์ ์์ ๋ฐ๋ผ์ ํ๋์ ์์ฐจํ๋ก(counter)์์ mode๋ฅผ ์ ๋ ฅ์ผ๋ก ๋ฐ์, ๋์ผํ ๋ ์ง์คํฐ(count)์ ๋ํด up/down ์ ์ด๋ฅผ ํ๋ ๋ฐฉ์์ด ์ฐ์์ ์ธ ๋์์ ๋ณด์ฅํ๊ณ ์ค๊ณ ๋ชฉํ์๋ ๋ ์ ํฉํ๋ค๊ณ ํ๋จํ๋ค. < Code : FndController > `timescale 1ns / 1ps module FndController ( input logic clk, input logic reset, input logic [13:0] number, output logic [ 3:0] fndCom, output logic [ 7:0] fndFont ); logic tick_1khz; logic [1:0] count; logic [3:0] digit_1, digit_10, digit_100, digit_1000, digit; clk_div_1khz U_CLK_DIV_1KHZ ( .clk (clk), .reset (reset), .tick_1khz(tick_1khz) ); counter_2bit U_COUNTER_2BIT ( .clk (clk), .reset(reset), .tick (tick_1khz), .count(count) ); decoder_2x4 U_DECODER_2X4 ( .x(count), .y(fndCom) ); digitSplitter U_DIGITSPLITTER ( .number (number), .digit_1 (digit_1), .digit_10 (digit_10), .digit_100 (digit_100), .digit_1000(digit_1000) ); mux_4x1 U_MUX_4X1 ( .sel(count), .x0 (digit_1), .x1 (digit_10), .x2 (digit_100), .x3 (digit_1000), .y (digit) ); BCDtoFND_Decoder U_BCDTOFND_DECODER ( .bcd(digit), .fnd(fndFont) ); endmodule module clk_div_1khz ( input logic clk, input logic reset, output logic tick_1khz ); logic [$clog2(100_000):0] div_counter; always_ff @(posedge clk, posedge reset) begin if (reset) begin div_counter <= 0; tick_1khz <= 0; end else begin if (div_counter == 100_000 - 1) begin div_counter <= 0; tick_1khz <= 1; end else begin div_counter <= div_counter + 1; tick_1khz <= 0; end end end endmodule module counter_2bit ( input logic clk, input logic reset, input logic tick, output logic [1:0] count ); always_ff @(posedge clk, posedge reset) begin if (reset) begin count <= 0; end else begin if (tick) begin count <= count + 1; end end end endmodule module decoder_2x4 ( input logic [1:0] x, output logic [3:0] y ); always_comb begin case (x) 2'b00: y = 4'b1110; 2'b01: y = 4'b1101; 2'b10: y = 4'b1011; 2'b11: y = 4'b0111; endcase end endmodule module digitSplitter ( input logic [13:0] number, output logic [ 3:0] digit_1, output logic [ 3:0] digit_10, output logic [ 3:0] digit_100, output logic [ 3:0] digit_1000 ); assign digit_1 = number % 10; assign digit_10 = number / 10 % 10; assign digit_100 = number / 100 % 10; assign digit_1000 = number / 1000 % 10; endmodule module mux_4x1 ( input logic [1:0] sel, input logic [3:0] x0, input logic [3:0] x1, input logic [3:0] x2, input logic [3:0] x3, output logic [3:0] y ); always_comb begin y = 4'b0000; case (sel) 2'b00: y = x0; 2'b01: y = x1; 2'b10: y = x2; 2'b11: y = x3; endcase end endmodule module BCDtoFND_Decoder ( input logic [3:0] bcd, output logic [7:0] fnd ); always_comb begin case (bcd) 4'h0: fnd = 8'hc0; 4'h1: fnd = 8'hf9; 4'h2: fnd = 8'ha4; 4'h3: fnd = 8'hb0; 4'h4: fnd = 8'h99; 4'h5: fnd = 8'h92; 4'h6: fnd = 8'h82; 4'h7: fnd = 8'hf8; 4'h8: fnd = 8'h80; 4'h9: fnd = 8'h90; 4'ha: fnd = 8'h88; 4'hb: fnd = 8'h83; 4'hc: fnd = 8'hc6; 4'hd: fnd = 8'ha1; 4'he: fnd = 8'h86; 4'hf: fnd = 8'h8e; default: fnd = 8'hff; endcase end endmodule < Comment > clk_div_1khz 1ms ๋ง๋ค tick_1khz๋ฅผ ์์ฑ counter_2bit tick ๋ฐ์ ๋๋ง๋ค count 0โ1โ2โ3 ์ํ decoder_2x4 count์ ๋ฐ๋ผ FND์ ์๋ฆฟ์ ์ ํ (fndCom ์ถ๋ ฅ) digitSplitter 14๋นํธ ์ ๋ ฅ ์ซ์๋ฅผ ์ฒ/๋ฐฑ/์ญ/์ผ์ 4์๋ฆฌ๋ก ๋ถํ mux_4x1 count ์๋ฆฌ์ ํด๋นํ๋ ์๋ฆฟ์ ๊ฐ์ ์ ํ BCDtoFND_Decoder ์๋ฆฟ์ ๊ฐ์ FND ๋์ฝ๋ฉ (fndFont ์ถ๋ ฅ) < Code : top_UpDownCounter > `timescale 1ns / 1ps module top_UpDownCounter ( input logic clk, input logic reset, input logic sw_mode, output logic [3:0] fndCom, output logic [7:0] fndFont ); logic [13:0] count; UpDownCounter U_UPDOWNCOUNTER ( .clk (clk), .reset (reset), .sw_mode(sw_mode), .count (count) ); FndController U_FNDCONTROLLER ( .clk (clk), .reset (reset), .number (count), .fndCom (fndCom), .fndFont(fndFont) ); endmodule < Schematic > < ํ์ผ > sources (Class) top_UpDownCounter.sv UpDownCounter.sv FndController.sv constrs (Class) Basys-3-Master.xdc Homework < Design Specification > mode ๋ฒํผ์ ๋๋ ๋ค ๋์ ๋ up_counter โ down_counter mode ๋ฒํผ์ ๋๋ ๋ค ๋์ ๋ down_counter โ up_counter mode ๋ฒํผ 1๊ฐ๋ก counter ๋์ toggle < ๊ตฌ์ > ๊ธฐ์กด ์ค์์น ์ ๋ ฅ์ ๋ฒํผ ์ ๋ ฅ์ผ๋ก ๋์ฒดํ๊ณ ์ ํ์ผ๋ฉฐ, ๋ฒํผ ํน์ฑ์ ๋ ธ์ด์ฆ๊ฐ ๋ฐ์ํ๋ฏ๋ก ๋๋ฐ์ด์ฑ ์ฒ๋ฆฌ๊ฐ ํ์ํ๋ค๊ณ ํ๋จํ๋ค. ํนํ, ๋ฒํผ์ ๋๋ ๋ค ๋ผ๋ ์๊ฐ(falling edge)์๋ง ๋์์ด ๋ฐ์ํด์ผ ํ๋ฏ๋ก, ์ฃ์ง ๊ฒ์ถ ๊ธฐ๋ฐ ๋์ ์ค๊ณ๊ฐ ์ด๋ฒ ๊ตฌํ์ ํต์ฌ์ด ๋์๋ค. < Code : btn_debounce > `timescale 1ns / 1ps module btn_debounce ( input logic clk, input logic rst, input logic i_btn, output logic o_btn ); parameter F_COUNT = 10_000; logic [$clog2(F_COUNT)-1:0] r_counter; logic r_clk; logic [7:0] q_reg, q_next; logic w_debounce; // 10,000Hz clock divider (0.1ms) always_ff @(posedge clk, posedge rst) begin if (rst) begin r_counter <= 0; r_clk <= 0; end else begin if (r_counter == (F_COUNT - 1)) begin r_counter <= 0; r_clk <= 1'b1; end else begin r_counter <= r_counter + 1; r_clk <= 1'b0; end end end // shift register always_comb begin q_next = {i_btn, q_reg[7:1]}; end always_ff @(posedge r_clk, posedge rst) begin if (rst) begin q_reg <= 0; end else begin q_reg <= q_next; end end // 8 input and gate assign w_debounce = &q_reg; logic r_edge_q; // edge detector always_ff @(posedge clk, posedge rst) begin if (rst) begin r_edge_q <= 0; end else begin r_edge_q <= w_debounce; end end // rising edge // assign o_btn = (~r_edge_q) & w_debounce; // falling edge assign o_btn = r_edge_q & ~w_debounce; endmodule < Comment > 10,000Hz clock divider 0.1ms ๋ง๋ค tick_1khz๋ฅผ ์์ฑ shift register 0.1ms๋ง๋ค ๋ฒํผ ์ ๋ ฅ i_btn์ ๊ฐ์ฅ ์์ ๋นํธ์ ๋ฃ๊ณ , ๊ธฐ์กด ๊ฐ์ ํ ์นธ์ฉ ์ค๋ฅธ์ชฝ์ผ๋ก ๋ฐ์ด ์ ์ฅ โ ์ต๊ทผ 0.8ms ๊ฐ์ ์ ๋ ฅ ์ด๋ ฅ์ ์ ์ฅ 8 input and gate 8๋นํธ shift register์ ๋ชจ๋ ๋นํธ๊ฐ 1์ผ ๋๋ง w_debounce = 1 โ ๋ฒํผ์ด 0.8ms ์ด์ ์์ ์ ์ผ๋ก ๋๋ ธ๋์ง๋ฅผ ํ๋ณ edge detector w_debounce์ ์ํ๋ฅผ ํ ํด๋ญ ์ง์ฐ์ํจ r_edge_q์ ๋น๊ต โ ํ์ฌ ์ํ์ ์ด์ ์ํ์ ์ฐจ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ฒํผ ๋ณํ ์์ ์ ๊ฐ์ง falling edge r_edge_q = 1, w_debounce = 0์ธ ๊ฒฝ์ฐ์๋ง o_btn = 1 โ ๋ฒํผ์ด ๋ผ์ด์ง๋ ์๊ฐ(falling edge)๋ง ํ ํด๋ญ ๋์ ์ถ๋ ฅ < Code : UpDownCounter (up_down_counter) > // ... logic toggle_state; always_ff @(posedge clk or posedge reset) begin if (reset) begin toggle_state <= 0; end else begin if (mode) begin toggle_state <= ~toggle_state; end end end //... // counter ๋ณํ ์กฐ๊ฑด ๋ณ๊ฒฝ : mode โ toggle_state < Schematic > < Video > < ๊ณ ์ฐฐ > ๋จ์ํ ์ผ์ ์๊ฐ ๋์ ๋ฒํผ์ด ๋๋ ธ๋์ง๋ฅผ ํ๋จํ๋ ๋ฐฉ์์ด ์๋, ํ์ฌ ์ํ์ ์ด์ ์ํ์ ์ฐจ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ฒํผ์ด ๋๋ฆฌ๋ ์๊ฐ๊ณผ ๋ผ์ด์ง๋ ์๊ฐ์ ๊ฐ์งํ๋ ์ฃ์ง ๊ฒ์ถ(edge detection) ๋ฐฉ์์ด ์๋ก์ ๋ค. ๋ํ, shift register๋ฅผ ํ์ฉํด ๋ฒํผ ์ ๋ ฅ์ ์ด๋ ฅ์ ์ ์ฅํจ์ผ๋ก์จ ๋ ธ์ด์ฆ์ ๊ฐํ ์์ ์ ์ธ ๋๋ฐ์ด์ฑ ๋ก์ง์ ๊ตฌํํ ์ ์๋ค๋ ์ ์ด ์ธ์ ๊น์๋ค. < ํ์ผ > sources (Homework) top_UpDownCounter.sv button_debounce.sv UpDownCounter.sv fndController.sv constrs (Homework) Basys-3-Master.xdc
Final
ยท 2025-08-06
<
>
Touch background to close