经过了之前的学习

想必各位对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(真的简单!)相关推荐

  1. 【简单】191. 位1的个数(汉明重量)常规+位运算解法(所谓简单可它真的简单吗?)

    [题目] 编写一个函数,输入是一个无符号整数,返回其二进制表达式中数字位数为 '1' 的个数(也被称为汉明重量). 来源:leetcode 链接:https://leetcode-cn.com/pro ...

  2. FPGA逻辑设计回顾(10)DDR/DDR2/DDR3中的时序参数的含义

    前言 本文首发自:FPGA逻辑设计回顾(10)DDR/DDR2/DDR3中的时序参数的含义 上篇文章:FPGA逻辑设计回顾(9)DDR的前世今生以及演变过程中的技术差异有提到,制造商会以一系列由破折号 ...

  3. 计算机组成原理课程设计——CPU与简单模型机设计

    一.设计目的 1.掌握一个简单CPU的组成原理. 2.在掌握部件单元电路的基础上,进一步将其构造一台基本模型计算机. 3.掌握微程序控制器设计. 二.设计任务与要求 设计任务: 用所学知识,设计并构造 ...

  4. FPGA的设计艺术(10)HDL是软件还是硬件?

    前言 大家都知道HDL是逻辑设计的语言,FPGA开发是一种硬件开发的行为,但由于我们平时也使用某种类似软件的方式管理项目,并且类似软件的行为来编码,大多数人还是会误会?你是不是在搞软件? 对于这种问题 ...

  5. 英特尔Intel® Arria® 10 FPGA加速器设计

    英特尔Intel® Arria® 10 FPGA加速器设计 Introducing the Intel® Vision Accelerator Design with Intel® Arria® 10 ...

  6. 计算机组成原理简单模型机实验,CPU 与简单模型机设计实验

    计算机科学与技术系 实 验 报 告 专业名称 计算机科学与技术 课程名称 计算机组成原理 项目名称 CPU 与简单模型机设计实验 班 级 学 号 姓 名 同组人员 无 实验日期 2016.6 一.实验 ...

  7. 【计算机组成原理】四、CPU与简单模型机设计实验

    文章目录 一.实验目的 二.实验原理 三.实验步骤 四.实验结论 一.实验目的 1.掌握一个简单CPU的组成原理 2.在掌握部件单元电路的基础上,进一步将其构造一台基本模型计算机 3.为其定义五条机器 ...

  8. FPGA逻辑设计回顾(9)DDR的前世今生以及演变过程中的技术差异

    文章目录 前言 DDR的前世SDRAM DDR的今生以及演变版本:DDR/DDR2/DDR3 DDR/DDR2/DDR3/DDR4之间简单对比 速度对比 电压对比 延迟对比 预取差异 电阻端接对比 物 ...

  9. FPGA逻辑设计回顾(3)多比特信号上升沿检测的设计方式与陷阱?

    前言 注:本文首发自FPGA逻辑设计回顾(3)多比特信号上升沿检测的设计方式与陷阱? 在总结本文最后的多比特上升沿检测之前,我们先把备用知识讲清楚,摊开来,以免造成模糊不清的默许! 逻辑运算符与位元运 ...

最新文章

  1. html保存助手,HTML助手与HTML助手内
  2. 【Python应用】Python+Kepler.gl轻松制作酷炫路径动画
  3. 03_ClickHouse数据格式,TabSeparated、TSKV、CSV格式、JSON格式、Parquet、ORC、其它数据格式(Native,Pretty,Values,Vertical等)
  4. 198. House Robber
  5. 82.开始→运行→输入的命令集锦
  6. date js 半年_JavaScript Date对象
  7. php 5.3.9 漏洞,PHP-5.3.9远程执行任意代码漏洞(CVE-2012-0830) 详解
  8. 技术人员,该如何向业务和产品“砍需求”?
  9. java基础—线程间的通讯 生产者与消费者
  10. debug模式不报错,release模式报错
  11. 【Qt开发】StyleSheet使用总结
  12. 会议室预约微信小程序推荐_又是BYPASS!微信小程序预约 YEEZY BOOST 350 V2 只要3S就能搞定!...
  13. svn linux clean up,SVN清理失败 (svn cleanup) 的解决方法
  14. 虚拟机VMware镜像下载及安装Linux系统
  15. ie显示的html页面乱码,IE10、IE11页面中文乱码解决方案
  16. 【硬见小百科】数字万用表的工作原理
  17. Eucalyptus
  18. 微信扫码下载APP解决方案
  19. 小园丁与老司机_疲倦的园丁
  20. watchOS7.2新增“心适能功能” 监测和分类心肺适能水平

热门文章

  1. python中文分句_中文文本分句
  2. 现在,您可以在YouTube上播放免费的,广告支持的电影
  3. 手机加密聊天软件功能文档(基于android系统)
  4. 问卷星禁止粘贴解决方案
  5. 什么是抖音小程序 小程序该怎么做
  6. 计算机专业一句话介绍自己,来聊聊,你会如何用一句话介绍自己的专业?
  7. 手机远程连接linux软件下载,远程连接linux服务器软件下载
  8. Kettle计算器常用函数
  9. 影响红外测温的主要因素分析
  10. 查询读者的借阅信息mysql_MySQL数据库命令行【篇章九】之数据库综合查询(SELECT)...