这里会显示出您选择的修订版和当前版本之间的差别。
后一修订版 | 前一修订版 上一修订版 两侧同时换到之后的修订记录 | ||
icore4tx_fpga_21 [2020/07/01 10:14] zgf 创建 |
icore4tx_fpga_21 [2020/07/01 11:23] zgf |
||
---|---|---|---|
行 1: | 行 1: | ||
+ | | **银杏科技有限公司旗下技术文档发布平台** |||| | ||
+ | |技术支持电话|**0379-69926675-801**||| | ||
+ | |技术支持邮件|Gingko@vip.163.com||| | ||
+ | |技术论坛|http://www.eeschool.org||| | ||
+ | ^ 版本 ^ 日期 ^ 作者 ^ 修改内容 ^ | ||
+ | | V1.0 | 2020-07-01 | gingko | 初次建立 | | ||
+ | \\ | ||
+ | \\ | ||
+ | |||
==== 实验二十一:双口RAM实验——基于双口RAM的ARM与FPGA通信 ==== | ==== 实验二十一:双口RAM实验——基于双口RAM的ARM与FPGA通信 ==== | ||
行 7: | 行 16: | ||
==== 二、 实验设备及平台 ==== | ==== 二、 实验设备及平台 ==== | ||
- | - iCore4TX 双核心板。 | + | - iCore4TX 双核心板[[https://item.taobao.com/item.htm?spm=a1z10.1-c-s.w4004-22598974120.3.29da532fLkazHH&id=614919247574|点击购买]]。 |
- USB-CABLE(或相同功能)仿真器。 | - USB-CABLE(或相同功能)仿真器。 | ||
- JLINK(或相同功能)仿真器。 | - JLINK(或相同功能)仿真器。 | ||
行 19: | 行 28: | ||
* 双口RAM分为伪双口RAM和真双口RAM两种,伪双口RAM一个端口只读,另一个端口只写;而真双口RAM两个端口都能读写。在SPI通信实验中,使用的就是伪双口RAM,因此,在本实验中只讲真双口RAM。从整体上讲,真双口RAM和伪双口RAM都能同时进行读写操作;虽然有两个端口,两套数据线和地址线,但是存储数据的空间单元是共享的,因此存储后的数据也是共享的。其基本工作时序和普通RAM一致,都是以时钟上升沿作为触发事件,在上升沿到来前保证地址和数据稳定即可将数据准确的写入对应的地址单元中,读取时,也是如此。其读写时序如图21-1所示。 | * 双口RAM分为伪双口RAM和真双口RAM两种,伪双口RAM一个端口只读,另一个端口只写;而真双口RAM两个端口都能读写。在SPI通信实验中,使用的就是伪双口RAM,因此,在本实验中只讲真双口RAM。从整体上讲,真双口RAM和伪双口RAM都能同时进行读写操作;虽然有两个端口,两套数据线和地址线,但是存储数据的空间单元是共享的,因此存储后的数据也是共享的。其基本工作时序和普通RAM一致,都是以时钟上升沿作为触发事件,在上升沿到来前保证地址和数据稳定即可将数据准确的写入对应的地址单元中,读取时,也是如此。其读写时序如图21-1所示。 | ||
- | 21-1(a) 读时序图 | + | * 21-1(a) 读时序图 |
{{ :icore4tx:icore4tx_fpga_21_1_a.png?direct |21-1(a) 读时序图}} | {{ :icore4tx:icore4tx_fpga_21_1_a.png?direct |21-1(a) 读时序图}} | ||
- | 21-1(b) 写时序图 | + | * 21-1(b) 写时序图 |
{{ :icore4tx:icore4tx_fpga_21_1_b.png?direct |21-1(b) 写时序图}} | {{ :icore4tx:icore4tx_fpga_21_1_b.png?direct |21-1(b) 写时序图}} | ||
行 77: | 行 86: | ||
</code> | </code> | ||
- | 例化之后,FPGA要完成对ARM传输指令的解析,这部分代码是通过case语句实现的。根据接收的指令,case语句会跳转到不同的处理状态,完成对应指令状态需要的操作,具体代码参考如下: | + | * 例化之后,FPGA要完成对ARM传输指令的解析,这部分代码是通过case语句实现的。根据接收的指令,case语句会跳转到不同的处理状态,完成对应指令状态需要的操作,具体代码参考如下: |
<code verilog> | <code verilog> | ||
case(rx_state) | case(rx_state) | ||
行 140: | 行 149: | ||
else | else | ||
begin | begin | ||
- | wr_cnt <= wr_cnt + 1'd1; | + | wr_cnt <= wr_cnt + 1'd1; |
- | end | + | end |
+ | end | ||
+ | default:begin | ||
+ | end | ||
+ | endcase | ||
+ | end | ||
+ | rx_rd_ledgth_state:begin//获取读数据长度信息,高字节在前,低字节在后 | ||
+ | case(rx_cnt) | ||
+ | 8'd0:begin | ||
+ | rd_length_r[15:8] <= receive_byte; | ||
+ | rx_cnt <= rx_cnt + 1'd1; | ||
+ | end | ||
+ | 8'd1:begin | ||
+ | rd_length_r <= {rd_length_r[15:8],receive_byte}; | ||
+ | end | ||
+ | default:begin | ||
+ | end | ||
+ | endcase | ||
+ | end | ||
+ | rx_rd_add_state:begin//获取读数据地址信息,并产生读地址信息,高字节在前 | ||
+ | case(rx_cnt) | ||
+ | 8'd0:begin | ||
+ | rd_address_r[15:8] <= receive_byte; | ||
+ | rx_cnt <= rx_cnt + 1'd1; | ||
+ | end | ||
+ | 8'd1:begin | ||
+ | rd_address_r <= {rd_address_r[15:8],receive_byte}; | ||
+ | rx_cnt <= rx_cnt + 1'd1; | ||
+ | rd_en_r <= 1'd1; | ||
+ | end | ||
+ | 8'd2:begin | ||
+ | rd_address_r <= rd_address_r + 1'd1; | ||
+ | if(rd_cnt==rd_length_r-1'd1) | ||
+ | begin | ||
+ | rd_cnt <= 12'h00; | ||
+ | rx_cnt <= rx_cnt + 1'd1; | ||
+ | else | ||
+ | begin | ||
+ | rd_cnt <= rd_cnt + 1'd1; | ||
+ | end | ||
+ | end | ||
+ | default:; | ||
+ | endcase | ||
+ | end | ||
+ | endcase | ||
</code> | </code> |