- 博客(35)
- 收藏
- 关注
原创 自己动手写CPU_step6.1_算数运算指令
例:0x0000,0001 CLZ指令结果:31 0x8000,ffff CLZ指令结果是0。例:0xffff,0000 CLO指令结果:16 0x0000,ffff CLO指令结果是0。70402021 CLO clo(reg2) => reg4 结果应该是16。SLT指令:(rs < rt) => rd(1/0) 如果rs小于rt寄存器的值,将1写入rd否则写0。
2024-09-02 19:50:45
550
原创 自己动手写CPU_step6_算术运算指令
define EXE_ADD 6'b100000 // rs + rt -> rd(检查溢出)`define EXE_ADDU 6'b100001 // rs + rt -> rd(不检查溢出)`define EXE_SLT 6'b101010 // (rs < rt) -> rd(比较结果为1/0)`define EXE_CLZ 6'b100000 // clz(rs) -> rd(从最高位开始直到遇到1,之前所有0的个数保存至rd)
2024-09-01 23:48:07
370
原创 自己动手写CPU_step5_移动指令
MEM WB 如果安正常的执行顺序,mfhi指令的EX阶段使用的hi寄存器值是第一条指令的结果,但是,这和我们实际需要的结果不同,我们需要的hi寄存器值应该是上一条指令产生的结果。即如果需要HILO寄存器的值,先判断有没有MEM阶段来的值,再判断有没有WB阶段来的值,如果都没有的话就是正常获取HILO寄存器的值,也即没有冲突。在EX_MEM、MEM、MEM_WB模块中添加由对应的HILO寄存器的值和写使能信号传导至HILO寄存器。仿真结果可知,前8条指令的运行结果与预期的一致。
2024-08-28 20:00:12
1138
原创 自己动手写CPU_step4_逻辑运算|移位指令
/R型指令通过OP=6'd0标识`define EXE_SPECIAL 6'b000000 //R型指令//I型指令通过OP字段区分`define EXE_ANDI 6'b001100 //与指令(立即数参与) rs and imm -> rt`define EXE_ORI 6'b001101 //或指令(立即数参与) rs or imm -> rd`define EXE_XORI 6'b001110 //异或指令(立即数参与) rs xor imm -> rt。
2024-08-22 22:45:13
814
原创 自己动手写CPU_step3_流水线数据相关问题
在第2篇的仿真测试结果中,我们是重复且循环读写一组寄存器,这些寄存器之间不存在数据相关问题,但是,如:以上四条指令都存在数据相关,即指令1中的结果尚未写入r1,指令2、3、4便读取了r1寄存器的值,这个值是错误的,导致这些指令执行结果错误。
2024-08-19 23:15:01
630
原创 自己动手写CPU_step2_构建SOPC
由图可知,在210ns时,开始了第一次取指令操作pc=0,230ns时开始了第二次的取指令pc=4,同时进行指令1的译码操作,以此类推;在290ns时是指令1的写回阶段,此时的结果是reg1(来源初始寄存器全0)和reg2(来源指令中的立即数)的或运算结果,结果写回指定的地址寄存器。上一篇中实现的五级流水线需要一个输入,这个输入是指令数据,而指令数据是通过取指阶段的PC控制的,PC会一直循环的取指令。至此,CPU中第一条指令ORI设计完成,后续将实现更多指令!最小SOPC实现之后,就可以开始仿真测试了。
2024-08-19 21:18:50
346
1
原创 自己动手写CPU_step1_五级流水线设计
为什么要做这么个东西?本人正在准备秋招,复习408的计组时,看到冯诺依曼架构(运算器、控制器、存储器和输入输出),突发奇想,学了这么久计算机,自己能不能做一个计算机呢?于是网上搜了一下,使用FPGA就可以实现自制CPU,正好手头有一个正点原子的开发板,于是开启了这个自己动手写CPU的探索之旅。总而言之,兴趣使然。如果你也和我一样,对FPGA感兴趣,对CPU实现感兴趣,欢迎交流讨论。
2024-08-19 20:38:44
297
原创 Linux主机和电脑都能相互ping通,使用vscode远程却连接不上Linux系统
这个问题值得记录一下,因为不属于技术方面的问题,可能并不是很好排查问题的根源,这也是我选择分享的一个原因。在网络配置文件中将专用网络换成公用网络即可。这种问题说实话只能靠经验。
2024-04-22 19:13:41
375
原创 基于ZYNQ7000的SOC点灯实验2--使用AXI_GPIO接口实现PS和PL的交互,PS端点亮PL端的LED
通过AXI_GPIO实现PS端到PL端的交互,PS端点亮PL端的LED灯。
2023-10-12 14:32:31
739
原创 基于ZYNQ7000的SOC点灯实验1--使用PS端的EMIO点亮LED灯
本文实现了ZYNQ在PS端点亮LED灯的实验,在vivado端实现硬件设计,在sdk端实现软件设计,最后在板卡上测试软硬件协同工作的结果。
2023-10-11 17:30:34
771
原创 阻塞赋值和非阻塞赋值的区别
结果应该是很明朗的,在0时刻a赋值0,在10时刻b赋值1,在15时刻c赋值0,在35时刻d赋值010;在为赋值之前的时刻均为高阻态。非阻塞赋值可以理解为并行赋值。在0时刻就将所有结果都求出来了,如果内部条件(延时到了)满足,则从新赋值。
2023-05-25 16:46:04
110
原创 使用主从JK触发器实现一个四位的同步计数器
清零信号clear低电平有效,输入数据在clock上升沿锁存,下降沿输出。count_ena低电平时停止计数。
2023-05-25 11:26:44
3846
原创 分支预测以及错误回滚
当发生分支错误预测 ( = 1) 时,在完成错误预测的分支后,将分支历史记录寄存器与历史记录一起加载。这是错误预测的分支 () 与分支 () 的实际结果连接之前的历史记录。进行分支预测 ( = 1) 时,从 LSB 端移入以更新预测分支的分支历史记录。(是最年轻的分支的方向。构建 32 位全局历史记录移位寄存器,包括支持回滚状态以响应由分支错误预测引起的管道刷新。如果预测和错误预测同时发生,则错误预测优先,因为管道刷新也会清除当前正在进行预测的分支。是分支历史记录寄存器的值。
2023-05-24 11:57:09
138
原创 FSM:One-hot logic equations
假设使用以下单热编码,则通过检查推导出下一状态逻辑方程和输出逻辑方程:(S, S1, S11, S110, B0, B1, B2, B3, Count, Wait) = (10'b0000000001, 10'b0000000010, 10'b0000000100, ... , 10'b1000000000。
2023-05-23 22:41:59
161
原创 FSM next-state logic
000, 001, ..., 101 分别用于状态 A、B、...、F 来实现 FSM。显示此 FSM 的状态分配表。假设您希望使用三个触发器和状态代码。派生下一个状态表达式。
2023-05-22 10:21:24
51
原创 FSM one-hot next-state logic
对于这部分,假设一个独热代码与状态赋值 'y[6:1] = 000001、000010、000100、001000、010000、100000、这里使用组合逻辑会出现部分点不对的问题,不知道为什么。为下一个状态信号 Y2 和 Y4 编写逻辑表达式。 分别用于状态 A、B,..., F。
2023-05-22 10:19:31
114
原创 串行接收器
设计一个有限状态机,该状态机将在给定比特流时识别何时正确接收字节。它需要识别起始位,等待所有8个数据位,然后验证停止位是否正确。如果停止位未按预期出现,则 FSM 必须等到找到停止位后再尝试接收下一个字节。每个数据字节都与起始位和停止位一起发送,以帮助接收器从位流中分隔字节。使用一个起始位 (0)、8 个数据位和 1 个停止位 (1)。当没有传输任何内容(空闲)时,该线路也处于逻辑 1。
2023-05-18 10:41:19
84
原创 Lemmings旅鼠
这里也有一个值得注意的点:cnt的计数,这里计的是下落时间,但是有可能会超过20还没到地面也就不会跳转到死亡状态,这里的逻辑很关键,是我们落地时判断cnt有没有到20而不是当cnt到20时判断有没有落地。这两种判断会使状态机运行结果不一致导致错误。这里有个问题值得注意一下:aaah的取值选择state状态是为了保持时钟同步,如果使用ground作为判断的话会发现比预期早一个时钟周期跳变。
2023-05-17 16:02:26
51
翻译 设计一个控制水位的状态机
这个题目意思有点模糊,经过参考其他文章才明白意思,目的就是要将水位保持在最高的状态。可以将水库的水位分成六个状态,一个是超出最高阈值(关闭阀门),一个是低于最低阈值(需要放水,打开所有阀门),还有就是处于s1s2之间以及处于s2s3之间,又可以细分为水位上升至s1s2之间和水位下降至s1s2之间,s2s3同理。fr1 fr2 fr3相当于阀门,例:当低于S1时需要带开所有阀门,当高于S3时要关闭所有阀门。dfr是一个状态位,如果水位下降(前一状态是下降)的话dfr置1,表示我们需要打开阀门了。
2023-05-16 16:50:41
231
原创 Rule110电路
有一个一维单元格数组(开或关)。在每个时间步长中,每个单元格的状态都会发生变化。将左记为l,右记为r,中心记为c,最后化简出来的表达式是:res = c&~(l&r) + (~l&r) + (l&r&~c);思路:将表格用卡诺图化简求出电路表达式。分类讨论一下边界问题即可得出答案。
2023-05-14 15:25:37
244
原创 12hour-clock
使用八位BCD码表示时分秒计数值,边界为12:00:00,即从12:00:00到11:59:59算一天,用一位标志位pm来代表白天还是黑夜,计满一轮12个小时pm变化一次。reset会将时分秒设置为12:00:00(am)用pm==0来表示am。
2023-05-08 15:30:42
46
原创 100位二进制数的加法RTL级实现
前面写了一个门级实现,需要实例话全加器100次,多少有点繁琐,这里我们使用RTL级实现一下(也就是直接使用加法器),但是这里有一个难点,就是如何简单高效的计算出最高位的进位cout呢?下面我会给出我的做法,但是感觉有待改善。其实整个always语句块都是用来求cout的。但是好像非这样做不可,因为每一位都会产生进位,每一位的进位都会影响最高的进位,这里我感觉没办法了已经,如果有读者想到更好的解决方案欢迎交流。
2023-05-04 20:39:55
128
原创 100个BCD数的加法器--生成语句块和for循环实现
实例化 100 个副本bcd_fadd以创建 100个BCD数的行波进位加法器。分别输入400位的BCD码即100个bcd数,输出400位的结果和一位进位。
2023-05-03 22:06:18
232
原创 100位二进制加法器--生成语句块和for循环
加法器将两个 100 位数字和一个进位相加,以产生 100 位和并执行。通过实例化 100 个完整加法器来创建 100 位二进制纹波进位。
2023-05-03 17:51:03
236
原创 模块添加子--加法减法器
可以通过选择性地否定其中一个输入来从加法器构建加法器-减法器,这相当于反转输入然后加 1。最终结果是一个可以执行两个操作的电路:(a + b + 0)和(a + ~b + 1)。
2023-05-03 15:11:25
164
2
原创 C++ 蓝桥杯之 找零钱
试题 算法训练 找零钱、 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 有n个人正在饭堂排队买海北鸡饭。每份海北鸡饭要25元。奇怪的是,每个人手里只有一张钞票(每张钞票的面值为25、 50、100元),而且饭堂阿姨一开始没有任何零钱。请问饭堂阿姨能否给所有人找零(假设饭堂阿姨足够聪明) 输入格式 第一行一个整数n,表示排队的...
2020-03-19 21:41:50
485
原创 C++ 蓝桥杯之 字母图形
试题 基础练习 字母图形 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 利用字母可以组成一些美丽的图形,下面给出了一个例子:ABCDEFGBABCDEFCBABCDEDCBABCDEDCBABC这是一个5行7列的图形,请找出这个图形的规律,并输出一个n行m列的图形。 输入格式 输入一行,包含两个整数n和m,分别表示你...
2020-03-18 23:22:49
430
原创 C++ 蓝桥杯之 FJ的字符串
试题 基础练习 FJ的字符串 资源限制 时间限制:1.0s 内存限制:512.0MB 问题描述 FJ在沙盘上写了这样一些字符串: A1 = “A” A2 = “ABA” A3 = “ABACABA” A4 = “ABACABADABACABA” … … 你能找出其中的规律并写所有的数列AN吗? 输入格式 仅有一个数...
2020-03-17 12:53:44
1600
原创 C++ 蓝桥杯之 龟兔赛跑预测
试题 基础练习 龟兔赛跑预测 资源限制 时间限制:1.0s 内存限制:512.0MB 问题描述 话说这个世界上有各种各样的兔子和乌龟,但是研究发现,所有的兔子和乌龟都有一个共同的特点——喜欢赛跑。于是世界上各个角落都不断在发生着乌龟和兔子的比赛,小华对此很感兴趣,于是决定研究不同兔子和乌龟的赛跑。他发现,兔子虽然跑比乌龟快,但它们有众所周知的毛病——骄傲且懒惰,于...
2020-03-16 23:04:52
1239
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人