【FPGA】使用高云FPGA与stm32进行FMC通信协议

【FPGA】使用高云FPGA与stm32进行FMC通信协议
//fsmc read / write ep4ce6 demo module fsmc( ab, //address db, //data wrn, //wr rdn, //rd resetn, //resetn csn, //cs ina, //input data a inb, //input data b inc, //input data c ind, //input data d ine, //input data e inf, //input data f ing, //input data g inh, //input data h outa, //output data a outb, //output data a outc, //output data a outd, //output data a oute, //output data a outf, //output data a outg, //output data a outh //output data a ); input[2:0] ab; inout[15:0] db; input wrn; input rdn; input resetn; input csn; input [15:0] ina; input [15:0] inb; input [15:0] inc; input [15:0] ind; input [15:0] ine; input [15:0] inf; input [15:0] ing; input [15:0] inh; output reg [15:0] outa; output reg [15:0] outb; output reg [15:0] outc; output reg [15:0] outd; output reg [15:0] oute; output reg [15:0] outf; output reg [15:0] outg; output reg [15:0] outh; wire rd; wire wr; reg [15:0] indata; assign rd = !(csn & rdn); //get rd pulse ____|~~~~|______ assign wr = !(csn & wrn); //get wr pulse ____|~~~~|______ assign db = rd ? indata:16'hzzzz; //write data, 根据地址线选择八个空间写入,每个空间16位 always @(negedge wr or negedge resetn) begin if(!resetn)begin outa <= 16'h0000; outb <= 16'h0000; outc <= 16'h0000; outd <= 16'h0000; oute <= 16'h0000; outf <= 16'h0000; outg <= 16'h0000; outh <= 16'h0000; end else begin case (ab) 3'b000:outa <= db; 3'b001:outb <= db; 3'b010:outc <= db; 3'b011:outd <= db; 3'b100:oute <= db; 3'b101:outf <= db; 3'b110:outg <= db; 3'b111:outh <= db; default:; endcase end end //read data 根据地址线选择8个空间读取,每个空间 16位 always @(rd or !resetn) begin if(!resetn)indata <= 16'h0000; else begin case (ab) 3'b000:indata <= ina; 3'b001:indata <= inb; 3'b010:indata <= inc; 3'b011:indata <= ind; 3'b100:indata <= ine; 3'b101:indata <= inf; 3'b110:indata <= ing; 3'b111:indata <= inh; default:; endcase end end endmodule 

 FMC通信协议的FPGA代码

这里的FMC_A0表示的是地址线 

这里有13位地址线和16位数据线,行地址与列地址是公用的,作为行地址时使用了0~12位,作为列地址时使用了0~8位;

  • FMC_SDNWE:低电平时写,高电平时读;
  • FMC_SDNCAS:列地址选通信号,低电平有效;
  • FMC_SDNRAS:行地址选通信号,低电平有效;
  • FMC_SDNE0:片选信号,低电平有效;
  • FMC_BA0~1:Bank选择信号,两位对应4个区域
  • FMC_SDCKE0:时钟使能信号;
  • FMC_SDCLK:时钟信号;
  • FMC_NBL0~1:写访问的输出字节屏蔽,数据掩码

在我们板子中用到的

这实际上是FMC控制器对内核地址映射的结果,其实质就是对于地址的控制。

那么有没有简单的方法呢? 有的! STM32自带的FSMC功能,就是专门为这类存储器设计的,在STM32上,有一些引脚被专门设计成地址线,还有一些被专门设计成数据线,还有一些被设计成控制线,然后这些地址线和数据线对应着固定的地址,只要外部的DRAM等存储器将对应的数据线连接到STM32这些对应的引脚上,引脚功能设置为复用模式,通过配置FSMC ,你可以直接给上面那个固定的地址赋值 ,其他操作STM32都会自动给你完成,就可以把数据存储到SRAM中!

这里FPGA的通信也是如此,在配置好引脚后对其进行自动赋值,然后再对地址进行读写操作

 在高云这里,有二十二个引脚需要我们去配置。

这个是目前对于Muxed PSRAM的配置

 

这里我们重点挑出

FMC_NL,

FMC_NOE,

FMC_NWE,

FMC_NE2

进行研究。 这里一共有20个引脚

对应一下FPGA的

 FPGA这里除了数据线外多了

RST

FPGA_WR_NWE

FPGA_RD_NOE

FPGA_NL_NADV

FPGA_CS_NEL

CLK

这里有22个引脚,我们可以发现,这里多了两个引脚,一个是由rll来进行时钟控制,还有一个则是用于硬件的复位重启。

Read more

机器人十年演进

机器人十年演进(2015-2025):从工业专用自动化设备到通用具身智能体的全栈革命 2015-2025年,是全球机器人产业完成**从「硬件定义的工业专用自动化设备」到「软件定义的通用具身智能体」**全栈式跃迁的黄金十年。这十年,机器人技术彻底打破了“只能在静态封闭产线执行固定重复动作”的核心桎梏,完成了从单机自动化到集群智能化、从人工示教编程到自主认知决策、从单一场景限定到全场景泛化适配的跨越式发展;同时,中国机器人产业完成了从完全技术跟随、海外品牌垄断,到全栈自主可控、核心领域全球领跑的历史性跨越,从全球机器人产业的“追随者”成长为“规则引领者”。 这十年,机器人产业的演进始终沿着「单机精度突破→柔性场景适配→规模化全场景落地→通用具身智能跃迁」的核心主线推进,与感知、定位、规控、标定、仿真、软件架构、算法、质量控制等核心子系统的迭代深度耦合,最终实现了从“工业自动化工具”到“可人机协同的智能伙伴”的本质蜕变。 一、核心演进四阶段:与产业发展同频的代际重构 机器人产业的十年演进,

ROS2机器人slam_toolbox建图零基础

系统:Ubuntu22.04 ROS2版本:Humble 雷达设备:rplidar_a1 一、安装必要的软件包 # 更新系统 sudo apt update # 安装slam_toolbox sudo apt install ros-humble-slam-toolbox # 安装RPLidar驱动 sudo apt install ros-humble-rplidar-ros # 安装导航相关包 sudo apt install ros-humble-navigation2 ros-humble-nav2-bringup 二、配置RPLidar_A1 创建udev规则(让系统识别雷达) # 创建udev规则 echo 'KERNEL=="ttyUSB*", ATTRS{idVendor}=="10c4", ATTRS{idProduct}

简单易学的分离式部署小米智能家居Miloco方法

一、安装环境 * Windows用户:安装WSL2以及Docker * macOS/Linux用户:安装Docker 此处不再赘述,网上随便找个教程即可。特别地,对于Windows用户来说,你需要将 WSL2 的网络模式设置为 Mirrored。 二、使用Docker部署Miloco后端 以下均为bash命令。请Windows用户进入WSL2 / Linux、macOS用户进入终端操作: mkdir miloco cd milico vi docker-compose.yml 以下是compose的内容(不会使用vi的同学可以傻瓜式操作:先按i,再使用粘贴功能,然后按冒号,输入wq然后回车,记得关闭输入法): services:backend:container_name: miloco-backend image: ghcr.nju.edu.cn/xiaomi/miloco-backend:latest network_mode: