CPU扩展设计--AXI总线接口实现
前言同步/异步读介绍《CPU设计实战》有这样一句话:在大多数真实的计算机系统中,CPU通过总线与系统中的内存、外设进行交互,没有总线,CPU就是个“光杆司令”,什么工作也做不了。
也因此,我们需要在CPU上设计总线接口,让我们的CPU能与总线进行交互,不再是孤岛。
还记得我们在P3-P7设计的取指和取值吗?
我们的地址在本周期发出,指令或者值便可以在本周期取回。这是一种异步读。这种设计现在看来大大帮助我们减轻了CPU设计的负担,但是所谓凡事皆有利弊,这种设计也在另一方面加剧了FPGA板子资源的消耗。
FPGA板子上有各种IP核(固化好的Ram资源等),如果我们这样设计,我们的CPU将不能利用这些高速资源,而是会用触发器层层叠搭,搭出一个异步读的Ram,这种方式导致了资源的浪费和速度的降低。
这些IP核的读取都是同步读,即地址在本周期发出,数据返回在下一周期或者更后面的某一周期。
Sram接口优势也因此,我们在P8进行板级验证的时候,不得不对我们的CPU做出修改,实现了当时不知道名字,现在知道它叫Sram接口的一种总线接口。
这种接口表现为CPU地址本周期发出, ...
树状数组
问题模型问题提出有一个数组arr,下标从1到n,现在有w次修改,q次查询,修改的话是修改数组中某一个元素的值;查询的话是查询数组中任意一个区间的和。规模在50w左右
暴力解法修改直接修改数组对应元素,时间复杂度为O(1),查询时直接相加,时间复杂对度O(n),总复杂度为O(wn).
前缀和解法修改需要修改前缀和数组对应点后的所有值,时间复杂度为O(n),查询时只需一次查询,时间复杂度为O(1),时间复杂度为O(qn).
可见暴力解法和前缀和解法时间复杂度其实大差不差.
寻找新解法有没有一种做法可以综合一下这两种朴素做法,然后整体时间复杂度可以降一个数量级呢?有——树状数组。
树状数组思想假设一个C数组,弃掉0下标不用,对于该数组每个下标所存内容,由如下规则决定:将下标转为二进制表示,求出该二进制表示最低一个1所表示的值,记为lowbit:该下标所存内容为arr数组中的(下标-lowbit,下标]的内容。eg:6的二进制表示为(110),那么6的lowbit的二进制表示为10,即为2,所以下标6所存内容为arr数组中的(4,6]的和。
这样做的根据在哪里?我们以求前6项和举例: ...
C++不常见但很好用的Api整理
本帖持续更新
algorithm库全排列函数next_permutation()介绍对于next_permutation函数,其函数原型为:
123#include <algorithm>bool next_permutation(iterator start,iterator end)
当当前序列不存在下一个排列时,函数返回false,否则返回true(字典升序)
prev_permutation()介绍next_permutation() 是按照字典升序的方式生成的排列。当我们想以降序的方式生成排列时,可以使用 prev_permutation()
示例下一个排列的基准以当前容器的元素顺序为准
代码1234567891011121314151617181920#include<iostream>#include<algorithm>#include<vector>using namespace std;vector<char> arr;int main(){ arr.push_back('a& ...
正整数C++高精度模板
前置函数数学取模1234int Mod(int x,int mod){ return (x % mod + mod) % mod;}
比较大小1234567891011int cmp(string a, string b){ if (a.length() > b.length()) return 1; else if (a.length() < b.length()) return -1; else { if (a < b) return -1; else if (a > b) return 1; else return 0; }}
int转string123456void i2s(int& x,string& s){ stringstream ss; ss << x; ss >> s;}
高精度思路用代码模拟小学所学的竖式加/减将乘除转化为加 ...
由波动数列对高级语言取模的思考
波动数列题目描述观察这个数列:
$$1,3,0,2, - 1,1, - 2$$
这个数列中后一项总是比前一项增加2或者减少3。栋栋对这种数列很好奇,他想知道长度为n或为s而且后一项总是比前一项增加a或者减少b的整数数列可能有多少种呢?
输入描述输入的第一行包含四个整数n,s,a,b,含义如前面所述,其中:
$$1 \le n \le 1000, - {10^{^9}} \le s \le {10^9},1 \le a,b \le {10^6}$$
输出描述输出一行,包含一个整数,表示满足条件的方案数。由于这个数很大,请输出方案数除以 $ {10^8}{\rm{ + }}7 $ 的余数。
解题过程第一层(10分)思路考虑极限情况:
$$\eqalign{
& {\rm{x,x}} + a,x + 2a,x + 3a,...x + (n - 1)a = nx + {{n(n - 1)} \over 2}a = s \cr
& x,x - b,x - 2b,x - 3b,...x - (n - 1)b = nx - {{n(n - 1)} \over 2}b = s \cr ...
算法——数论整理
本帖持续更新这是编程算法计算加速总结
快速乘法思路假设当前计算a*b,应用二进制,将a,b中较大的一位数转化为二进制表示,例如11转化为1011,然后类比利用竖式计算乘法那样,用较小的数乘以每一位代表的2次幂,最后相加。
加速点乘法转为logn量级的乘法+加法
代码无取模1234567891011121314151617181920unsigned long long Imul(unsigned long long a, unsigned long long b){ if (a > b) { unsigned long long tmp = a; a = b; b = tmp; } unsigned long long x = 0; while (b != 0) { if ((b & 1) == 1) { x = x + a; } a = a * 2; b >>= 1; } return x;}
取模123456789101112131415161718192 ...
Linux指令操作记录
本文用来记录笔者学习OS过程中掌握的Linux指令
查看命令详细用法man (命令名)目录操作cdcd ~访问当前用户主目录 一般为/home/用户OS实测:/home/git
cd .访问当前目录(原地踏步),常常结合其他目录使用
cd /访问根目录
绝对访问cd /文件/……
相对访问cd 文件cd 文件/
测试转自os平台
lsls -a查看当前目录下包括隐藏文件的所有文件
ls -l一行呈现一个文件
treetree [选项] [目录名]更高级的ls,可视化表达目录结构
选项-a 列出全部文件(包含隐藏文件)。-d 只列出目录。
mkdirmkdir [选项] 目录名称在当前目录下创建新目录
rmdirrmdir [选项] 目录名称删除当前目录下对应名称的目录,只能是空目录
pwd查看当前目录的绝对路径
文件操作touchtouch [选项] 文件名当文件存在时更新文件的时间戳,当文件不存在时创建新文件
rmrm -r 文件递归删除目录及其内容,删除非空目录必须有此选项,否则无法删除。
rm -f 文件强制删除,不提示用户确认 ...
MIPS微系统设计注意事项
这是一篇针对计组P8的一些注意事项
写在开头如果大家是以P8课下的身份来到这个,笔者首先恭喜大家来到P8,计组实验最终回。P8,是笔者认为debug de起来最痛苦的一个Project,没有之一。这是因为P8作为板级验证的Project,是最接近硬件的一个Project,而硬件Bug一般是难以定位的。
特别是ISE十分万恶,有些不可综合的语句不会给你做出相关警报,只会一声不吭的切割掉整个CPU,然后让你的CPU上板则寄,笔者被活活折磨了好几天
因此,笔者认为出一篇注意事项的博客是很有必要的,话不多说,Here We Go!
不可综合在Verilog中,有很多语句是不可综合的,我们在P8要避免出现这种情况。
注意事项(1)不使用initial。(2)不使用#10。(3)不使用循环次数不确定的循环语句,如forever、while等。(4)不使用用户自定义原语(UDP元件)。(5)尽量使用同步方式设计电路。(6)除非是关键路径的设计,一般不采用调用门级元件来描述设计的方法,建议采用行为语句来完成设计。(7)用always过程块描述组合逻辑,应在敏感信号列表中列出所有的输入信号。 ...
中断支持流水线CPU设计文档(Verilog)
Verilog 异常中断支持流水线CPU设计文档
CPU设计方案综述总体设计综述使用Verilog开发一个流水线CPU,总体概述如下:1.此流水线CPU为32位CPU2.此CPU为流水线设计3.此CPU支持的指令集为:{add,sub,and,or,slt,sltu,addi,andi,ori,lb,lh,lw,sb,sh,sw,mult,multu,div,divu,mfhi,mflo,mthi,mtlo,beq,bne,lui,jal,jr,nop,mtc0,mfc0,syscall}4.nop的机器码为0x00000005.该CPU支持对来自计数器和外部的中断进行处理6,该CPU支持对于部分异常进行处理,例如字不对齐,存取位置异常,溢出异常等
关键模块定义IM(外置)(1)端口说明
序号
信号名
方向
描述
1
i_inst_addr[31:0]
I
需要进行取指操作的流水级 PC(一般为 F 级)
2
i_inst_rdata[31:0]
I
i_inst_addr 对应的 32 位指令
3
reset
I
复位信号
4
clk
I
时钟信号
...
中断支持流水线CPU全自动测试思路(Verilog)
这是一篇针对计组P7的自动化测试学习
写在开头由于P7是P6的迭代开发,因此本次工作将主要体现在数据生成上,而且由于Mars的局限性,我们将编写两个测试程序(一个对拍Mars,一个对拍CPU),分别用于测试功能/异常和中断
命令行学习导出0x4180位置处的机器码1java -jar Mars.jar mc LargeText a dump 0x00004180-0x00006000 HexText handler.txt nc test.asm
在Mars中,我们是无法导出0x4180位置的机器码的,但我们可以通过命令行进行导出,上面的命令行就是以16进制导出test.asm中的0x4180-0x6000位置处的机器码,导出到handler.txt文件中。
限制Mars运行指令数1java -jar Mars.jar mc LargeText nc db lg ex me 65536 test.asm > mar.txt
在P7中,最起码对于笔者来说,是经常会将程序指引向一个死循环的,所以我们需要给Mars设置指令条数上限,这样Mars才能结束运行,否则将会一直运行。 ...