【iCore4 双核心板_FPGA】例程十六:基于双口RAM的ARM+FPGA数据存取实验
实验现象:

核心代码:
int main(void)
{ /* USER CODE BEGIN 1 */
int i;
int address,data;
char error_flag = ;
char receive_data[];
char buffer[];
char *p;
/* USER CODE END 1 */ /* MCU Configuration----------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */
SystemClock_Config(); /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USART6_UART_Init();
MX_FMC_Init(); /* USER CODE BEGIN 2 */
usart6.initialize();
usart6.printf("Hello, I am iCore4!\r\n");
LED_GREEN_ON;
/* USER CODE END 2 */ /* Infinite loop */
/* USER CODE BEGIN WHILE */
while ()
{
/* USER CODE END WHILE */ /* USER CODE BEGIN 3 */
if(usart6.receive_ok_flag == ){
usart6.receive_ok_flag = ;
memset(receive_data,,sizeof(receive_data));
memset(buffer,,sizeof(buffer));
for(i = ;i < ;i ++){
receive_data[i] = usart6.receive_buffer[i];
}
p = receive_data;
i = ;
while(*p != ':'){ //»ñÈ¡²Ù×÷ÃüÁwrite or read£©
buffer[i++] = *p++;
if(i > sizeof(buffer))i = ;
}
for(i = ;i < sizeof(buffer);i++){//½«ÃüÁîת»¯ÎªÐ¡Ð´×Ö·û
buffer[i] = tolower(buffer[i]);
} if(memcmp(buffer,"read",strlen("read")) == ){//Ö´ÐжÁ²Ù×÷
error_flag = ;
p++;
address = atoi(p);
if(address > )error_flag = ;
p++;
if(strchr(p,','))error_flag = ;
if(!error_flag){
data = fpga_read(address);
usart6.printf("Read FPGA Ram:%d\r\n",data);
}
}else{
error_flag = ;
} if(error_flag){
LED_RED_ON;
LED_GREEN_OFF;
usart6.printf("Bad Command!\r\n");
}else{
LED_RED_OFF;
LED_GREEN_ON;
}
}
}
/* USER CODE END 3 */ }
module dual_port_ram_ctrl(
input clk_25m,
input rst_n,
input wrn,
input rdn,
input cs0,
inout [:]db,
input [:]ab,
output led_red,
output led_green,
output led_blue
); //-----------------------------ram-----------------------------//
wire [:]dataout_a;
wire [:]dataout_b; ram u1(
.data_a(data_a),
.address_a(address_a),
.wren_a(wren_a),
.rden_a(rden_a),
.clock_a(!clk_a),
.q_a(dataout_a), .data_b(db),
.address_b(ab),
.wren_b('d0),
.rden_b(!rd),
.clock_b(clk_b),
.q_b(dataout_b)
); //-----------------------------clk_100m-----------------------------// pll u2(
.inclk0(clk_25m),
.c0(clk_100m)
); //-------------------------------clk_a-----------------------------//
reg clk1,clk2;
always@(posedge clk_100m or negedge rst_n)
if(!rst_n)
begin
clk1 <= 'd0;
clk2 <= 'd0;
end
else
{clk2,clk1} <= {clk1,clk_25m}; wire clk_a = (clk_25m & clk1); //-------------------------------data-----------------------------//
reg [:]data;
always@(posedge clk_25m or negedge rst_n)
if(!rst_n)
data <= 'd0;
else if(data == 'd511)
data <= 'd0;
else
data <= data + 'd1; //-------------------------write & read port a-------------------//
reg wren_a;
reg rden_a;
reg [:]data_a;
reg [:]address_a; always@(posedge clk_a or negedge rst_n)
if(!rst_n)
begin
wren_a <= 'd0;
rden_a <= 'd0;
data_a <= 'd0;
address_a <= 'd0;
end
else if(data >= 'd0 && data <= 10'd255)
begin
wren_a <= 'd1;
rden_a <= 'd0;
data_a <= data;
address_a <= data;
end
else if(data >= 'd256 && data <= 10'd511)
begin
wren_a <= 'd0;
rden_a <= 'd1;
address_a <= data - 'd256;
end //-----------------------------ram a---------------------------//
reg error; always@(negedge clk1 or negedge rst_n)
if(!rst_n)
error <= 'd0;
else
begin
if(wren_a || dataout_a == address_a)
error <= 'd0;
else
error <= 'd1;
end //--------------------------ram_a_led---------------------------//
reg ledr,ledg,ledb;
always@(posedge error or negedge rst_n)
if(!rst_n)
begin
ledr <= 'd1;
ledg <= 'd0;
ledb <= 'd1;
end
else
begin
ledr <= 'd0;
ledg <= 'd1;
ledb <= 'd1;
end
assign {led_red,led_green,led_blue} = {ledr,ledg,ledb}; //--------------------------ram_b_rd----------------------------//
wire rd = (cs0 | rdn);
wire wr = (cs0 | wrn); reg wr_clk1,wr_clk2;
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}; wire clk_b = (!wr_clk2 | !rd);
assign db = !rd ? dataout_b : 'hzzzz; endmodule
源代码下载链接:
链接:http://pan.baidu.com/s/1qYqNlwg 密码:9il4
iCore4链接:

【iCore4 双核心板_FPGA】例程十六:基于双口RAM的ARM+FPGA数据存取实验的更多相关文章
- 【iCore4 双核心板_FPGA】例程十五:基于单口RAM的ARM+FPGA数据存取实验
实验现象: 写RAM命令格式:write:地址(0-255),数据(0-65535)\cr\lf 读RAM命令格式:read:地址(0-255)\cr\lf 核心代码: int main(void) ...
- 【iCore1S 双核心板_FPGA】例程十二:基于单口RAM的ARM+FPGA数据存取实验
实验现象: 核心代码: module single_port_ram( input CLK_12M, input WR, input RD, input CS0, inout [:]DB, input ...
- 【iCore3 双核心板_FPGA】实验十八:基于单口RAM的ARM+FPGA数据存取实验
实验指导书及代码包下载: http://pan.baidu.com/s/1i58Ssvz iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...
- 【iCore1S 双核心板_FPGA】例程十七:基于双口RAM的ARM+FPGA数据存取实验
实验现象: 核心代码: module DUAL_PORT_RAM( input CLK_12M, inout WR, input RD, input CS0, :]A, :]DB, output FP ...
- 【iCore3 双核心板_FPGA】实验十九:基于双口RAM的ARM+FPGA数据存取实验
实验指导书及代码包下载: http://pan.baidu.com/s/1pLReIc7 iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...
- 【iCore3 双核心板】例程十六:USB_HID实验——双向数据传输
实验指导书及代码包下载: http://pan.baidu.com/s/1bojcVoV iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...
- 【iCore4 双核心板_FPGA】例程十七:基于FIFO的ARM+FPGA数据存取实验
实验现象: 核心代码: int main(void) { /* USER CODE BEGIN 1 */ int i; int fsmc_read_data; ; ]; ]; char *p; /* ...
- 【iCore3 双核心板】例程十:RTC实时时钟实验——显示日期和时间
实验指导书及代码包下载: http://pan.baidu.com/s/1jHuZcnc iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...
- 【iCore3 双核心板】例程十二:通用定时器实验——定时点亮LED
实验指导书及代码包下载: http://pan.baidu.com/s/1kTWAAJ9 iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...
随机推荐
- MyBatis之ResultMap标签
ResultMap标签基本作用:建立SQL查询结果字段与实体属性的映射关系信息 在深入ResultMap标签前,我们需要了解从SQL查询结果集到JavaBean或POJO实体的过程. 1. 通过JDB ...
- pycharm-2018.1.6永久激活(本人使用的是centos7)
1. 从官网下载pycharm-2018.1.6, 下的是PyCharm Professional Edition版本的 (水平有限版本太高,激活不了) pycharm官网: https://www. ...
- 像素鸟 游戏开发教程 FlappyBird Game development tutorial
像素鸟 游戏开发教程 FlappyBird Game development tutorial 作者:韩梦飞沙 Author:han_meng_fei_sha 邮箱:313134555@qq.com ...
- php 抽象类 静态 单体设计模式
php oop----抽象类 抽象类机制使得子类可共用基类的某些信息,具体细节会留给子类,典型用在这样情形中,抽象类并不定义全部的方法,部分方法的实现推迟到子类继承抽象类时.它是介于接口和具体类间的一 ...
- java中线程安全的map是ConcurrentHashMap
原理:http://www.cnblogs.com/ITtangtang/p/3948786.html 与hashtable的区别: http://blog.csdn.net/songfeihu08 ...
- pycharm如何设置python版本、设置国内pip镜像、添加第三方类库
直接上图(mac环境): 一.设置项目的python版本 File->Default Settings ... 在弹出的界面上(参考下图),左上角的下拉框里,选择python解释器的版本即可(建 ...
- [java web]Idea+maven+spring4+hibernate5+struts2整合过程
摘要 最近也在网上找了些教程,试着使用maven进行包依赖关系的管理,也尝试着通过注解的方式来整合ssh框架.在这个过程中,踩了不少的坑.折腾很长时间,才算把架子折腾起来.这里把结果整理下,作为以后工 ...
- FXAA,FSAA与MSAA有什么区别?效果和性能上哪个好
而MSAA基本上只对画面中物体的边缘进行放大.混合的抗锯操作,因为边缘是锯齿最明显的地方(注意不是所有的边缘).提取边缘,主要是结合深度技术.MSAA是种硬件AA.我们一般说的4x.8x,就是放大倍数 ...
- [CGAL]带岛多边形三角化
CGAL带岛多边形三角化,并输出(*.ply)格式的模型 模型输出的关键是节点和索引 #include <CGAL/Triangulation_vertex_base_with_id_2.h&g ...
- js金额数字格式化实现代码(三位加逗号处理保留两位置小数)
工作中很常用的东西: 例1,使数字1111111变成11,111,111.00,保留两位小数. <html> <head> <script type="text ...