【组原课设团队任务】FlyBird+FPGA+RISCV
小兔子乖乖队:使用FPGA设计与实现Flybird
B站地址https://www.bilibili.com/video/BV1Km4y1c78B/?vd_source=d3e5165825082cd17457aab2378b8f54
项目整体设计
经过个人任务的实现,本队拥有4个logisim实现的CPU以及1个FPGA实现的CPU,logisim工具中可展示的部分有限,而FPGA可以利用开发板上的各个接口实现更丰富的功能,可以更好地展示。本队经过讨论,选择做FlyBird,因为它不需要编写复杂的指令,对于课程设计中的支持24条指令的CPU友好,并且需要外部按键中断,能够充分展示CPU的功能。
nexys4ddr开发板支持VGA显示,板支持的RGB格式为RGB444,对于不同的显示分辨率以及屏幕刷新频率,需要采用不同的时钟频率。由于开发板上的存储空间有限,显示的图片需要占用比较大的空间,所以选择了显示分辨率为640x480,刷新频率为60hz,需要给VGA提供的时钟频率为25.17mhz。
由于flybird不需要很大的显示空间,按照图1,将屏幕分为5部分,其中中间的300x300区域为游戏区域,其余部分为静态展示。
图 1 显示设计图
制作背景图片以及bird的图片,并利用matlab将图片转换coe格式,利可以用vivado提供的IP核的功能,将coe文件存入到ROM中。
为了能够实现VGA的显示,需要将鸟的纵坐标,第一个柱子的坐标,第二个柱子的坐标存储下来,鸟的横向坐标固定,所以需要5个寄存器维护以上信息。由于当前的CPU不能直接维护以上5个寄存器,要在VGA显示和CPU之间加一个寄存器组,用来维护信息。VGA显示直接从寄存器组中并行的读取信息进行显示。而CPU则需要传送信息给寄存器组。如图2所示。
图 2 顶层结构设计图
由于CPU无法直接和寄存器组交互,将CPU中的ECALL指令功能进行改写,根据a7的值,将a7的值,将a7的值,将a0的值送到寄存器组的某个位置,串行地将数据维护。规定$a7寄存器的值为1,2,3,4,5时,分别将数据送往寄存器组中的对应的五个寄存器。
为了实现交互,还需要实现中断,需要两个按键中断,以及一个时钟中断,包括开始游戏按键,上升按键,以及时钟中断(控制鸟自动下降和柱子自动左移)。将个人任务中FPGA实现的CPU进行更改,添加中断uret指令,添加EPC、IE寄存器、中断向量表以及中断采样电路,为了简化电路,采用单级中断实现。
编写汇编代码,主要分为三个中断函数,并且在汇编中采用伪随机数的方式实现柱子的高度变化,为了简化汇编的编写,尽量直接使用寄存器进行运算,为了减少读写数据存储器的次数等进行保护现场、恢复现场的操作,将x1-x5寄存器和VGA与CPU交换数据的寄存器组中的5个寄存器对应,其余寄存器可以自由使用。
使用RARS将汇编代码转换成机器码,在vivado中读取,将以上部分连接起来,完成整个项目,上板检验成果。
队员分工
① 刘景宇
实现VGA显示模块,添加中断处理逻辑,实现CPU与VGA数据交换,协助刘从政编写汇编。
②刘从政
编写flybird包含中断的汇编代码。
③张传飞
寻找图片,制作要显示的图片,协助张锦程制作展示ppt。
④张锦程
将图片转换成coe格式,负责制作团队任务展示ppt。
3.任务实现与调试
①设计制作显示的背景图片,得到的图片如下:
图 3 背景图
②将转换成coe文件,利用matlab转换代码,将png图片转换成coe格式
背景图和小鸟图制作好后,先将背景图和小鸟图分别像素设置为640x480和25x25;再将.png文件修改文件名转化为.bmp文件,最后通过Matlab代码将.bmp文件转为rgb444彩色图像并制作coe文件。
307200由640x480计算得出,此为转化背景图;若要转化小鸟图,则修改为625即可。
③编写维护小鸟和柱子坐标的汇编代码
主函数初始化各个坐标,然后为一个死循环,直到遇到中断时跳转到相应的中断处理函数,在其他函数中使用uret指令完成中断返回。对于柱子的纵坐标设计随机数函数使得坐标在正确范围内伪随机,主程序的汇编代码如下,其余代码放在附件中,其中对ecall指令按照以上的规定使用。
addi x1,zero,0 # 初始化,不是中断:开始游戏addi x2,zero,150 # bird的纵坐标addi x3,zero,200 # 第一个柱子的横坐标addi x4,zero,110 # 第一个柱子显示的位置 addi x5,zero,380 # 第二个柱子不显示出来(两个柱子始终横向始终差180)addi x6,zero,140 addi a0,x2,0 # 系统调用,方便VGA显示,ecall根据a7的内容,将对应的数值送到对应的位置(系统调用)addi a7,zero,1 # bird的yecalladdi a0,x3,0 # 第一个柱子的xaddi a7,zero,2ecall addi a0,x4,0 # 第一个柱子的yaddi a7,zero,3ecalladdi a0,x5,0 # 第二个柱子的xaddi a7,zero,4ecall addi a0,x6,0 # 第二个柱子的yaddi a7,zero,5ecall
main: nop # 缓冲一下j main
④完成VGA显示和CPU更改的硬件设计。
新添加的单级中断处理部分的代码如下,其余部分代码放在附件中,其中要特别注意中断采样电路的实现,在调试中经常出现一个错误,在两个always中对同一个wire进行赋值会报错,尽管他们的触发条件不同(仍可能冲突),就必须进行更改。实现逻辑和个人任务中的logisim实现逻辑类似。
reg [31:0] pc_int1;
reg [31:0] pc_int2;
reg [31:0] pc_int3;
reg int1,int2,int3,intA,intB,intC; //保留当前的中断中断信号
reg [1:0]intnum; //当前中断处于处理的部分
wire [1:0]intsel; //产生的中断中最大的中断号
reg [31:0]epc ;reg int_en ; //中断使能信号wire int_sig; //表明有中断assign int_sig = int1 | int2 | int3; //表明当前是否有中断信号initial beginpc_int1 <= 32'h0000005c;pc_int2 <= 32'h00000078;pc_int3 <= 32'h00000084;epc <= 32'h0;int_en <= 1'b1;int1 <= 0;int2<=0;int3<=0; intA<=0;intB<=0;intC<=0;endalways@(posedge btn_start or posedge int1) begin if(int1)intA=0;else intA=1;end always@(posedge btn_up or posedge int2) begin if(int2)intB=0;else intB=1;endalways@(posedge clk_int or posedge int3) begin if(int3)intC=0;else intC=1;end assign intsel=(int1==1) ? 2'b11:((int2==1) ? 2'b10 :(int3==1 ? 2'b01:2'b00 ));always@(posedge clk)begin //中断模块,同时替代了PC寄存器int1=int1|intA; //主要起一个同步的作用int2=int2|intB; int3=int3|intC; if(uret) begin //uret指令,中断返回指令pc_new = epc;int_en = 1; //开中断case(intnum) //根据产生中断时的内容进行处理2'b11: int1<=0; //同步清零2'b10: int2<=0;2'b01: int3<=0;endcaseendelse if(int_sig & int_en)begin //有中断信号并且处于开中断 int_en = 0; //关中断epc = pc_normal;case(intsel) //根据当前的中断选择2'b11: begin intnum=2'b11; end //记录下是谁产生的中断2'b10: begin intnum=2'b10; end2'b01: begin intnum=2'b01; endendcasecase(intnum) //根据当前的中断选择,intnum中才是存放的当前是哪个中断2'b11: begin pc_new=pc_int1; end2'b10: begin pc_new=pc_int2; end2'b01: begin pc_new=pc_int3; endendcaseendelse pc_new=pc_normal;end always@(posedge clk)beginif(ecall)begincase(Rd_data1)32'd1:bird_y <= Rd_data2;32'd2:pillar1_x <= Rd_data2;32'd3:pillar1_y <= Rd_data2;32'd4:pillar2_x <= Rd_data2;32'd5:pillar2_y <= Rd_data2;endcaseendEnd
对于VGA显示模块,参考VGA实现原理,将显示模块和自己的功能适配,为了简化实现,将整个图片coe使用IP核ROM存储下来,同时为了避免显示时冲突,设置控制信号,确认当前显示像素点的坐标,从而确定当前显示鸟的rgb,柱子的rgb还是背景的rgb,按照以上逻辑编写代码,代码放于附件中。
将整个项目整合,文件结构如下图,其中top为整个项目,riscv_top为cpu部分,vga_display为vga显示部分,顶部视图如图4所示。
图 4 顶部视图
图 5 顶层文件
⑤效果图展示。
图 6 效果图展示
【组原课设团队任务】FlyBird+FPGA+RISCV相关推荐
- 西安电子科技大学计算机微原课设,西安电子科技大学我机电院微机原理课程设计.doc...
西安电子科技大学我机电院微机原理课程设计 微机原理课程设计 学 院 机电工程学院 专 业 自动化 姓 名 ******* 学 号 ******** 指导教师 千博 董瑞军 一.微元课程设计 课程设计的 ...
- imut FPGA课设 基于FPGA的VGA弹球游戏设计 *秋昊
写在前面的话: 本文主要呈现了一篇IMUT的FPGA课设报告. 课设报告内容(word版),视频演示,程序源码,专业创新实践简介,专业创新实践指导书均已放入下面的百度云链接中,也不大,总共不到20MB ...
- 基于FPGA的数字时钟的设计课设(HUAT)
目录 前言 一.数字时钟课设目标 二.部分代码 1.clock.v代码的编写 2.完整代码 3.仿真代码 总结 前言 学校黄老师的FPGA的设计课设,最后的课设为数字时钟,实现分时的计数功能,带有整点 ...
- 北京工业大学计算机组成,GitHub - WuSiYu/mips-proj5: 5级流水线MIPS-lite微系统(北工大计组课设)...
北工大-计算机组成原理课设 2020年7月,北京工业大学,大二下计算机组成原理,99/100分课设存档 5级流水线MIPS-lite微系统,转发式流水线,当且仅当load-use冒险或控制冒险时插入一 ...
- 课设舵机狗总结文——CubeMX+STM32F4+FreeRTOS+USART2+幻尔舵机控制板 实现动作组稳定运动
课设舵机狗总结文系列文章目录 这里罗列了系列文章链接 总述 课设舵机狗总结文--总集篇 机械部分 课设舵机狗总结文--Solidworks舵机狗机械结构设计方案 F4控制部分 课设舵机狗总结文--Cu ...
- 计组课设:单周期31条MIPS指令CPU设计(含代码)
多周期54条CPU:计组课设:多周期54条MIPS指令CPU设计(含代码)_孔艺菲的博客-CSDN博客 单周期CPU源码:while-TuRe/Single-cycle-CPU31 (github.c ...
- 基于低功耗蓝牙和微信小程序的门禁系统(FPGA课设设计)
基于低功耗蓝牙和微信小程序的门禁系统(FPGA课设设计) 文章目录 基于低功耗蓝牙和微信小程序的门禁系统(FPGA课设设计) 一.低功耗蓝牙(BLE)的配置和与FPGA通信代码 1.1 低功耗蓝牙的介 ...
- 2022山东大学软件学院计算机组成与课程设计(计组课设)分享防踩坑
目录 课程主要内容 课程时间: 学分: 小Tips: 经验分享: 关于地址写入的简单介绍 关于脉冲速度调节 关于清零端的问题 踩坑注意事项: 一些具体实验器件的介绍: 总图的介绍: 选择器: IR指令 ...
- 湖南大学基于SMTP和POP3的邮件系统——计算机网络课设
基于SMTP和POP3的邮件系统,创新点较多,课设得分很高 这是2022年春季-软件工程19级计算机网络课程设计内容,下方的文档是本项目的需求文档. 本项目的所有代码(安卓端+Web端+服务端)已经完 ...
最新文章
- joc杂志影响因子2019_2019年放射学领域SCI主要杂志影响因子汇总
- Maven实战系列文章目录
- 服务器上flash不显示动画,win10电脑在线预览不能加载flash
- android thrift https,HTTPS 学习
- java 压缩 乱码_如何解决java压缩文件乱码问题
- 服务容错保护断路器Hystrix之七:做到自动降级
- Mac 终端提示:The default interactive shell is now zsh.
- Scrapy_CSS选择器
- 黄聪:一个拼图工具的制作思路
- FPGA远程更新之限制条件
- lamp rpm mysql_LAMP基于RPM包实现(httpd与php以module方式结合) 1
- python程序员专用壁纸_Python程序员必用的电脑桌面
- 芒果DB删除指定日期内数据
- Unity URP/SRP可编程渲染管线
- Sublime常用快捷键
- 微型计算机主板usb电源损坏,自已动手彻底解决主板USB供电不足的问题
- intel945显卡linux驱动,下载:Intel 945G/G965/G3X显卡新版驱动
- 智禾教育:现在入局电商行业算晚吗,行业前景将会如何发展
- Linux命令--lsof
- java jxl使用