自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(22)
  • 收藏
  • 关注

原创 CPU设计实战-FPGA基础操作学习

1.排查外设的硬件问题(更换硬件器件进行测试)2.clk与rst3.主从设备之间有没有正常联系(M-S,看最关键的直接输出的信号)4.协议检查:对协议中的关键信号进行检查如状态机信号——影响状态机的控制信号——一步一步推比如到计数器之类(state)5.读写的数据是否正确(data)6.用假数据测试,用简单的数据如12345678去测试可以方便的排查地址问题(触发信号trgger)前提:手册读懂。

2024-03-28 10:50:27 579

原创 CPU设计实战-外设接口介绍与测试

内置寄存器,BASE地址由外设所在设备接口处决定,这样就可以确定每个寄存器的地址;要使用输出先要使能,要用中断也先要使能;

2024-03-27 13:42:17 1100

原创 CPU设计实战-Wishbone总线接口

需要注意的是:WE读写使能信号:低位表示读操作,高位表示写操作SEL数据总线选择信号:用于选择总线上哪些bit是有效的,宽度为位宽/总线粒度(一般为一个字节)CYC总线周期信号:代表总线正在被占用(不一定是总线操作),在总线使用时须持续有效STB总线选用信号:有效时代表发起一次总线操作在发起一次总线操作后,这两个信号都要有效ACK操作结束信号:操作结束给一个有效位。

2024-03-20 20:00:44 1257 1

原创 CPU设计实战—异常处理指令

异常有点像中断,处理完还要回到原来的状态,所以需要对之前的状态进行保存。本CPU主要实现对以下异常的处理:1.外部硬件中断2.复位异常3.系统调用异常(发生在译码阶段)4.溢出异常(发生在执行阶段)5.自陷指令异常(发生在执行阶段因为需要进行条件判断)6.无效指令异常(发生在译码阶段)为了不破坏原程序的执行,异常指令之前的指令都要确保执行完成,而异常指令和其之后的指令需要取消。这要求。可会有例外吗?由于流水线的特性,。

2024-03-19 17:12:41 1152 1

原创 BUG解决-Modelsim打开许可证件不可用

原因2:在Mentor Graphics手动配置下许可文件。原因1:如果安装了虚拟机需要把虚拟网卡ban掉。我采用第二种方法成功了。

2024-03-14 14:16:12 683 2

原创 verilog数字系统设计教程(夏闻宇)|第一章-第六章

小括号中表示在本模块中与之连接的线路。

2024-03-12 15:24:42 2524 1

原创 CPU设计实战-协处理器访问指令的实现

读操作需要提前去读CP0寄存器的值并传递回来,而写操作需要把使能以及写入值与地址传递到CP0.此外新引入的寄存器同样会发生。

2024-03-09 16:08:38 1392 2

原创 CPU设计实战-加载和存储指令(2)

将回写阶段指令对LLbit寄存器的操作信息(是否进行写LLbit操作以及写入的值)前推到访存阶段,访存阶段依据这些情况,确定正确的LLbit寄存器的值,所以MEM/WB模块的输出信号wb_LLbit_we、wb_LLbit_value也要送到MEM模块,就是用来解决数据相关问题的。需要注意的是,由于对LLbit寄存器的修改是在回写阶段最后的时钟上升沿进行的,如果直接采用LLbit模块给出的LLbit寄存器的值,可能不是正确的值,因为此时。,然后符号扩展至32位,保存到地址为rt的通用寄存器中。

2024-03-07 21:49:30 1130 1

原创 CPU设计实战-加载存储指令(1)

如下图:swl指令同样面临一个字的寄存器值如何写入到内存中,首先同样的读寄存器的地址不能是非地址对齐的,要留空最后两位,然后根据加载地址去判断。如后两位为00时,如n=0时,全部写入;当后两位01,与加载指令不同的是,

2024-03-07 16:28:09 1184 1

原创 CPU设计实战-乘除法设计实现(1)

OpenMIPS采用的是一-种改进的方法: 假如位于流水线第n阶段的指令需要多个时钟周.期,进而请求流水线暂停,那么需保持取指令地址PC的值不变,同时保持流水线第n阶段、第n阶段之前的各个阶段的寄存器不变,而第n阶段后面的指令继续运行。为此,设计添加CTRL模块,其作用是接收各阶段传递过来的流水线暂停请求信号,从而控制流水线各阶段的运行。因为只有译码、执行阶段可能会有暂停请求,取指、访存阶段都没有暂停请求,因为指令读取、数据存储器的读/写操作都可以在--个时钟周期内完成。

2024-03-04 20:30:36 1264 1

原创 CPU设计实战-简单算术操作指令的实现

CPU设计实战-简单算术操作指令的实现

2024-03-02 13:16:13 1489 1

原创 CPU设计实战-移动操作指令的实现

(1)在译码阶段依据指令,给出运算类型alusel_ o、 运算子类型aluop_ o的值,同时因为有要写入的目的寄存器,所以wreg. o为WriteEnable, wd o为指令中rd的值,也就是目的寄。MEM/WB模块输出的对HI、LO寄存器的写信息将直接送到HILO模块,包括: wb_ whilo、 wb_ _hi、 wb_ lo,后者据此修改HI、LO寄存器的值。理解指令:movn和movz是根据rt的值来判断是否将rs寄存器的值赋值到rd中,后四个指令都是对hi和lo寄存器进行读写。

2024-03-01 17:19:09 980

原创 CPU设计实战-逻辑,移位操作与空指令的实现

主要还是因为cpu的五级流水线结构,如下图可以看到,第一条指令的结果要在回写阶段才能写入一号寄存器,而第二条指令在译码阶段就已经开始读取一号寄存器的值了,这时并没有读到最新更新的值。来看看译码模块的代码是怎么实现的,其实和之前寄存器模块处理相隔两条执行的相关问题的方法一样,如果传递过来的数据就是译码阶段要读的数据(即目的寄存器地址和读取寄存器地址一样),就直接把传递过来的值给到译码阶段的输出。顾名思义就是在新的数据还未写入寄存器时就去读取了寄存器的值,这样导致读取的值是原来的旧值而不是最新的值。

2024-02-29 18:04:42 1821

原创 CPU设计实战-最小SOC的实现

顶层模块用于对之前文章里介绍的五级流水线的各个模块进行例化,也就是连线,那么顶层模块的输入输出接口如何呢?首先输入要有时钟复位信号,还要有一个来接收指令存储器里的数据记为rom_data_i输出因为要去读取指令存储器中的数据,所以要输出读地址以及一个使能信号。

2024-02-28 14:14:45 1048 1

原创 CPU设计实战-第一条指令ori的实现即最简单的五级流水线的实现

defines.v此文件定义了下面模块中所用到一些宏定义,如常用的数据宽度,数据长度以及指令码的定义。使用头文件只需在模块最前面加上`include"defines.v"//全局//指令//AluOp//AluSel//指令存储器inst_rom//通用寄存器regfile。

2024-02-01 15:21:18 1564 3

原创 CPU设计实战-基于IP核的RAM实现

新建工程后打开IP核搜RAM并双击下面解释每个选项的含义对IP核进行命名选择存储器类型single:一个地址,只能进行一组读写,不能同时读写simpel:两个地址,一组读一组写true:两个地址,每组都可以分别读写选择位数和深度(有多少个)存储器深度(Memory Depth)是指存储器中可以存储数据的地址数量,或者说存储器能够存储的数据元素的个数。它是描述存储器容量的一个方面,通常用于说明存储器的大小。

2024-01-28 12:49:12 524 1

原创 CPU设计实战-verilog实现MIPS下CPU中的寄存器堆

首先我们要明白一个指令在cpu中是怎么执行的,大概的执行顺序如下:首先我们得知道当前执行什么指令吧,那么当前执行的指令存储在哪里呢,在PC(程序计数器,用于存储当前指令的地址)中。由于PC中存储的指令是虚地址,所以还需要输送到MMU中作虚实地址的转换(一般我们设计的简单的CPU不含有虚实地址)。拿到当前指令的物理地址后,我们需要根据这个地址去指令RAM(各种指令的RAM都在这里)中去取出对应的32位指令码。

2024-01-27 15:58:42 1087 2

原创 cpu设计实战-verilog实现简单MIPS中CPU的ALU(1)

分析可知,ALU内部包含做加减操作、比较操作、移位操作和逻辑操作的逻辑,ALU的输人同时传输给这些逻辑,各逻辑同时运算,最后通过一个多路选择电路将所需的结果选择出来作为ALU的输出。假如我们现在就是需要执行op_slt这个操作,那么输入选择信号alu_control为001000_000000(之前说了它是独热码,这也是为什么用独热码编码的原因),此时op_slt的值为1,那么此时整个的输出就是slt_result;根据下图可以看到,常用的指令的大部分是对两个寄存器中的数值进行操作,最终输出一个。

2024-01-24 18:43:52 1738

原创 verilog设计与实现状态机-基于售货机实例

可乐机中有 0 元的状态是最原始的状态我们称之为 IDLE 状态,可乐机中有 1 元的状态我们就取名为 ONE,可乐机中有 2 元的状态取名为 TWO,可乐机中有 3元的状态取名为 THREE。了 3 元钱,但是和上面分析不同的是可乐机器此时不会立刻出可乐,此为 Mealy 状态机,输出不仅与状态有关还和输入有关,可以看到3状态后面根据不同的输入跳转了两种不同的结果。此时只需要关注输入与下一时刻的状态。3 、状态:可乐机中有 0元、可乐机中有 1 元、可乐机中有 2元、可乐机中有 3 元。

2024-01-22 18:44:38 606

原创 Verilog实现PWM呼吸灯

发现:由灭到亮时 led_out为低电平时间时 cnt_1s 计数器的计数值总是小于 cnt_1ms 计数器的计数(cnt_1ms > cnt_1s),相反由亮到灭时 cnt_1s 计数器的计数值总是大于cnt_1ms 计数器(cnt_1ms < cnt_1s)),即可得到led_out的赋值条件,注意区分亮灭。实验原理:1s内分为1000个1ms,每个1ms分为1000个1us,对于每个1ms中的亮灭占比时间进行控制,如亮的时间从0到1us一直到1000us即最亮,由灭到亮同理。4.如何区分亮灭状态。

2024-01-22 17:51:39 607

原创 verilog线性序列机的应用

实现思路:用计数器计数一秒的周期,然后在指定位置实现变化(想象计数器是一个线性尺子,每一个时间长度单位就是一个刻度)在上一个代码进行修改即可,使用一个拨码开关来对八个led的状态进赋值,在case语句中把拨码开关赋值到led即可。答:最大值变零的时候还依旧需要耗费一个时钟周期,而在取值的过程中需不要耗费额外的周期。代码框架:一个周期计数器——周期内最小单位的计数——对每一个单位的电平进行赋值。下面介绍另一种思路,如图,吧最小的变化周期当作一个单位。应用1:写一个周期变化的流水灯如下图。

2024-01-22 17:11:07 385

原创 verilog实现led流水灯的几种方法

计数器半秒钟——触发器Q的输出——decoder的例化。然后需要把decoder模块的拿进来连线例化。参数化decoeder模块的实例化。电路功能:每过半秒钟Q的输出清零。2.38译码器实现流水灯。首先确定电路结构与连线。

2024-01-21 20:54:02 1478

自己动手写CPU-雷思磊书籍配套资源代码

自己动手写CPU-雷思磊书籍配套资源

2024-03-02

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除