野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 13551|回复: 1

[altera] 分享一个在fpga上面跑的riscv的开源项目tingriscv

[复制链接]
发表于 2020-10-20 09:24:16 | 显示全部楼层 |阅读模式
本帖最后由 zhanzongyu 于 2020-10-20 09:26 编辑

tinyriscv框架.png
可见目前tinyriscv已经不仅仅是一个内核了,而是一个小型的SOC,包含一些简单的外设,如timer、uart_tx等。

tinyriscv SOC输入输出信号有两部分,一部分是系统时钟clk和复位信号rst,另一部分是JTAG调试信号,TCK、TMS、TDI和TDO。

上图中的小方框表示一个个模块,方框里面的文字表示模块的名字,箭头则表示模块与模块之间的的输入输出关系。

下面简单介绍每个模块的主要作用。

jtag_top:调试模块的顶层模块,主要有三大类型的信号,第一种是读写内存的信号,第二种是读写寄存器的信号,第三种是控制信号,比如复位MCU,暂停MCU等。

pc_reg:PC寄存器模块,用于产生PC寄存器的值,该值会被用作指令存储器的地址信号。

if_id:取指到译码之间的模块,用于将指令存储器输出的指令打一拍后送到译码模块。

id:译码模块,纯组合逻辑电路,根据if_id模块送进来的指令进行译码。当译码出具体的指令(比如add指令)后,产生是否写寄存器信号,读寄存器信号等。由于寄存器采用的是异步读方式,因此只要送出读寄存器信号后,会马上得到对应的寄存器数据,这个数据会和写寄存器信号一起送到id_ex模块。

id_ex:译码到执行之间的模块,用于将是否写寄存器的信号和寄存器数据打一拍后送到执行模块。

ex:执行模块,纯组合逻辑电路,根据具体的指令进行相应的操作,比如add指令就执行加法操作等。此外,如果是lw等访存指令的话,则会进行读内存操作,读内存也是采用异步读方式。最后将是否需要写寄存器、写寄存器地址,写寄存器数据信号送给regs模块,将是否需要写内存、写内存地址、写内存数据信号送给rib总线,由总线来分配访问的模块。

div:除法模块,采用试商法实现,因此至少需要32个时钟才能完成一次除法操作。

ctrl:控制模块,产生暂停流水线、跳转等控制信号。

clint:核心本地中断模块,对输入的中断请求信号进行总裁,产生最终的中断信号。

rom:程序存储器模块,用于存储程序(bin)文件。

ram:数据存储器模块,用于存储程序中的数据。

timer:定时器模块,用于计时和产生定时中断信号。目前支持RTOS时需要用到该定时器。

uart_tx:串口发送模块,主要用于调试打印。

gpio:简单的IO口模块,主要用于点灯调试。

spi:目前只有master角色,用于访问spi从机,比如spi norflash。

回复

使用道具 举报

发表于 2022-3-18 20:40:13 | 显示全部楼层
收藏,谢谢转载
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-3-29 22:04 , Processed in 0.053361 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表