1. Title
AMBA BUS (APB Protocol)
2. Category
"RISC-V", "AMBA BUS", "APB Protocol"
3. Key Concepts
APB Protocol을 Verilog로 구현한다.
4. Setup
CPU Course Review - 11. AMBA BUS (APB Protocol)
1. TitleAMBA BUS (APB Protocol)2. Category"RISC-V", "AMBA BUS", "APB Protocol" 3. Key ConceptsAPB Protocol을 Verilog로 구현한다. 4. Setup AMBA BUS - 00. What is AMBA BUS?AMBA(Advanced Microcontroller Bus Architecture) 버스는 ARM에서 개
salmon1113.tistory.com
이전 게시글에서 RAM에 APB Interface를 추가한 것에 이어 APB Interface를 이용해 GPO를 구현한다.
5. Code Review
module gpo (
input logic [7:0] control,
input logic [7:0] data,
output logic [7:0] outport
);
genvar i;
generate
for(i = 0; i < 8; i++) begin
assign outport[i] = control[i] ? data[i] : 'z;
end
endgenerate
endmodule
GPO는 기본적으로 고임피던스(High-Z) 상태를 유지하다가 control 신호에 따라 데이터 출력 여부가 결정된다.
module periph_gpo (
input logic PCLK, // APB CLK
input logic PRESET, // APB asynchronous RESET
// APB Interface Signals
input logic [31:0] PADDR,
input logic PWRITE,
input logic PSEL,
input logic PENABLE,
input logic [31:0] PWDATA,
output logic [31:0] PRDATA,
output logic PREADY,
// Internal Signals
output logic [7:0] outport
);
logic [7:0] control;
logic [7:0] data;
apb_slave_interface U_APB_SLAVE_INTERFACE(
.*,
.ddr(control),
.odr(data)
);
gpo U_GPO(
.control(control),
.data(data),
.outport(outport)
);
endmodule
module apb_slave_interface (
input logic PCLK, // APB CLK
input logic PRESET, // APB asynchronous RESET
// APB Interface Signals
input logic [31:0] PADDR,
input logic PWRITE,
input logic PSEL,
input logic PENABLE,
input logic [31:0] PWDATA,
output logic [31:0] PRDATA,
output logic PREADY,
// Internal Signals
output logic [7:0] ddr,
output logic [7:0] odr
);
localparam DDR_ADDR = 4'h0;
localparam ODR_ADDR = 4'h4;
logic [31:0] dd_reg, od_reg;
assign ddr = dd_reg[7:0];
assign odr = od_reg[7:0];
always_ff @(posedge PCLK, posedge PRESET) begin
if (PRESET) begin
dd_reg <= 0;
od_reg <= 0;
end else begin
PREADY <= 1'b0;
if (PSEL && PENABLE && PWRITE) begin
PREADY <= 1'b1;
case (PADDR[3:0])
DDR_ADDR: dd_reg <= PWDATA;
ODR_ADDR: od_reg <= PWDATA;
default: ;
endcase
end else if (PSEL && PENABLE && !PWRITE) begin
PREADY <= 1'b1;
case (PADDR[3:0])
DDR_ADDR: PRDATA <= dd_reg;
ODR_ADDR: PRDATA <= od_reg;
default: PRDATA = 'x;
endcase
end
end
end
endmodule
CPU는 RAM과 협력하여 필요한 연산을 수행한 후, APB 인터페이스를 통해 GPO 모듈의 내부 레지스터(dd_reg 및 od_reg)에 접근한다.
APB 인터페이스는 CPU가 control과 data 레지스터에 값을 쓰거나 읽을 수 있도록 하며, 이를 통해 GPO의 출력을 제어한다.
7. Testing and Debugging
* Testing Tools: VIVADO, BASYS-3, Modelsim
#include <stdint.h>
void delay(int n);
int main()
{
*(uint32_t *)(0x10001000) = 0x000000ff;
while(1)
{
*(uint32_t *)(0x10001004) = 0x000000ff;
delay(100);
*(uint32_t *)(0x10001004) = 0x00000000;
delay(100);
}
return 0;
}
void delay(int n)
{
uint32_t temp = 0;
for(int i = 0; i < n; i++)
{
for (int j = 0; j < 1000; j++)
{
temp ++;
}
}
}
대략적으로 1ms 정도 Delay를 가지며 LED를 토글 시키는 코드를 작성해 보았다.
하지만 실제로는 여러 제어 State를 거치기 때문에 Testbench상으로는 대략 45ms의 토글 주기를 갖는 것을 확인할 수 있었다.
GPO의 컨트롤을 담당하는 Register의 값이 바뀔때마다 APB Protocol의 신호가 활성화되는 것을 확인할 수 있다.
'AI SOC COURSE > SYSTEM VERILOG (CPU 설계)' 카테고리의 다른 글
CPU Course Review - 14. Device Driver (0) | 2025.02.26 |
---|---|
CPU Course Review - 13. AMBA BUS (APB Protocol - GPI) (0) | 2025.02.26 |
CPU Course Review - 11. AMBA BUS (APB Protocol - RAM) (0) | 2025.02.24 |
CPU Course Review - 10. Analysis of Assembly Language (Single Cycle RISC-V) (0) | 2025.02.21 |
CPU Course Review - 09. RISC-V CPU 개요 (0) | 2025.02.12 |