【ARM AMBA APB 入门 1.1 -- APB 读写寄存器 RTL 实现】

请阅读【ARM AMBA 总线 文章专栏导读】


文章目录

    • [APB 寄存器访问](#APB 寄存器访问)
      • [APB 读寄存器 RTL 代码实现](#APB 读寄存器 RTL 代码实现)
      • [APB 写寄存器 RTL 代码实现](#APB 写寄存器 RTL 代码实现)

APB 寄存器访问

APB 读寄存器 RTL 代码实现

APB 总线读寄存器操作代码实现:

bash 复制代码
wire [31:0] SOC_PLL_CFG_REG;
wire [31:0] SOC_PLL_LOCK_REG;
wire [31:0] SOC_PLL_BP_REG;

always@(posedge clk) begin
  if(psel & (~pwrite)) begin
  case(paddr)
    32'b00000000 + 32'h10 : prdata <= SOC_PLL_CFG_REG;
    32'b00000000 + 32'h14 : prdata <= SOC_PLL_LOCK_REG;
    32'b00000000 + 32'h18 : prdata <= SOC_PLL_BP_REG;
    default: prdata <= 32'hdeadbeaf;
  endcase
  end
end

assign SOC_PLL_CFG_REG[31:24] = 8'b0;
assign SOC_PLL_CFG_REG[23:12] = soc_pll_cfg_reg_rd;
assign SOC_PLL_CFG_REG[11:9] = soc_pll_postdiv1;
assign SOC_PLL_CFG_REG[8:6] = SOC_PLL0_postdiv2;
assign SOC_PLL_CFG_REG[5:0] = soc_pll_postdvi2;

从上面代码可以看到 当 psel 为 高,且 pwrite 为 低的时候 去判断 paddr 的地址对应哪个寄存器的地址,然后将该寄存器的值赋值给 prdata。

同时也可以看到,SOC_PLL_CFG_REG 位域中的各个值,来源于不同的信号。

APB 写寄存器 RTL 代码实现

bash 复制代码
reg_wr = psel & pwrite & penable;
reg_rd = psel & (~pwrite)
assign soc_pll_cfg_reg_wr = (paddr == 32'h00000000 + 32'h10) & reg_wr;
assign soc_pll_cfg_reg_rd = (paddr == 32'h00000000 + 32'h10) & reg_rd;

always@(posedge clk or negedge rst_n) begin
  if(!rst_n) begin
    soc_pll_cfg_reg_rd < 12'd57;
  end
  else if (soc_pll_cfg_reg_wr) begin
    soc_pll_cfg_reg_rd < pwdata[23:12];
  end
end

always@(posedge clk or negedge rst_n) begin
  if(!rst_n) begin
    soc_pll_postdiv1 < 3'b0;
  end
  else if (soc_pll_cfg_reg_wr) begin
    soc_pll_postdiv1 < pwdata[11:9];
  end
end

always@(posedge clk or negedge rst_n) begin
  if(!rst_n) begin
    soc_pll_postdiv2 < 3'b3;
  end
  else if (soc_pll_cfg_reg_wr) begin
    soc_pll_postdvi2 < pwdata[8:6];
  end
end
always@(posedge clk or negedge rst_n) begin
  if(!rst_n) begin
    soc_pll_postdvi2 < 6'd4;
  end
  else if (soc_pll_cfg_reg_wr) begin
    soc_pll_postdvi2 < pwdata[5:0];
  end
end

从上面的代码中可以看到,在写 SOC_PLL_CFG_REG 这个寄存器的的时候需要先保证 soc_pll_cfg_reg_wr 这个信号为高,这个信号的作用是保证 寄存器的地址已经 APB 总线都准备好了之后才进行写操作。

相关推荐
女神下凡1 天前
嵌入式设计的各种存储芯片的硬件/软件设计规范,非常全面。
arm开发·单片机·嵌入式硬件
从零开始的嵌入式之旅2 天前
day47
arm开发·经验分享·笔记·嵌入式硬件
老当益壮梁奶奶2 天前
ARM汇编学习笔记(六):【i.MX6ULL】时钟系统与定时器(EPIT & GPT)
c语言·arm开发·嵌入式硬件·学习·51单片机
昌原的儿子LEO2 天前
IMX6ULL 时钟系统与 EPIT/GPT 定时器原理与配置
arm开发·学习
sunoo-2292 天前
【ARM嵌入式学习笔记Day6】一文打通i.MX6ULL时钟体系:PLL/PFD/预分频+滞回比较器全解析
arm开发·笔记·vscode·单片机·imx6ull·汇编语言
M78佐菲2 天前
ARM学习笔记(1)
linux·arm开发·笔记·嵌入式硬件·学习
sunoo-2292 天前
【嵌入式裸机开发Day04】i.MX6ULL 蜂鸣器驱动详解:从引脚地址查找到代码实现全流程
arm开发·单片机·嵌入式硬件·学习·串口·裸机
Doraemomo2 天前
IMX6ULL裸机开发——PWM
arm开发·嵌入式硬件·imx6ull
老当益壮梁奶奶2 天前
ARM汇编学习笔记(五):从按键轮询到 GIC 中断控制器(ARM Cortex-A7 )
arm开发·笔记·单片机·嵌入式硬件
M78佐菲3 天前
ARM学习笔记(五)
linux·arm开发·笔记·嵌入式硬件·学习