【iCore4 双核心板_FPGA】例程十六:基于双口RAM的ARM+FPGA数据存取实验
实验现象:
核心代码:
int main(void) {/* USER CODE BEGIN 1 */int i;int address,data;char error_flag = 0;char receive_data[50];char buffer[8];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(115200);usart6.printf("Hello, I am iCore4!\r\n");LED_GREEN_ON;/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */if(usart6.receive_ok_flag == 1){usart6.receive_ok_flag = 0;memset(receive_data,0,sizeof(receive_data));memset(buffer,0,sizeof(buffer));for(i = 0;i < 30;i ++){receive_data[i] = usart6.receive_buffer[i];}p = receive_data;i = 0;while(*p != ':'){ //»ñÈ¡²Ù×÷ÃüÁwrite or read£©buffer[i++] = *p++;if(i > sizeof(buffer))i = 0;}for(i = 0;i < sizeof(buffer);i++){//½«ÃüÁîת»¯ÎªÐ¡Ð´×Ö·ûbuffer[i] = tolower(buffer[i]);}if(memcmp(buffer,"read",strlen("read")) == 0){//Ö´ÐжÁ²Ù×÷error_flag = 0;p++;address = atoi(p);if(address > 255)error_flag = 1;p++;if(strchr(p,','))error_flag = 1;if(!error_flag){data = fpga_read(address);usart6.printf("Read FPGA Ram:%d\r\n",data);} }else{error_flag = 1;}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 [15:0]db,input [23:16]ab,output led_red,output led_green,output led_blue );//-----------------------------ram-----------------------------// wire [15:0]dataout_a; wire [15:0]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(1'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)beginclk1 <= 1'd0;clk2 <= 1'd0;endelse {clk2,clk1} <= {clk1,clk_25m};wire clk_a = (clk_25m & clk1);//-------------------------------data-----------------------------// reg [9:0]data; always@(posedge clk_25m or negedge rst_n)if(!rst_n)data <= 10'd0;else if(data == 10'd511)data <= 10'd0;else data <= data + 1'd1;//-------------------------write & read port a-------------------// reg wren_a; reg rden_a; reg [9:0]data_a; reg [9:0]address_a;always@(posedge clk_a or negedge rst_n)if(!rst_n)beginwren_a <= 1'd0;rden_a <= 1'd0;data_a <= 10'd0;address_a <= 10'd0;endelse if(data >= 10'd0 && data <= 10'd255)beginwren_a <= 1'd1;rden_a <= 1'd0;data_a <= data;address_a <= data;endelse if(data >= 10'd256 && data <= 10'd511)beginwren_a <= 1'd0;rden_a <= 1'd1;address_a <= data - 10'd256;end//-----------------------------ram a---------------------------// reg error;always@(negedge clk1 or negedge rst_n)if(!rst_n)error <= 1'd0;elsebeginif(wren_a || dataout_a == address_a)error <= 1'd0;elseerror <= 1'd1;end//--------------------------ram_a_led---------------------------// reg ledr,ledg,ledb; always@(posedge error or negedge rst_n)if(!rst_n)beginledr <= 1'd1;ledg <= 1'd0;ledb <= 1'd1; endelsebeginledr <= 1'd0;ledg <= 1'd1;ledb <= 1'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)beginwr_clk1 <= 1'd1;wr_clk2 <= 1'd1;endelse {wr_clk2,wr_clk1} <= {wr_clk1,wr};wire clk_b = (!wr_clk2 | !rd); assign db = !rd ? dataout_b : 16'hzzzz;endmodule
源代码下载链接:
链接:http://pan.baidu.com/s/1qYqNlwg 密码:9il4
iCore4链接:
【iCore4 双核心板_FPGA】例程十六:基于双口RAM的ARM+FPGA数据存取实验相关推荐
- 【iCore1S 双核心板_FPGA】例程十二:基于单口RAM的ARM+FPGA数据存取实验
实验现象: 核心代码: module single_port_ram(input CLK_12M,input WR,input RD,input CS0,inout [15:0]DB,input [2 ...
- 【iCore4 双核心板_FPGA】例程十一:FSMC总线通信实验——独立地址模式
实验原理: STM32F767上自带FMC控制器,本实验将通过FMC总线的地址独立模式实现STM32与FPGA 之间通信,FPGA内部建立RAM块,FPGA桥接STM32和RAM块,本实验通过FSMC ...
- 【iCore1S 双核心板_FPGA】例程十六:基于SPI的ARM与FPGA通信实验
实验现象: 核心代码: int main(void) {int i,n;char buffer[20];char spi_buffer[20];HAL_Init();system_clock.init ...
- 【iCore4 双核心板_FPGA】例程八:乘法器实验——乘法器使用
实验现象: 程序运行时,绿色led闪烁(目前,具体的乘法器调用请参考iCore3乘法器例程) 核心代码: module multiplier_ctrl(input clk_25m,input rst_ ...
- 【iCore4 双核心板_FPGA】例程七:状态机实验——状态机使用
实验现象: 按键每按下一次,三色LED改变一次状态. 核心代码: //--------------------module_rst_n---------------------------// mod ...
- 【iCore4 双核心板_FPGA】例程五:基础逻辑门实验——逻辑门使用
实验现象: 打开tool-->Netlist viewer-->RTL viewer可观察各个逻辑连接 核心代码: //--------------------module_logic_g ...
- 【iCore1S 双核心板_FPGA】例程十:乘法器实验——乘法器的使用
实验现象: 通过FPGA 的一个I/O 口连接LED:设定I/O 为输出模式.内部乘法器完成乘法计算后 改变输出LED 的状态(红色LED 闪烁). 核心代码: module MULT(input C ...
- 【iCore1S 双核心板_FPGA】例程十五:基于I2C的ARM与FPGA通信实验
实验现象: 核心代码: int main(void) {int i,n;char buffer[20];char i2c_buffer[20];HAL_Init();system_clock.init ...
- 【iCore3 双核心板_FPGA】例程十二:Modelsim仿真实验
实验指导书及代码包下载: 链接:http://pan.baidu.com/s/1hs4zNFY 密码:5z62 iCore3 购买链接: https://item.taobao.com/item.ht ...
最新文章
- python中newfile是干嘛用的_python 文件操作方法
- SQL基础(四):SQL命令
- Django框架(19.Django中获取url的参数(位置参数以及关键字参数))
- hmailserver mysql密码_第二步:点晴MIS系统Email模块hMailServer数据库连接配置指引
- python unittest生成html报告_python unittest--HTMLTestRunner生成报告
- linux mysql 静态库_Linux静态库与动态库实例详解
- 信息学奥赛一本通——1000:入门测试题目
- wc命令统计文件数据数量信息
- PS基础学习 2---图层蒙版
- 化工计算机软件基础考试题,2013年化工工程师基础知识网友版真题(下午卷)...
- node mysql 搭建博客_node.js+Hexo+Git搭建个人博客
- 表格数据的识别与提取
- 管理感悟:看清软件功能的“二八定律”
- Java三种方法实现字符串排序
- Mbed记录 STM32F207ZG板子引脚图
- 在哪儿比较好下载建筑学西方近现代的外文文献?
- hiar sdk for android,HiAR | HiAR SDK for Unity | 涂涂乐开发教程
- php qq登陆网站实例代码,QQ登陆网站实例代码
- 华东师大在职计算机分数线,报考华东师范大学在职研究生分数线是多少呢?
- Poly-Yolo复现
热门文章
- 阿里最新php面试题及答案,面经网-阿里php面试题(四)
- java+set+split_阿里资深工程师教你如何优化 Java 代码!
- c语言smile定义函数,【C初始之习题五】
- 浏览器里面看到的表单数据映射到python_python爬虫入门01:教你在 Chrome 浏览器轻松抓包...
- int signed in mysql_【转】mysql 中int类型字段unsigned和signed的区别
- python解放二次开发_[转载]Python二次开发程序详解
- 计算机寄存器端口,CPU和外设之间的数据传送方式有哪几种
- 大学计算机基础总结,大学计算机基础第二章总结
- Vim 重复操作的宏录制
- 导入数据中文乱码_基于Navicat和Kettle的数据迁移完全解读(多图)