【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 ...
随机推荐
- where field in
SELECT * FROM xx WHERE field IN ('11','22','33');
- PushBackInputStream回退流
[例子1] import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.PushbackInputS ...
- 使用OPCNetAPI连接OPCServer
OPCServer KepServer; OPCGroup KepGroup; bool opc_connected; string remoteServerName = "KEPware. ...
- 洛谷.4008.[NOI2003]editor文本编辑器(块状链表)
题目链接 st(n)表示sqrt(n) 为使块状链表不会退化,通常将每块的大小S维持在[st(n)/2,2st(n)]中,这样块数C也一定[st(n)/2,2st(n)]中 在此使用另一种方法(方便) ...
- [Beijing wc2012]算不出的算式
OJ题号:BZOJ2659 思路:数学. 建立平面直角坐标系.在第一象限作直线y=qx/p,易得Σ[kq/p]即为当x<(p/2)时,直线下方(包括直线)的整点数:Σ[kp/q]为当y<( ...
- mongoDB进行分组操作
一.$group 进行分组 1.每个职位的雇员人数: db.getCollection('emp').aggregate( [ {'$group':{ ‘_id’:'$job', job_count: ...
- Cocos Creator的小点
声明的时候,变量如此:但用的时候就变成了border,找了很久的问题,一直没找到啊,后来就发现命名的时候和内置的一定不要太相似否则后悔的只能是自己: cc.Class({ extends: cc.Co ...
- ITxlab倡议启动“互联网X大脑”计划
导语:"互联网X大脑"计划由ITxlab(互联网X实验室)联合科学院相关机构.基于7年以来取得的研究成果,倡议建立的互联网与脑科学前沿研究平台,吸引不同领域专家进行科学研究和成果交 ...
- 【BZOJ3036】绿豆蛙的归宿 概率DP
链接: #include <stdio.h> int main() { puts("转载请注明出处[辗转山河弋流歌 by 空灰冰魂]谢谢"); puts("网 ...
- 原创:vsphere概念深入系列三:vSphere命令行管理
假设无法近距离接触物理主机,只能远程命令行管理,. 以下命令行可以起到点作用. 首先需要安装vSphere CLI工具. 启动后界面: 1.查看datastore内容 所有命令行工具都可以加上-ser ...