FPGA-10:设计个简单的cpu(真的简单!)
经过了之前的学习
想必各位对verilog应该有了基本的基础
那么,接下来,我们就来造cpu吧!
我们将写一个简单的单周期cpu
- 该cpu有一下特点:
- 32位架构
- 单周期执行
- 简洁实用
- 32位定长指令
- 有手就行
我称之为 “ant” 内核
就跟蚂蚁一样,“功能弱小”,但也什么能干
我也特地为该cpu编写了个汇编器
包括使用python编写的bin转txt工具
连接如下:
click me
下载该项目
即可得到5个文件
cpu.v: ant内核核心文件test.v : ant内核仿真文件ant-asm.exe: ant汇编器binTotxt.py:将bin文件转换成verilog可读取的储存器填充文件demo.ant:ant汇编例程
下面是寄存器说明及指令集:
寄存器:
r0~r8 共16个32位寄存器,均可可读可写,
r0~r14 通用寄存器
r15 pc寄存器指令集:(总共14条)
wh r0,num 写r0寄存器的高16位 {8{指令},4{寄存器id},16{常数},4{无意义}}
wl r0,num 写r0寄存器的低16位 {8{指令},4{寄存器id},16{常数},4{无意义}}add r0,r1,r2 : r0 = r1 + r2 //整数加法 {8{指令},4{r0寄存器id},4{r1寄存器id},4{r2寄存器id},12{无意义}}
sub r0,r1,r2 : r0 = r1 - r2 //整数减法 {8{指令},4{r0寄存器id},4{r1寄存器id},4{r2寄存器id},12{无意义}}
or r0,r1,r2 : r0 = r1 | r2 {8{指令},4{r0寄存器id},4{r1寄存器id},4{r2寄存器id},12{无意义}}
and r0,r1,r2 : r0 = r1 & r2 {8{指令},4{r0寄存器id},4{r1寄存器id},4{r2寄存器id},12{无意义}}
not r0,r1 : r0 = ~r1 {8{指令},4{r0寄存器id},4{r1寄存器id},16{无意义}}
sl r0,r1,r2 r0 = r1 << r2 {8{指令},4{r0寄存器id},4{r1寄存器id},4{r2寄存器id},12{无意义}}
sr r0,r1,r2 : r0 = r1 >> r2 {8{指令},4{r0寄存器id},4{r1寄存器id},4{r2寄存器id},12{无意义}}
mt r0,r1,r2 : r0 = r1 > r2 //比大小 返回0或1 {8{指令},4{r0寄存器id},4{r1寄存器id},16{无意义}}
lt r0,r1,r2 : r0 = r1 < r2//同上 {8{指令},4{r0寄存器id},4{r1寄存器id},16{无意义}}rd r0,r1 : r1 = *r0//读内存 {8{指令},4{r0寄存器id},4{r1寄存器id},16{无意义}}
wd r0,r1 : *r0 = r1//写内存 {8{指令},4{r0寄存器id},4{r1寄存器id},16{无意义}}if r0 :如果r0为非0,则跳过下一条指令
虽然指令只有短短14条,但也几乎能够完成所有事了
接下来我们来写个简单的1+2+3+…+100的程序
c代码如下:
int main() {int all = 0;int i = 1;int j = 101;int k = 0;l1:k = i < j;if (!k)goto l2;elseall = all + i;i = i + 1;goto l1;
l2:printf("%d", all);
}
c代码对应的汇编代码
汇编代码如下:
//0起始地址
wl r0,0 //恒为0
wh r0,0
wl r1,1 //恒为1
wh r1,0
//累加
wl r2,0
wh r2,0
//i
wl r3,1
wh r3,0
//101
wl r4,101
wh r4,0
//k
wl r5,0
wh r5,0
//地址16
wl r6,16
wh r6,0
//地址22
wl r7,22
wh r7,0
//地址16:
lt r5,r3,r4
if r5//如果r3小于r4
add r15,r7,r0
add r2, r2, r3
add r3,r3,r1
add r15,r6,r0
//地址22:
wd r0,r2
将该汇编代码保存进"demo.ant"文件中
输入命令:
ant-asm demo.ant
即可得到
out.bin可执行文件
再执行binTotxt.py脚本(注意更改里面的路径)
得到out.list填充文件
仿真test.v文件,将out.list内容填充进rom
运行
仿真效果如下:
可以看到,正确的算出了5050这个值
说明代码和ant内核是没有什么问题的
FPGA-10:设计个简单的cpu(真的简单!)相关推荐
- 【简单】191. 位1的个数(汉明重量)常规+位运算解法(所谓简单可它真的简单吗?)
[题目] 编写一个函数,输入是一个无符号整数,返回其二进制表达式中数字位数为 '1' 的个数(也被称为汉明重量). 来源:leetcode 链接:https://leetcode-cn.com/pro ...
- FPGA逻辑设计回顾(10)DDR/DDR2/DDR3中的时序参数的含义
前言 本文首发自:FPGA逻辑设计回顾(10)DDR/DDR2/DDR3中的时序参数的含义 上篇文章:FPGA逻辑设计回顾(9)DDR的前世今生以及演变过程中的技术差异有提到,制造商会以一系列由破折号 ...
- 计算机组成原理课程设计——CPU与简单模型机设计
一.设计目的 1.掌握一个简单CPU的组成原理. 2.在掌握部件单元电路的基础上,进一步将其构造一台基本模型计算机. 3.掌握微程序控制器设计. 二.设计任务与要求 设计任务: 用所学知识,设计并构造 ...
- FPGA的设计艺术(10)HDL是软件还是硬件?
前言 大家都知道HDL是逻辑设计的语言,FPGA开发是一种硬件开发的行为,但由于我们平时也使用某种类似软件的方式管理项目,并且类似软件的行为来编码,大多数人还是会误会?你是不是在搞软件? 对于这种问题 ...
- 英特尔Intel® Arria® 10 FPGA加速器设计
英特尔Intel® Arria® 10 FPGA加速器设计 Introducing the Intel® Vision Accelerator Design with Intel® Arria® 10 ...
- 计算机组成原理简单模型机实验,CPU 与简单模型机设计实验
计算机科学与技术系 实 验 报 告 专业名称 计算机科学与技术 课程名称 计算机组成原理 项目名称 CPU 与简单模型机设计实验 班 级 学 号 姓 名 同组人员 无 实验日期 2016.6 一.实验 ...
- 【计算机组成原理】四、CPU与简单模型机设计实验
文章目录 一.实验目的 二.实验原理 三.实验步骤 四.实验结论 一.实验目的 1.掌握一个简单CPU的组成原理 2.在掌握部件单元电路的基础上,进一步将其构造一台基本模型计算机 3.为其定义五条机器 ...
- FPGA逻辑设计回顾(9)DDR的前世今生以及演变过程中的技术差异
文章目录 前言 DDR的前世SDRAM DDR的今生以及演变版本:DDR/DDR2/DDR3 DDR/DDR2/DDR3/DDR4之间简单对比 速度对比 电压对比 延迟对比 预取差异 电阻端接对比 物 ...
- FPGA逻辑设计回顾(3)多比特信号上升沿检测的设计方式与陷阱?
前言 注:本文首发自FPGA逻辑设计回顾(3)多比特信号上升沿检测的设计方式与陷阱? 在总结本文最后的多比特上升沿检测之前,我们先把备用知识讲清楚,摊开来,以免造成模糊不清的默许! 逻辑运算符与位元运 ...
最新文章
- html保存助手,HTML助手与HTML助手内
- 【Python应用】Python+Kepler.gl轻松制作酷炫路径动画
- 03_ClickHouse数据格式,TabSeparated、TSKV、CSV格式、JSON格式、Parquet、ORC、其它数据格式(Native,Pretty,Values,Vertical等)
- 198. House Robber
- 82.开始→运行→输入的命令集锦
- date js 半年_JavaScript Date对象
- php 5.3.9 漏洞,PHP-5.3.9远程执行任意代码漏洞(CVE-2012-0830) 详解
- 技术人员,该如何向业务和产品“砍需求”?
- java基础—线程间的通讯 生产者与消费者
- debug模式不报错,release模式报错
- 【Qt开发】StyleSheet使用总结
- 会议室预约微信小程序推荐_又是BYPASS!微信小程序预约 YEEZY BOOST 350 V2 只要3S就能搞定!...
- svn linux clean up,SVN清理失败 (svn cleanup) 的解决方法
- 虚拟机VMware镜像下载及安装Linux系统
- ie显示的html页面乱码,IE10、IE11页面中文乱码解决方案
- 【硬见小百科】数字万用表的工作原理
- Eucalyptus
- 微信扫码下载APP解决方案
- 小园丁与老司机_疲倦的园丁
- watchOS7.2新增“心适能功能” 监测和分类心肺适能水平
热门文章
- python中文分句_中文文本分句
- 现在,您可以在YouTube上播放免费的,广告支持的电影
- 手机加密聊天软件功能文档(基于android系统)
- 问卷星禁止粘贴解决方案
- 什么是抖音小程序 小程序该怎么做
- 计算机专业一句话介绍自己,来聊聊,你会如何用一句话介绍自己的专业?
- 手机远程连接linux软件下载,远程连接linux服务器软件下载
- Kettle计算器常用函数
- 影响红外测温的主要因素分析
- 查询读者的借阅信息mysql_MySQL数据库命令行【篇章九】之数据库综合查询(SELECT)...