设计CPU的第一步,设计一个简单的逻辑运算单元ALU。同时对Verilog语言也有一定要求。

一、实验内容

  1. 如图,ALU接受两个N位的输入,得到N位的输出,通过控制信号F决定运算功能。



  2. 将ALU的输出结构与七段数码管显示模块连接,使用实验配置的NEXYS4开发板。

    结构如下:

  3. 编写顶层模块top连接上述模块。
  4. 仿真,编写约束文件,生成二进制文件,在开发板上验证。

    整体难度不大,主要任务就是编写ALU和top,以及约束文件。

    但是这学期之前在摸鱼,这个小实验都没认真弄好。。。地基打不好,CPU肯定写不出来啊。

二、RTL级的部分Verilog代码,也是重点部分

ALU.v

真的很简单,方法两种,一种是always逻辑,一种是assign逻辑。

  1. always:
module ALU(
input wire [31:0] A,
input wire[31:0] B,
input wire [2:0] OP, // 输入用wire
output reg [31:0] F //输出用寄存器reg
);
always @(*) begin
case(OP)
3'b000: begin F <= A + B; end //这里实际上连进位都没有考虑
3'b001: begin F <= A - B; end
3'b010: begin F <= A & B; end
3'b011: begin F <= A | B; end
3'b100: begin F <= ~A; end
3'b101: begin F <= A<B; end
default: begin F <= 0; end
endcase
end
endmodule
  1. assign:

    assign相当于连线,一般是将一个变量的值不间断地赋值给另一个变量,所以赋值的类型应用wire。
module ALU(
input wire [31:0] A,
input wire[31:0] B,
input wire [2:0] OP,
output wire [31:0] F
);
assign F = (OP == 3'b000) ? A + B:
(OP == 3'b001) ? A + B:
(OP == 3'b010) ? A + B:
(OP == 3'b011) ? A + B:
(OP == 3'b100) ? A + B:
(OP == 3'b101) ? A + B:
32'b0;
endmodule

数码管显示模块display.v和seg7.v(实验提供)

  1. display.v
module display(
input wire clk,reset,
input wire [31:0]s,
output wire [6:0]seg,
output reg [7:0]ans
);
reg [20:0]count;
reg [4:0]digit;
always@(posedge clk,posedge reset)
if(reset)
count = 0;
else
count = count + 1; always @(posedge clk)
case(count[20:18])
0:begin
ans = 8'b11111110;
digit = s[3:0];
end
1:begin
ans = 8'b11111101;
digit = s[7:4];
end
2:begin
ans = 8'b11111011;
digit =s[11:8];
end
3:begin
ans = 8'b11110111;
digit = s[15:12];
end
4:begin
ans = 8'b11101111;
digit = s[19:16];
end
5:begin
ans = 8'b11011111;
digit = s[23:20];
end
6:begin
ans = 8'b10111111;
digit =s[27:24];
end
7:begin
ans = 8'b01111111;
digit = s[31:28];
end
endcase seg7 U4(.din(digit),.dout(seg));
endmodule
  1. seg7.v
module seg7(
input wire [3:0]din,
output reg [6:0]dout
); always@(*)
case(din)
5'h0:dout = 7'b000_0001;
5'h1:dout = 7'b100_1111;
5'h2:dout = 7'b001_0010;
5'h3:dout = 7'b000_0110;
5'h4:dout = 7'b100_1100;
5'h5:dout = 7'b010_0100;
5'h6:dout = 7'b010_0000;
5'h7:dout = 7'b000_1111;
5'h8:dout = 7'b000_0000;
5'h9:dout = 7'b000_0100;
5'ha:dout = 7'b000_1000;
5'hb:dout = 7'b110_0000;
5'hc:dout = 7'b011_0001;
5'hd:dout = 7'b100_0010;
5'he:dout = 7'b011_0000;
5'hf:dout = 7'b011_1000;
default:dout = 7'b111_1111;
endcase endmodule

top.v

module top(
input wire clk, rst,
output wire[6:0] seg,
output wire[7:0] ans,
input wire [2:0] op,
input wire [7:0] num_1
);
wire [31:0] f; // f从ALU传给display
ALU U1(.A({24'b0,num_1}),.B(32'h1),.OP(op),.F(f)); // 输入a为8位扩充至32位,b为固定值32'h1 display U2(.clk(clk),.reset(rst),.s(f),.ans(ans),.seg(seg));
endmodule

三、存在的问题

  1. 仿真测试中得不到结果,但是下到板子上以后能正常运行

test文件:

module test();
reg [7:0] num_1;
reg [2:0] op;
wire [6:0]seg;
wire [7:0]ans;
reg clk,rst; always #25 clk = ~clk; initial begin
clk = 1;
rst = 0;
num_1 = 8'h 11;
op = 3'b 111;
# 100 op = 3'b 000;
# 100 op = 3'b 001;
# 100 op = 3'b 010;
# 100 op = 3'b 011;
# 100 op = 3'b 100;
# 100 op = 3'b 101;
end top x(
.clk(clk),
.rst(rst),
.seg(seg),
.ans(ans),
.num_1(num_1),
.op(op)
); endmodule

MIPS指令的CPU实现:ALU设计的更多相关文章

  1. 自己动手写CPU之第五阶段(3)——MIPS指令集中的逻辑、移位与空指令

    将陆续上传本人写的新书<自己动手写CPU>(尚未出版),今天是第17篇.我尽量每周四篇 5.4 逻辑.移位操作与空指令说明 MIPS32指令集架构中定义的逻辑操作指令有8条:and.and ...

  2. 16位CPU多周期设计

    16位CPU多周期设计 这个工程完成了16位CPU的多周期设计,模块化设计,有包含必要的分析说明. 多周期CPU结构图 多周期CPU设计真值表 对应某一指令的情况,但仅当对应周期时才为对应的输出,不是 ...

  3. verilog实现的16位CPU单周期设计

    verilog实现的16位CPU单周期设计 这个工程完成了16位CPU的单周期设计,模块化设计,包含对于关键指令的仿真与设计,有包含必要的分析说明. 单周期CPU结构图 单周期CPU设计真值表与结构图 ...

  4. 3.6 MIPS指令简介

    计算机组成 3 指令系统体系结构 3.6 MIPS指令简介 MIPS秉承着指令数量少,指令功能简单的设计理念.那这样的设计理念是如何实现的呢?在这一节,我们就将来分析MIPS指令的特点. 相比于X86 ...

  5. MIPS指令 MIPS架构

    华中科技大学 - 计算机组成原理 华中科技大学 - 计算机硬件系统设计 Microprocessor without Interlocked Pipleline Stages 无内部互锁流水级的微处理 ...

  6. verilog简易实现CPU的Cache设计

    verilog简易实现CPU的Cache设计 该文是基于博主之前一篇博客http://www.cnblogs.com/wsine/p/4661147.html所增加的Cache,相同的内容就不重复写了 ...

  7. QtSpim实现MIPS指令的编写

    QtSpim实现MIPS指令的编写 由于各种对齐问题,cnblogs的格式难以控制,故贴图片,谅解.

  8. MIPS指令学习二

    1.MIPS寻址方式 MIPS架构的寻址模式有寄存器寻址.立即数寻址.寄存器相对寻址和PC相对寻址4种,其中寄存器相对寻址.PC相对寻址介绍如下: 1.1.寄存器相对寻址 这种寻址模式主要被加载/存储 ...

  9. P4-verilog实现mips单周期CPU

    最近对学习的掌控可能出现了问题,左支右绌,p2挂了,p2.p3.p4.p5每周在计组花的连续时间少了很多,学习到的东西也少了很多,流水线都还没真正开始写,和别人比落后了一大截,随笔自然就荒废了,我得尽 ...

随机推荐

  1. IDEA - 返回上一步,回到下一步 代码 快捷键

    回到上一步 ctrl + alt + < 回到下一步 ctrl + alt + >

  2. 12.Quick QML-QML 布局(Row、Column、Grid、Flow和嵌套布局) 、Repeater对象

    1.Row布局 Row中的item可以不需要使用anchors布局,就能通过行的形式进行布局. 并且item可以使用Positioner附加属性来访问有关其在Row中的位置及其他信息. 示例如下所示, ...

  3. 玉帝传美猴王上天,大闹天宫之Java设计模式:命令模式

    目录 示例 改进代码 命令模式 定义 意图 主要解决问题 何时使用 优缺点 玉帝传美猴王上天 命令模式和策略模式的区别 示例 系统需要设计一个命令行界面,用户可输入命令来执行某项功能,系统的功能会不断 ...

  4. 腾讯云TCA开发工程师认证考试

    1.关于云硬盘CBS的描述,错误的是哪一项?(B) A.云硬盘提供数据块级别的数据存储,采用三副本的分布式机制,为 CVM 提供数据可靠性保证 B.云硬盘可在同一可用区中自由挂载.卸载;挂载和卸载过程 ...

  5. 4- MySQL创建表以及增删改查

    查看表结构 查看表的结构,使用命令:desc 表明: 创建表(命令) 格式:使用create table创建表,必须给出下列信息: 1.新表的名字. 2.表中列的名字和定义,用逗号隔开. 语法: cr ...

  6. POJ1324贪吃蛇(状态压缩广搜)

    题意:       给你一个地图,有的地方能走,有的地方不能走,然后给你一条蛇,问你这条蛇的头部走到1,1的位置的最少步数,注意,和贪吃蛇不太一样,就是蛇咬到自己身体的那个地方,具体怎么不一样自己模拟 ...

  7. java面试一日一题:如何判断一个对象是否为垃圾对象

    问题:请讲下在java中如何判断一个对象是否为垃圾 分析:该问题主要考察对java中的垃圾回收,用什么方式去识别一个对象是垃圾: 回答要点: 主要从以下几点去考虑, 1.GC回收的是什么,回收发生在内 ...

  8. SpringBoot+MyBatis练手项目笔记汇总

    以下是我在练习SpringBoot+MyBatis训练时候个人一些笔记汇总(可以点击跳转),献丑了,网上很多大佬的文章都比我写的详细,一些好的文章,我会将贴到各个内容中. 1. 插入数据返回id和内部 ...

  9. Asp.NetCore Web开发之路由

    接着讲asp.net core web开发,这节讲路由系统(Route). 在asp.net core中通过路由来将请求映射到对应的action,主要用到两个中间件,UseRouting()和UseE ...

  10. Morgan Stanley Books List:经典金融书籍推荐

    一.经济学 1. 中华帝国的专制制度,佛朗索瓦.魁奈 2. 资本论(共3卷),马恩全集 3. 国家竞争优势,麦克尔.波特 4. Essentials of corporate analysis, by ...