FSMC读取FPGA的FIFO

news/2024/10/18 23:24:31/

一、硬件说明

  1. FSMC配置
    在这里插入图片描述
    在这里插入图片描述
    单片机的代码如下:
#define VALUE_ADDRESS_AD1 (__IO uint16_t *)0x60400000while (1){if(!HAL_GPIO_ReadPin(GPIOF, GPIO_PIN_8))   //数据非空{data = *(__IO uint16_t *)VALUE_ADDRESS_AD1;data2 = *(__IO uint16_t *)VALUE_ADDRESS_AD1;printf("fsmc rd %d:%d\r\n",data,data2);HAL_Delay(10);}}
  1. FPGA代码
//
// Description: 数据传入32位的FIFO, 用FSMC分2次读出
//
module fifo_32_fsmc_rd(input clk,input reset_n,input fsmc_noe, //read signaloutput led,output  fifo_empty,output reg [15:0]fsmc_data);
parameter  WR_CNT = 5'd30-1;//写入30组数据wire   empty; 
assign  fifo_empty = empty;
assign  led =!empty; //fifo有数据则灯亮,空则灭    assign rst = !reset_n;   
//先往FIFO存入数据 
wire  wr_rst_busy; 
reg [4:0]wr_cnt;//写入的数据进行计数
reg [3:0]state; //4种状态
parameter  IDLE = 4'b0001,READY =4'b0010,WRITE =4'b0100;
always @(posedge clk or negedge reset_n)beginif(!reset_n)state<=IDLE; //空闲状态else case(state)IDLE:if(wr_rst_busy)state<=IDLE;elsestate<=READY; //ready状态READY:if(wr_rst_busy)state<=IDLE;else if(empty)//若空则写入数据state<=WRITE;elsestate<=READY;WRITE:if(wr_cnt < WR_CNT)state <= WRITE;else state <= READY;default:  state<=IDLE;                     endcase
end
reg  wr_en;
always @(posedge clk or negedge reset_n)beginif(!reset_n)beginwr_cnt <= 5'd0;wr_en <= 1'b0;endelse if(state == WRITE)beginwr_en <= 1'b1;wr_cnt <= wr_cnt+1'b1;endelse if(state == READY)beginwr_cnt <= 5'd0;wr_en <= 1'b0;end            
endreg [31:0]din ;//fifo输入数据累加
always @(posedge clk or negedge reset_n)beginif(!reset_n)din <=32'd0;else if(state == WRITE)din <= din +1'b1;elsedin <= din ;
end   //从FIFO开始往外读出
wire [7:0]wr_data_count;//fsmc_noe下降沿检测
reg reg_fsmc_noe1;
reg reg_fsmc_noe2;
wire  falling_fsmc_noe;always @(posedge clk)beginreg_fsmc_noe1 <= fsmc_noe;reg_fsmc_noe2 <= reg_fsmc_noe1;
end
assign falling_fsmc_noe = ((!reg_fsmc_noe1) & reg_fsmc_noe2);wire [15 : 0] dout;
wire rd_rst_busy;
always @(posedge clk )fsmc_data <= dout;fifo_generator_0 fifo_32in (.clk(clk),                      // input wire clk.rst(rst),                      // input wire rst.din(din),                      // input wire [31 : 0] din.wr_en(wr_en),                  // input wire wr_en.rd_en(falling_fsmc_noe),                  // input wire rd_en.dout(dout),                    // output wire [15 : 0] dout.full(),                    // output wire full.empty(empty),                  // output wire empty.wr_data_count(wr_data_count),  // output wire [7 : 0] wr_data_count.wr_rst_busy(wr_rst_busy),      // output wire wr_rst_busy.rd_rst_busy(rd_rst_busy)      // output wire rd_rst_busy
);  endmodule

配置FIFO

在这里插入图片描述
在这里插入图片描述
写FIFO测试

`timescale 1ns / 1psmodule fifo_32_fsmc_rd_tb();
reg clk,noe,reset_n;
wire fifo_empty;initial clk=1'b1;
always #10 clk= ~clk;initial beginreset_n = 1'b0;noe=1;#51;reset_n = 1'b1;#10000;$stop;
endfifo_32_fsmc_rd fifo_32_fsmc_rd1(.clk(clk),.reset_n(reset_n),.fsmc_noe(noe), //read signal.led(),.fifo_empty(fifo_empty),.fsmc_data());
endmodule

2. 最终单片机读到数据的实验结果, 只截取部分数据

smc rd 0:88
fsmc rd 0:89
fsmc rd 0:90
fsmc rd 0:91
fsmc rd 0:92
fsmc rd 0:93
fsmc rd 0:94
fsmc rd 0:95
fsmc rd 0:96
fsmc rd 0:97
fsmc rd 0:98
fsmc rd 0:99
fsmc rd 0:100
fsmc rd 0:101
fsmc rd 0:102
fsmc rd 0:103
fsmc rd 0:104
fsmc rd 0:105
fsmc rd 0:106
fsmc rd 0:107
fsmc rd 0:108
fsmc rd 0:109
fsmc rd 0:110
fsmc rd 0:111
fsmc rd 0:112
fsmc rd 0:113
fsmc rd 0:114
fsmc rd 0:115
fsmc rd 0:116
fsmc rd 0:117
fsmc rd 0:118
fsmc rd 0:119
fsmc rd 0:120
fsmc rd 0:121
fsmc rd 0:122
fsmc rd 0:123
fsmc rd 0:124
fsmc rd 0:125
fsmc rd 0:126
fsmc rd 0:127
fsmc rd 0:128
fsmc rd 0:129
fsmc rd 0:130

读出的数据正常


http://www.ppmy.cn/news/1437725.html

相关文章

学习 Rust 的第九天:如何使用结构体

好的&#xff0c;我已经收到完整的内容了。我会按照规则对其进行翻译&#xff0c;稍等片刻。 大家好&#xff0c; 今天是学习 Rust 的第九天&#xff0c;我们要讨论一个非常重要的概念&#xff0c;即 结构体&#xff08;structs&#xff09;&#xff0c;它可以将相关的数据组…

第5章 全局大喇叭——详解广播机制

第5章 全局大喇叭——详解广播机制 如果你了解网络通信原理应该会知道&#xff0c;在一个IP网络范围中&#xff0c;最大的IP地址是被保留作为广播地址来使用的。 比如某个网络的IP范围是192.168.0.XXX&#xff0c;子网掩码是255.255.255.0&#xff0c;那么这个网络的广播地址…

浅谈架构方法之时间片轮询

PS&#xff1a;最近在逛CSDN的时候偶然发现了一篇文章讲到了这个架构&#xff0c;发现之前做过一个项目就用了这个东西&#xff0c;于是我搜了一下&#xff0c;感觉挺多文章都不好理解&#xff0c;由于我也是最近才接触到这个东西&#xff0c;所以我决定自己也写一篇&#xff0…

HTML--标签

1.加粗标签 <strong>文字内容</strong> 2.分割线 <hr> 3.问题 4.HTML基本骨架 HTML基本骨架是网页模板。 html&#xff1a;整个网页 head&#xff1a;网页头部&#xff0c;存放浏览器看的代码&#xff0c;例如CSS。 body&#xff1a;网页主体&#xf…

设置Ollama在局域网中访问的方法(Ubuntu)

趁着Llama3的热度试了一下Ollama&#xff0c;果然部署推理大模型很有用。一个现实的需求是&#xff0c;如果我们要在局域网中访问Ollama上大模型的服务&#xff0c;应该怎么办呢&#xff1f;参考了一下其他博客的方法 例如&#xff1a;一分钱不花&#xff01;手把手教你部署Go…

自动化测试Selenium(4)

WebDriver相关api 定位一组元素 webdriver可以很方便地使用findElement方法来定位某个特定的对象, 不过有时候我们需要定位一组对象, 这时候就要使用findElements方法. 定位一组对象一般用于一下场景: 批量操作对象, 比如将页面上的checkbox都勾上. 先获取一组对象, 再在这组…

授人以渔 选购篇九:扫地机器人(扫拖机器人)选购要点

文章目录 系列文章自动上下水导航技术&#xff1a;立体激光导航视觉导航&#xff0c;多传感器清洁能力&#xff1a;胶条刷、旋转拖布健康卫生&#xff1a;热水洗拖布、热风烘干智能功能品牌其他 系列文章 授人以渔 选购篇一&#xff1a;信用卡选购要点 授人以渔 选购篇二&…

报错:测试报错postman(测试接口)

报错如下 c.e.exception.GlobalExceptionHandler : 异常信息&#xff1a; Content type multipart/form-data;boundary--------------------------952399813172082093419475;charsetUTF-8 not supported 解决&#xff1a; 异常信息 Content type multipart/form-data;boundary…