PicoRV32 笔记 05

接口信号

PicoRV32 提供一个本地存储器接口,Native Memory Interface。

本地存储器接口采用 valid-ready握手信号。这种机制在axi总线中使用相同,能够实现流控,

和axi总线不同点,PicoRV32本地接口使用一组valid-ready信号,而axi总线使用多个通道,每个通道有一组valid-ready信号。

PicoRV本地接口有如下信号

output        mem_valid
output        mem_instr
input         mem_ready

output [31:0] mem_addr
output [31:0] mem_wdata
output [ 3:0] mem_wstrb
input  [31:0] mem_rdata

mem_valid :当PicoRV进行一次存储读写时候,mem_valid有效,直到mem_ready有效。当这次传输是读取cpu执行指令的时候,mem_instr有效。

mem_instr:为高表示此次传输是获取指令;为低表示此次传输是获取数据

mem_ready:当从设备准备接收和发送数据的时候,置为有效。从设备也可直接给高

mem_addr : 读取存储器的地址

mem_wdata: PicoRV32写向存储器的数据

mem_wstrb:写信号,每1bit对应的mem_wdata中的8bit,在字节写,字写中有用。只可选下列值:

                4'b1111 : 32bit写

                4'b1100:高16bit写

                4'b0011:低16bit写

                4'b1000:字节写

                4'b0100:字节写

                4'b0010:字节写

                4'b0001:字节写

                4'b0000:32bit读

mem_rdata : 读数据,外设发给PicoRV32数据

读数据传输

PicoRV32在读数据时候,mem_wstrb必须为4'b0000,此时PicoRV32未使用mem_wdata信号;

读地址在mem_addr上出现,当mem_ready为高的时候,必须把读数据放到mem_rdata数据线上。mem_ready可以做成异步信号.下图官方文档中仿真波形

 上图中红色框选部分是两次读操作。

怎么确定是读还是写?

看mem_wstrb信号,如果mem_wstrb信号为4'b0000,则为读,其它值为写。

怎么确定是读指令还是读数据?

看mem_instr信号,高为读指令,低为读数据,显然第一框选为读数据,第二框选为读指令。

怎么确定读地址?

看mem_valid为高时刻,mem_addr的数据,第一框选地址为0x0000ABD4,第二框选地址为0x000009A8。

怎么确定读数据?

看mem_ready信号为高时刻,mem_rdata的数据,第一框选为0x6c6c6568,第二框选为0x05058082

数据在哪里被锁存?

看mem_ready,mem_valid同时为高,并且时钟上升沿出现时刻。

写数据传输

PicoRV32在写数据时候,mem_wstrb不为4'b0000,此时PicoRV32未使用mem_rdata信号;

写地址在mem_addr上出现,当mem_ready为高的时候,PicoRV32写数据放到mem_wdata数据线上。mem_ready可以做成异步信号,也可以直接给高电平.下图官方文档中仿真波形

怎么确定是读还是写?

看mem_wstrb信号,如果mem_wstrb信号为4'b0000,则为读,其它值为写。图中mem_wstrb为4'hf,表示32bit写

怎么确定是指令还是数据?

看mem_instr信号,高为指令,低为数据,显然图中为数据。指令只存在读,不存在写,所以写只针对写数据。

怎么确定写地址?

看mem_valid为高时刻,mem_addr的数据,图中写地址为0x10000000

怎么确定写数据?

看mem_valid信号为高时刻,mem_wdata的数据,图中数据为0x00000062

数据在哪里被锁存?

看mem_ready,mem_valid同时为高,并且时钟上升沿出现时刻。图中红色箭头指向的沿

简单从设备实现

上述说了这么多,怎么实现一个从设备,代码如下:

	wire        iomem_valid;
	reg         iomem_ready;
	wire [3:0]  iomem_wstrb;
	wire [31:0] iomem_addr;
	wire [31:0] iomem_wdata;
	reg  [31:0] iomem_rdata;

	reg [31:0] gpio;
	assign leds = gpio;

	always @(posedge clk) begin
		if (!resetn) begin
			gpio <= 0;
		end else begin
			iomem_ready <= 0;
			if (iomem_valid && !iomem_ready && iomem_addr[31:24] == 8'h 03) begin
				iomem_ready <= 1;
				iomem_rdata <= gpio;
				if (iomem_wstrb[0]) gpio[ 7: 0] <= iomem_wdata[ 7: 0];
				if (iomem_wstrb[1]) gpio[15: 8] <= iomem_wdata[15: 8];
				if (iomem_wstrb[2]) gpio[23:16] <= iomem_wdata[23:16];
				if (iomem_wstrb[3]) gpio[31:24] <= iomem_wdata[31:24];
			end
		end
	end

图中iomem_xxx 对应PicoRV32 mem_xxx信号

上述代码中实现一个简单led。这个led有一个32bit的寄存器 (reg [31:0]  gpio),主要对这个寄存器进行读写。

地址选中 iomem_addr[31:24] == 8'h03,表示当地址为 32'h03xx_xxxx都是操作这个寄存器。

当iomem_valid有效,表示PicoRV32有读写操作发过来,如果iomem_ready为低把gpio值放到iomem_rdata上,如果iomem_wstrb有值则把对应的iomem_wdata写到gpio寄存器

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
江科大STM32笔记是关于STM32单片机的学习笔记,其中涵盖了一些关于按键初始化和按键读取的代码示例。在这些代码中,通过引用中的Key_Init函数来对按键进行初始化,然后通过引用中的Key_GetNum函数来获取按键按下的键码值。代码中使用了STM32的GPIO模块来配置引脚的工作模式和读取引脚的电平状态。此外,引用中提到STM32内部集成了硬件收发电路,可以通过写入控制寄存器CR和数据寄存器DR来实现与外设的通信,并通过读取状态寄存器SR来了解外设电路的当前状态。这些寄存器的使用可以实现对外设的控制和监测,减轻CPU的负担。因此,江科大STM32笔记主要是介绍了STM32单片机的相关知识和编程技巧。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [STM32学习笔记 -- I2C(江科大)](https://blog.csdn.net/weixin_61244109/article/details/131002266)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [STM32江科大学习笔记](https://blog.csdn.net/weixin_38647099/article/details/128337708)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jjinl

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值