FMC与FPGA双口ram通讯
硬件环境:ARM+FPGA通过FMC互联,STM32F767和 EP4CE15F23I7
FMC设置,STM的系统时钟HCLK为216MHz
/* FMC initialization function */
void MX_FMC_Init(void)
{
FMC_NORSRAM_TimingTypeDef Timing; /** Perform the NOR1 memory initialization sequence
*/
hnor1.Instance = FMC_NORSRAM_DEVICE;
hnor1.Extended = FMC_NORSRAM_EXTENDED_DEVICE;
/* hnor1.Init */
hnor1.Init.NSBank = FMC_NORSRAM_BANK1;
hnor1.Init.DataAddressMux = FMC_DATA_ADDRESS_MUX_DISABLE;
hnor1.Init.MemoryType = FMC_MEMORY_TYPE_NOR;
hnor1.Init.MemoryDataWidth = FMC_NORSRAM_MEM_BUS_WIDTH_16;
hnor1.Init.BurstAccessMode = FMC_BURST_ACCESS_MODE_DISABLE;
hnor1.Init.WaitSignalPolarity = FMC_WAIT_SIGNAL_POLARITY_LOW;
hnor1.Init.WaitSignalActive = FMC_WAIT_TIMING_BEFORE_WS;
hnor1.Init.WriteOperation = FMC_WRITE_OPERATION_ENABLE;
hnor1.Init.WaitSignal = FMC_WAIT_SIGNAL_DISABLE;
hnor1.Init.ExtendedMode = FMC_EXTENDED_MODE_DISABLE;
hnor1.Init.AsynchronousWait = FMC_ASYNCHRONOUS_WAIT_DISABLE;
hnor1.Init.WriteBurst = FMC_WRITE_BURST_DISABLE;
hnor1.Init.ContinuousClock = FMC_CONTINUOUS_CLOCK_SYNC_ONLY;
hnor1.Init.WriteFifo = FMC_WRITE_FIFO_ENABLE;
hnor1.Init.PageSize = FMC_PAGE_SIZE_NONE;
/* Timing */
Timing.AddressSetupTime = ;
Timing.AddressHoldTime = ;
Timing.DataSetupTime = ;
Timing.BusTurnAroundDuration = ;
Timing.CLKDivision = ;
Timing.DataLatency = ;
Timing.AccessMode = FMC_ACCESS_MODE_A;
/* ExtTiming */ if (HAL_NOR_Init(&hnor1, &Timing, NULL) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
}
verilog核心代码,其中双口ram的a口与FPGA内部模块相连,b口与ARMFMC端口相连,clk时钟为100MHz
reg wr_clk1,wr_clk2;.
wire rd = (cs0 | rdn);
wire wr = (cs0 | wrn);
wire clk_b = (!wr_clk2 | !rd); ram u1(
.data_a(data_a),
.address_a(address_a),
.wren_a(wren_a),
.rden_a(rden_a),
.clock_a(clk_50m),
.q_a(dataout_a), .data_b(db),
.address_b(ab),
.wren_b(!wr),
.rden_b(!rd),
.clock_b(clk_b),
.q_b(dataout_b)
); always@(posedge clk_100m or negedge rst_n)
if(!rst_n)
begin
wr_clk1 <= 'd1;
wr_clk2 <= 'd1;
end
else
{wr_clk2,wr_clk1} <= {wr_clk1,wr}; assign db = !rd ? dataout_b : 'hzzzz;
在SignalTap中调试发现有时写入丢失(写入后读出不正常),时序上具体体现为
上图中wr信号丢失,造成部分写入失败,wr由ARM输出,与FPGA时钟异步,这里是时钟匹配问题,导致信号丢失,查看STM32F7XX手册关于FMC时序:
图中可以看到, rd与ADDSET时间有关,wr与DATAST-1时间有关,结合前面FMC程序中
Timing.DataSetupTime = 4;
那么wr理论时间是3*HCLK = 3/216MHZ ≈14ns, FPGA时钟周期10ns,理论上wr信号不会丢失。猜想可能是异步信号,同时信号边沿存在斜率(有条件可以用示波器捕捉验证),可能存在信号丢失现象,这里修改FMC时间配置参数。
/* Timing */
Timing.AddressSetupTime = ;
Timing.AddressHoldTime = ;
Timing.DataSetupTime = ;
Timing.BusTurnAroundDuration = ;
Timing.CLKDivision = ;
Timing.DataLatency = ;
Timing.AccessMode = FMC_ACCESS_MODE_A;
修改后发现以上问题得到解决,调试时序如下:
FMC与FPGA双口ram通讯的更多相关文章
- 【iCore1S 双核心板_FPGA】例程十七:基于双口RAM的ARM+FPGA数据存取实验
实验现象: 核心代码: module DUAL_PORT_RAM( input CLK_12M, inout WR, input RD, input CS0, :]A, :]DB, output FP ...
- 用嵌入式块RAM IP核配置一个双口RAM
本次设计源码地址:http://download.csdn.net/detail/noticeable/9914173 实验现象:通过串口将数据发送到FPGA 中,通过quartus II 提供的in ...
- 双口RAM,值得研究
在FPGA设计过程中,使用好双口RAM,也是提高效率的一种方法. 官方将双口RAM分为简单双口RAM和真双口RAM. 简单双口RAM只有一个写端口,一个读端口. 真双口RAM分别有两个写端口和两个读端 ...
- 单口 RAM、伪双口 RAM、真双口 RAM、单口 ROM、双口 ROM 到底有什么区别呢?
打开 IP Catalog,搜索 Block Memory Generator,即可看到其 Memory Type 可分为 5 中,分别是单口 RAM(Single Port RAM).伪双口 RAM ...
- 单口RAM、双口RAM、FIFO
单口与双口的区别在于,单口只有一组数据线与地址线,因此读写不能同时进行.而双口有两组数据线与地址线,读写可同时进行.FIFO读写可同时进行,可以看作是双口. 双口RAM分伪双口RAM(Xilin ...
- 【iCore4 双核心板_FPGA】例程十六:基于双口RAM的ARM+FPGA数据存取实验
实验现象: 核心代码: int main(void) { /* USER CODE BEGIN 1 */ int i; int address,data; ; ]; ]; char *p; /* US ...
- 【iCore3 双核心板_FPGA】实验十九:基于双口RAM的ARM+FPGA数据存取实验
实验指导书及代码包下载: http://pan.baidu.com/s/1pLReIc7 iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...
- 单双口RAM
// Quartus II Verilog Template// Simple Dual Port RAM with separate read/write addresses and// singl ...
- 【知识强化】第三章 存储系统 3.5 双口RAM和多模块存储器
下面我们进入双端口RAM和多模块存储器的学习.这是提高我们的存储器的访存速度的一些措施. 我们之前已经讲过我们的主存和CPU是进行连接的,那么这就导致了一个问题就是说,随着我们现代科技的发展,计算机的 ...
随机推荐
- 安装centos6.10时,安装完成重启报错error 15,file not found
今天在一台老式联想服务器上安装centos6.10操作系统,安装完成,重启时,出现报错 error 15, file not found...... 在百度上搜索到进grub编辑,可还是无法解决问题, ...
- Linux的DNS实现负载均衡及泛域名部署
DNS负载均衡技术的实现原理是在DNS服务器中为同一个主机名配置多个IP地址,在应答DNS查询时,DNS服务器对每个查询将以DNS文件中主机记录的IP地址按顺序返回不同的解析结果,将客户端的访问引导到 ...
- python安装第三方库--换镜像源
python安装第三方库--换镜像源 1. 更换anaconda源 清华大学镜像:清华大学镜像 anaconda下载地址:https://mirrors.tuna.tsinghua.edu.cn/an ...
- 性能测试基础---jmeter二次开发
·Jmeter的二次开发,常见的有以下几种类型: ·扩展.修改Jmeter已有的组件(源代码) ·扩展.修改Jmeter已有的函数. ·完全自主开发一个新的组件(依赖于Jmeter提供的框架). ·扩 ...
- jquery 统计统计子标签的个数
本文实例讲述了jQuery获得子元素个数的方法.分享给大家供大家参考.具体分析如下://获取id=div1下的子元素的个数$('#div1').children().length;//获取id=div ...
- 12-cmake语法-内部变量-系统信息
系统信息 CMAKE_MAJOR_VERSION CMAKE 主版本号,比如 2.4.6 中的 2 CMAKE_MINOR_VERSION CMAKE 次版本号,比如 2.4.6 中的 4 CMAKE ...
- 渗透测试工具Nmap篇
Nmap是一款网络扫描和主机检测的非常有用的工具. Nmap是不局限于仅仅收集信息和枚举,同时可以用来作为一个漏洞探测器或安全扫描器.它可以适用于winodws,linux,mac等操作系统.Nmap ...
- Flask内的特殊装饰器
@app.template_global() # 全局变量 @app.template_filter() # 偏函数 @app.before_request # 请求进入视图函数之前,比 ...
- 【CSP-S膜你考】 A
A 题面 对于给定的一个正整数n, 判断n是否能分成若干个正整数之和 (可以重复) , 其中每个正整数都能表示成两个质数乘积. 输入格式 第一行一个正整数 q,表示询问组数. 接下来 q 行,每行一个 ...
- GitHub 干货 | 各大数据竞赛 Top 解决方案开源汇总
AI 科技评论编者按:现在,越来越多的企业.高校以及学术组织机构通过举办各种类型的数据竞赛来「物色」数据科学领域的优秀人才,并借此激励他们为某一数据领域或应用场景找到具有突破性意义的方案,也为之后的数 ...