【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

Matlab Copilot_AI工具箱: 对接DeepSeek/Kimi/GPT/千问/文心一言等多款AI大模型,一站式提升编程效率

Matlab Copilot_AI工具箱: 对接DeepSeek/Kimi/GPT/千问/文心一言等多款AI大模型,一站式提升编程效率

🔥 为什么需要这款工具? * Matlab 2025虽自带Copilot功能,但受地区、许可证的限制,多数用户无法使用; * 在Matlab和ChatGPT、DeepSeek等AI模型之间来回切换操作繁琐,无法实现“所见即所得”的编程体验,且代码报错后的调试繁琐。 这款Matlab Copilot_AI工具箱作为Matlab与多款AI模型的对接载体,支持DeepSeek V3.2(基础/思考版)、Kimi K2、百度文心一言、阿里云通义千问、ChatGPT(百度千帆版)等模型,还支持4种自定义模型配置(可对接百度千帆平台近百种大模型); 工具直接在Matlab内(不限于2025a)运行,无需切换其他软件,支持“一键生成、运行、调试、修复bug、导出”全流程编程辅助,使用成本可控(单模型月均几元即可满足基础使用),且工具箱一次授权终身免费更新。 多款AI模型可选择,还支持四种自定义模型组合。 更新记录 1. 20260123更新至v4.0,更新:

llama.cpp量化模型部署实战:从模型转换到API服务

1. 为什么你需要关注llama.cpp:让大模型在普通电脑上跑起来 如果你对AI大模型感兴趣,肯定听说过动辄需要几十GB显存的“庞然大物”。想在自己的电脑上跑一个7B参数的模型,以前可能得配一张昂贵的专业显卡。但现在,情况不一样了。我今天要跟你聊的 llama.cpp,就是那个能让大模型“瘦身”并飞入寻常百姓家的神奇工具。 简单来说,llama.cpp是一个用C/C++编写的开源项目,它的核心目标只有一个:用最高效的方式,在消费级硬件(比如你的笔记本电脑CPU)上运行大型语言模型。它不像PyTorch那样是个庞大的深度学习框架,它更像一个“推理引擎”,专注于把训练好的模型,以最小的资源消耗跑起来。 我刚开始接触大模型部署时,也被各种复杂的依赖和巨大的资源需求劝退过。直到用了llama.cpp,我才发现,原来在我的MacBook Pro上,也能流畅地和Llama 2这样的模型对话。这背后的功臣,主要就是两点:纯C/C++实现带来的极致性能,以及模型量化技术带来的体积与速度革命。量化这个词听起来有点技术,你可以把它想象成给模型“压缩图片”

超详细版Arduino多舵机控制:机器人动态平衡实现

用Arduino玩转机器人平衡术:从舵机控制到姿态稳定实战 你有没有想过,一个靠两个轮子站立、还能自动站稳不倒的机器人,是怎么做出来的?听起来像是高科技实验室里的产物,但其实—— 一块Arduino、几个舵机和一个MPU6050传感器,就能让你亲手实现! 这不仅是炫技,更是理解现代机器人控制核心逻辑的最佳入口。今天我们就来拆解这个“自平衡机器人”的完整技术链条,带你一步步从 信号驱动 、 姿态感知 ,走到 闭环控制 ,最终让机器真正“站起来”。 舵机怎么听懂Arduino的话? 别看舵机小小一个,它其实是“自带大脑”的执行器。我们不需要操心齿轮怎么转、电机怎么调速,只要给它一条“命令”——比如:“转到90度”,它自己就会完成定位。 而这条命令,就是通过 PWM(脉宽调制)信号 传递的。 PWM到底是什么? 简单说,PWM就是一个周期性方波信号,高电平持续的时间决定了舵机的角度: 脉冲宽度 对应角度 1.0ms 0°

Dremio的Apache Arrow 和 Gandiva

Dremio的Apache Arrow 和 Gandiva

Apache Arrow 和 Gandiva 是 Dremio 查询引擎的“心脏”与“肌肉”,它们共同解决了传统分析系统在数据交换和计算效率上的根本瓶颈。 核心关系图:Dremio 的性能基石 +-----------------------------------+ | Dremio 查询引擎 | | (SQL解析、优化、调度、执行) | +------------------+------------------+ | +---------------v---------------+ | **Gandiva 向量化执行层** | | (基于LLVM的表达式编译与计算) | +---------------+---------------+ | +---------------v---------------+ | **Apache Arrow 内存格式** | | (进程间/语言间零拷贝数据交换) | +---------------+---------------+ | +---------------v---------------+ | 底层数据源/反射存储 | |