小兔子乖乖队:使用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相关推荐

  1. 西安电子科技大学计算机微原课设,西安电子科技大学我机电院微机原理课程设计.doc...

    西安电子科技大学我机电院微机原理课程设计 微机原理课程设计 学 院 机电工程学院 专 业 自动化 姓 名 ******* 学 号 ******** 指导教师 千博 董瑞军 一.微元课程设计 课程设计的 ...

  2. imut FPGA课设 基于FPGA的VGA弹球游戏设计 *秋昊

    写在前面的话: 本文主要呈现了一篇IMUT的FPGA课设报告. 课设报告内容(word版),视频演示,程序源码,专业创新实践简介,专业创新实践指导书均已放入下面的百度云链接中,也不大,总共不到20MB ...

  3. 基于FPGA的数字时钟的设计课设(HUAT)

    目录 前言 一.数字时钟课设目标 二.部分代码 1.clock.v代码的编写 2.完整代码 3.仿真代码 总结 前言 学校黄老师的FPGA的设计课设,最后的课设为数字时钟,实现分时的计数功能,带有整点 ...

  4. 北京工业大学计算机组成,GitHub - WuSiYu/mips-proj5: 5级流水线MIPS-lite微系统(北工大计组课设)...

    北工大-计算机组成原理课设 2020年7月,北京工业大学,大二下计算机组成原理,99/100分课设存档 5级流水线MIPS-lite微系统,转发式流水线,当且仅当load-use冒险或控制冒险时插入一 ...

  5. 课设舵机狗总结文——CubeMX+STM32F4+FreeRTOS+USART2+幻尔舵机控制板 实现动作组稳定运动

    课设舵机狗总结文系列文章目录 这里罗列了系列文章链接 总述 课设舵机狗总结文--总集篇 机械部分 课设舵机狗总结文--Solidworks舵机狗机械结构设计方案 F4控制部分 课设舵机狗总结文--Cu ...

  6. 计组课设:单周期31条MIPS指令CPU设计(含代码)

    多周期54条CPU:计组课设:多周期54条MIPS指令CPU设计(含代码)_孔艺菲的博客-CSDN博客 单周期CPU源码:while-TuRe/Single-cycle-CPU31 (github.c ...

  7. 基于低功耗蓝牙和微信小程序的门禁系统(FPGA课设设计)

    基于低功耗蓝牙和微信小程序的门禁系统(FPGA课设设计) 文章目录 基于低功耗蓝牙和微信小程序的门禁系统(FPGA课设设计) 一.低功耗蓝牙(BLE)的配置和与FPGA通信代码 1.1 低功耗蓝牙的介 ...

  8. 2022山东大学软件学院计算机组成与课程设计(计组课设)分享防踩坑

    目录 课程主要内容 课程时间: 学分: 小Tips: 经验分享: 关于地址写入的简单介绍 关于脉冲速度调节 关于清零端的问题 踩坑注意事项: 一些具体实验器件的介绍: 总图的介绍: 选择器: IR指令 ...

  9. 湖南大学基于SMTP和POP3的邮件系统——计算机网络课设

    基于SMTP和POP3的邮件系统,创新点较多,课设得分很高 这是2022年春季-软件工程19级计算机网络课程设计内容,下方的文档是本项目的需求文档. 本项目的所有代码(安卓端+Web端+服务端)已经完 ...

最新文章

  1. joc杂志影响因子2019_2019年放射学领域SCI主要杂志影响因子汇总
  2. Maven实战系列文章目录
  3. 服务器上flash不显示动画,win10电脑在线预览不能加载flash
  4. android thrift https,HTTPS 学习
  5. java 压缩 乱码_如何解决java压缩文件乱码问题
  6. 服务容错保护断路器Hystrix之七:做到自动降级
  7. Mac 终端提示:The default interactive shell is now zsh.
  8. Scrapy_CSS选择器
  9. 黄聪:一个拼图工具的制作思路
  10. FPGA远程更新之限制条件
  11. lamp rpm mysql_LAMP基于RPM包实现(httpd与php以module方式结合) 1
  12. python程序员专用壁纸_Python程序员必用的电脑桌面
  13. 芒果DB删除指定日期内数据
  14. Unity URP/SRP可编程渲染管线
  15. Sublime常用快捷键
  16. 微型计算机主板usb电源损坏,自已动手彻底解决主板USB供电不足的问题
  17. intel945显卡linux驱动,下载:Intel 945G/G965/G3X显卡新版驱动
  18. 智禾教育:现在入局电商行业算晚吗,行业前景将会如何发展
  19. Linux命令--lsof
  20. java jxl使用

热门文章

  1. 机器视觉(一):概述
  2. stm32毕设 STM32智能饮水机控制系统(源码+硬件+论文)
  3. android voip通话音频数据流传输过程解析
  4. AI: 机器学习的模型是如何训练的?(在试错中学习)
  5. QtDataVisualization Q3DBars绘制柱状图
  6. POI之PPT文本框生成及样式设置实例
  7. avr模拟串口通讯c语言,AVR系列之串口通讯
  8. RFID网络读卡器通讯协议
  9. 如何禁止指定应用程序联网
  10. Java 实现单例模式的七种写法