APB: IDLE → SETUP → ACCESS

Khoảng 25 phútMức 1/3Bản nháp: một số khẳng định chưa đối chiếu spec

Tiên quyết

Sau bài này bạn sẽ

  • Vẽ sơ đồ trạng thái hoạt động của APB và điều kiện chuyển trạng thái
  • Suy ra PSEL/PENABLE từ trạng thái, kể cả khi có wait state

Trạng thái theo spec

Tín hiệu và chuyển trạng thái

AMBA APB: tín hiệu và trạng thái

Phạm vi: APB4 (lõi), APB5 = mở rộng. Chưa đối chiếu với spec chính thức.

Tín hiệuĐộ rộngNguồn phátTừÝ nghĩa
PCLK1clock/resetAPB2Clock; mọi tín hiệu lấy mẫu ở cạnh lên. [2]
PRESETn1clock/resetAPB2Reset tích cực mức thấp. [2]
PADDR≤32managerAPB2Địa chỉ. [2]
PSEL1/subordinatemanagerAPB2Chọn subordinate; lên ở SETUP. [2]
PENABLE1managerAPB2Báo pha ACCESS. [2]
PWRITE1managerAPB21 = ghi, 0 = đọc. [2]
PWDATA≤32managerAPB2Dữ liệu ghi. [2]
PRDATA≤32subordinateAPB2Dữ liệu đọc. [2]
PREADY1subordinateAPB3Subordinate kéo dài ACCESS (wait state) khi = 0. [2]
PSLVERR1subordinateAPB3Báo lỗi transfer. [2]
PPROT3managerAPB4Thuộc tính bảo vệ. [2]
PSTRBDATA_WIDTH/8managerAPB4Byte strobe cho write. [2]

Chuyển trạng thái

TừSangKhi
IDLESETUPcó transfer
SETUPACCESSluôn luôn (cạnh clock kế)
ACCESSACCESSPREADY=0
ACCESSSETUPPREADY=1 và còn transfer
ACCESSIDLEPREADY=1 và hết transfer

Hiện thực minh hoạ

FSM trạng thái hoạt động APB (IDLE/SETUP/ACCESS)

Hiện thực tối thiểu của sơ đồ trạng thái APB phía manager, kiểm bằng trace từng chu kỳ (có wait state và back-to-back).

apb_states.sv RTL
// Mô hình trạng thái hoạt động APB nhìn từ phía manager (minh hoạ cách hiện thực, không phải văn bản spec).// transfer: có yêu cầu truyền; pready: subordinate báo hoàn tất pha ACCESS.module apb_states (  input  logic clk, input logic presetn,  input  logic transfer, input logic pready,  output logic psel, output logic penable,  output logic [1:0] st_o);  typedef enum logic [1:0] {IDLE = 2'd0, SETUP = 2'd1, ACCESS = 2'd2} st_e;  st_e st;  always_ff @(posedge clk or negedge presetn)    if (!presetn) st <= IDLE;    else case (st)      IDLE:    if (transfer) st <= SETUP;      SETUP:   st <= ACCESS;                               // SETUP chỉ kéo dài 1 chu kỳ      ACCESS:  if (pready) st <= transfer ? SETUP : IDLE;  // !pready: chờ (wait state)      default: st <= IDLE;    endcase  assign psel    = (st != IDLE);  assign penable = (st == ACCESS);  assign st_o    = st;endmodule
tb_apb_states.sv testbench
module tb_apb_states;  logic clk = 0, presetn = 0, transfer = 0, pready = 0, psel, penable; logic [1:0] st;  string trace = "";  apb_states dut (.clk(clk), .presetn(presetn), .transfer(transfer), .pready(pready), .psel(psel), .penable(penable), .st_o(st));  always #5 clk = ~clk;  // giá trị đặt ở negedge sẽ được lấy mẫu ở posedge kế tiếp  task automatic step(input logic tr, input logic rdy);    transfer = tr; pready = rdy; @(negedge clk);    trace = {trace, (st == 0) ? "I" : (st == 1) ? "S" : "A"};    if (psel !== (st != 0) || penable !== (st == 2)) trace = {trace, "!"};  endtask  initial begin    @(negedge clk) presetn = 1;    step(1, 0);   // #1 IDLE→SETUP    step(1, 0);   // #2 SETUP→ACCESS    step(1, 0);   // #3 ACCESS, pready=0 → ở lại (wait)    step(1, 1);   // #4 ACCESS, pready=1, còn transfer → SETUP    step(0, 0);   // #5 SETUP→ACCESS    step(0, 1);   // #6 ACCESS, pready=1, hết transfer → IDLE    $display("APB RESULT TRACE=%s", trace);    $finish;  endendmodule

Đã kiểm chứng thế nào

  • Phân tích và elaborate theo LRM (pyslang 12.1.0)
  • Lint -Wall (Verilator 5.050)
  • Mô phỏng, exit 0 và output khớp kỳ vọng tính tay (Verilator 5.050, 2-state)
  • Tổng hợp, số cell khớp kỳ vọng (Yosys 0.70)

Output phải khớp: APB RESULT TRACE=SAASAI$

Kỳ vọng sau tổng hợp: apb_states: $_DFF* = 2

Các kiểm tra chạy lúc xây dựng nội dung (2026-11-06), không chạy trong trình duyệt. Kỳ vọng được tính tay trước khi chạy.

Write có wait state

APB write có 1 wait state (minh hoạ)

Minh hoạ vẽ tay, chưa đối chiếu với mô phỏng
0123456PCLKPSELPENABLEPWRITEPADDRA1PWDATAD1PREADY
  • Cột 1: SETUP
  • Cột 2: ACCESS, PREADY=0 → wait
  • Cột 3: ACCESS, PREADY=1 → hoàn tất ở cạnh kế
  • Cột 4: IDLE (không còn transfer)

Dự đoán waveform

Dự đoán PENABLE ở chu kỳ 2 và 4, PSEL ở chu kỳ 4.

Minh hoạ vẽ tay, chưa đối chiếu với mô phỏng
0123456PCLKPSEL?PENABLE??PWRITEPADDRA1PWDATAD1PREADY
ÔDự đoán
PENABLE ở cột 2
PENABLE ở cột 4
PSEL ở cột 4

Kiểm tra

Trạng thái APB

  1. Trong mô hình ex.d1.apb-fsm, SETUP kéo dài bao nhiêu chu kỳ?
  2. Ở ACCESS, PREADY=1 và còn transfer kế tiếp. Trạng thái tiếp theo?

Nguồn và mức độ đối chiếu

  1. AMBA APB Protocol Specification v2.0 (ARM IHI 0024C) — APB2/APB3/APB4, Operating states. Chưa đối chiếu với văn bản nguồn (mới xem thông tin xuất bản).
  2. AMBA APB Protocol Specification v2.0 (ARM IHI 0024C) — APB2/APB3/APB4, Signal descriptions. Chưa đối chiếu với văn bản nguồn (mới xem thông tin xuất bản).
  3. AMBA APB Protocol Specification v2.0 (ARM IHI 0024C) — APB2/APB3/APB4, Write transfer with wait states. Chưa đối chiếu với văn bản nguồn (mới xem thông tin xuất bản).
  4. AMBA APB Protocol Specification v2.0 (ARM IHI 0024C) — APB2/APB3/APB4, Operating states (chưa xác định số mục — chưa đọc PDF). Chưa đối chiếu với văn bản nguồn (mới xem thông tin xuất bản).
  5. AMBA APB Protocol Specification v2.0 (ARM IHI 0024C) — APB2/APB3/APB4, Write transfer with wait states (chưa xác định mục). Chưa đối chiếu với văn bản nguồn (mới xem thông tin xuất bản).