【计算机组成原理】实验2

使用Verilog语言实现一个简单ALU,测试平台:Vivado

①代码:

alu.v

`timescale 1ns / 1ps
module alu(input  [11:0] alu_control,  // ALU控制信号input  [31:0] alu_src1,     // ALU操作数1,为补码input  [31:0] alu_src2,     // ALU操作数2,为补码output [31:0] alu_result    // ALU结果);wire alu_add;   //加法操作wire alu_sub;   //减法操作wire alu_slt;   //有符号比较,小于置位,复用加法器做减法wire alu_sltu;  //无符号比较,小于置位,复用加法器做减法wire alu_and;   //按位与wire alu_nor;   //按位或非wire alu_or;    //按位或wire alu_xor;   //按位异或wire alu_sll;   //逻辑左移wire alu_srl;   //逻辑右移wire alu_sra;   //算术右移wire alu_lui;   //高位加载assign alu_add  = alu_control[11];assign alu_sub  = alu_control[10];assign alu_slt  = alu_control[ 9];assign alu_sltu = alu_control[ 8];assign alu_and  = alu_control[ 7];assign alu_nor  = alu_control[ 6];assign alu_or   = alu_control[ 5];assign alu_xor  = alu_control[ 4];assign alu_sll  = alu_control[ 3];assign alu_srl  = alu_control[ 2];assign alu_sra  = alu_control[ 1];assign alu_lui  = alu_control[ 0];wire [31:0] add_sub_result; wire [31:0] slt_result; wire [31:0] sltu_result;wire [31:0] and_result; wire [31:0] nor_result; wire [31:0] or_result;  wire [31:0] xor_result; wire [31:0] sll_result; wire [31:0] srl_result;wire [31:0] sra_result; wire [31:0] lui_result; wire signed [31:0] temp_src1;  assign temp_src1 = alu_src1;   assign and_result = alu_src1 & alu_src2;     assign or_result  = alu_src1 | alu_src2;     assign nor_result = ~or_result;             assign xor_result = alu_src1 ^ alu_src2;assign lui_result = {alu_src2[15:0], 16'd0}; wire [31:0] adder_operand1;wire [31:0] adder_operand2;wire [31:0] adder_result;wire adder_cin;wire adder_cout;assign adder_operand1 = alu_src1;assign adder_operand2 = alu_add ? alu_src2 : ~alu_src2; // 1+ , 0-assign adder_cin = ~alu_add;adder adder_module(.operand1(adder_operand1),.operand2(adder_operand2),.cin(adder_cin),.result(adder_result),.cout(adder_cout));assign add_sub_result = adder_result;assign slt_result = adder_result[31] ?  1'b1 : 1'b0;assign sltu_result = adder_cout ? 1'b0 : 1'b1;wire [4:0] shf;assign shf = alu_src1[4:0];wire [1:0] shf_1_0;wire [1:0] shf_3_2;assign shf_1_0 = shf[1:0];assign shf_3_2 = shf[3:2];wire [31:0] sll_step1;wire [31:0] sll_step2;assign sll_step1 = {32{shf_1_0 == 2'b00}} & alu_src2                   | {32{shf_1_0 == 2'b01}} & {alu_src2[30:0], 1'd0}     | {32{shf_1_0 == 2'b10}} & {alu_src2[29:0], 2'd0}     | {32{shf_1_0 == 2'b11}} & {alu_src2[28:0], 3'd0};  assign sll_step2 = {32{shf_3_2 == 2'b00}} & sll_step1                  | {32{shf_3_2 == 2'b01}} & {sll_step1[27:0], 4'd0}    | {32{shf_3_2 == 2'b10}} & {sll_step1[23:0], 8'd0}    | {32{shf_3_2 == 2'b11}} & {sll_step1[19:0], 12'd0};  assign sll_result = shf[4] ? {sll_step2[15:0], 16'd0} : sll_step2;    assign srl_result = alu_src1 >> alu_src2;
assign sra_result = temp_src1 >>> alu_src2;    assign alu_result = (alu_add|alu_sub) ? add_sub_result[31:0] : alu_slt           ? slt_result :alu_sltu          ? sltu_result :alu_and           ? and_result :alu_nor           ? nor_result :alu_or            ? or_result  :alu_xor           ? xor_result :alu_sll           ? sll_result :alu_srl           ? srl_result :alu_sra           ? sra_result :alu_lui           ? lui_result :32'd0;
endmodule

Adder_module

adder.v:

`timescale 1ns / 1ps
module adder(input  [31:0] operand1,input  [31:0] operand2,input         cin,output [31:0] result,output        cout);assign {cout,result} = operand1 + operand2 + cin;
endmodule

TestBench.v:

`timescale 1ns / 1ps
module tb;reg clk;reg [11:0] alu_control;reg [31:0] alu_src1;
reg [31:0] alu_src2;wire [31:0] alu_result;alu al(.alu_control(alu_control),.alu_src1(alu_src1),.alu_src2(alu_src2),.alu_result(alu_result));initial beginclk = 0;alu_control = 0;#10;alu_src1 = 32'H00001111;alu_src2 = 32'H00000008;alu_control = 12'b0000_0000_0001;#40;alu_src1 = 32'HF0001234;alu_src2 = 32'H00000008;alu_control = 12'b0000_0000_0010;#40;alu_src1 = 32'HF0001234;alu_src2 = 32'H00000008;alu_control = 12'b0000_0000_0100;#40;alu_src1 = 32'H00012345;alu_src2 = 32'H00000008;alu_control = 12'b0000_0000_1000;#40;alu_src1 = 32'H00001111;alu_src2 = 32'H00000101;alu_control = 12'b0000_0001_0000;#40;alu_control = 12'b0000_0010_0000;#40;alu_control = 12'b0000_0100_0000;#40;alu_control = 12'b0000_1000_0000;#40;alu_control = 12'b0001_0000_0000;#40;alu_control = 12'b0010_0000_0000;#40;alu_control = 12'b0100_0000_0000;#40;alu_control = 12'b1000_0000_0000;#40;                //endalu_control = 0;alu_src1 = 32'H00000000;alu_src2 = 32'H00000000;    endalways #5 clk = ~clk;
endmodule

②仿真图像及其分析:

alu_control=001时进行alu_src2的高位加载,

002时进行alu_src1的算术右移,

004时进行alu_src1的逻辑右移,

008时进行alu_src1的逻辑左移,

010时进行按位异或,020时进行按位或,040时进行按位或非,080时进行按位与,

100时进行无符号比较,200时进行有符号比较

400时进行减法操作,800时进行加法操作。

【计算机组成原理】实验2:ALU(Verilog)中海大相关推荐

  1. 计算机组成原理实验报告alu,合肥工业大学计算机组成原理实验报告.doc

    文档介绍: 实验一基本运算器实验一.实验目的了解运算器的组成结构;掌握运算器的工作原理.二.实验内容 1 .连线说明: ALU 单元: S0..S3(JP18) --开关区单元: K20..K23(J ...

  2. 杭电 2016 计算机组成原理,杭电计算机组成原理多功能ALU设计实验

    <杭电计算机组成原理多功能ALU设计实验>由会员分享,可在线阅读,更多相关<杭电计算机组成原理多功能ALU设计实验(6页珍藏版)>请在人人文库网上搜索. 1.杭州电子科技大学计 ...

  3. 计算机组成原理中FZ,计算机组成原理实验二.doc

    计算机组成原理实验二.doc 北京科技大学 计算机与通信工程学院 实 验 报 告 实验名称:?? 基本运算器实验 李奥林 ???? 专 业:??? 计算机科学与技 ? ? 班 级:??? 计1303? ...

  4. 计算机进行科学实验报告,计算机组成原理实验报告5- PC实验

    2.5 PC实验 姓名:孙坚 学号:134173733 班级:13计算机 日期:2015.5.15 一.实验要求:利用CPTH 实验仪上的K16..K23 开关做为DBUS 的数据,其它开关做为控制信 ...

  5. 计算机组成原理移位图,计算机组成原理实验报告3-数据输出实验 移位门实验

    2.3 数据输出实验/移位门实验 一.实验要求:利用CPTH 实验仪的开关做为控制信号,将指定寄存器的内容读到数据总线DBUS上. 二.实验目的: 1.了解模型机中多寄存器接数据总线的实现原理. 2. ...

  6. 计算机组成原理判零实验,计算机组成原理实验报告 进位位控制、通用寄存器判零实验...

    <计算机组成原理实验报告 进位位控制.通用寄存器判零实验>由会员分享,可在线阅读,更多相关<计算机组成原理实验报告 进位位控制.通用寄存器判零实验(17页珍藏版)>请在人人文库 ...

  7. 计算机原理的进位输入是什么,进位控制实验计算机组成原理实验报告

    进位控制实验计算机组成原理实验报告 上海应用技术学院 计算机科学与信息工程系·2006 年编制 <计算机组成与结构>课程实验报告 实验名称 进位控制实验 实验序号 2 实验日期 2013. ...

  8. 合肥学院计算机原理,合肥学院计算机组成原理实验三-20210415130709.docx-原创力文档...

    精品文档 精品文档 PAGE 精品文档 合肥学院计算机组成原理实验三 --------------------------------作者:------------------------------ ...

  9. 计算机组成原理实验报告西华大学,计算机组成原理实验报告算术逻辑运算单元实验...

    <计算机组成原理实验报告算术逻辑运算单元实验>由会员分享,可在线阅读,更多相关<计算机组成原理实验报告算术逻辑运算单元实验(6页珍藏版)>请在人人文库网上搜索. 1.西华大学数 ...

  10. 计算机组成原理实验八报告,计算机组成原理实验报告-八位补码加减法器的设计与实现.docx...

    计算机科学与技术学院 计算机组成原理 实验报告书 实?验?名?称 班级 学号 姓名 指?导?教?师 日期 成绩 八位补码加/减法器的设计与实现 实验?1?八位补码加/减法器的设计与实现 一.实验目的 ...

最新文章

  1. 配置文件app.config
  2. DevOps简单介绍
  3. BZOJ-2242-计算器-SDOI2011-BSGS
  4. python找不到os模块_python之os模块
  5. 职称计算机考试word2003真题,职称计算机考试《Word2003》历年真题回顾(1)
  6. 抖音客新版UI短视频点赞任务系统完美运营级别[等级功能+信誉积分+保证金]
  7. php 获取季度起始日期,php获取昨天、今天、上周、本周、上月、本月、上季度、本季度、今年的起始时间...
  8. MATLAB 画图 x轴换成 字符串
  9. java file 实例_Java File类的详解及简单实例
  10. 遂宁让“智慧城市”融入绿色经济发张
  11. U盘写保护修复(亲测可用)
  12. 深度学习:GCN图分类案例
  13. 卖“生活方式”,还会是新式茶饮们的破局点吗?
  14. NC65 凭证辅助核算项目查询
  15. 三种嵌入式操作系统的深入分析与比较
  16. 大家都在问华为手机图片怎么拼图?只需几步就可实现
  17. 10的负8次方用python_matplotlib;10的分数次幂;科学记数法
  18. 精彩回顾|展会圆满收官,落幕不散场,期待与您的再次相遇,下一站上海!
  19. 国风虚拟人形象频频亮相,虚拟数字人为传统文化传播提供了新载体
  20. VDA19颗粒清洁度测试方法及要素

热门文章

  1. K8S --- Pod 基础概念
  2. 启迪论坛离线发帖工具
  3. php exif信息,php通过exif_read_data函数获取图片的exif信息 PHP
  4. “数字裂变”宇宙,华为云与和伙伴组成“银河护卫队”
  5. 感情到底是该刻意的追求还是顺其自然
  6. Qt pushbutton设置icon和文字
  7. 【Vue3】创建Vue3.0脚手架工程的解决方法(图文)
  8. MaxScript:txt点坐标生成面(3dmax脚本文件)
  9. TL_AP1907GC-POE/GC 无线桥接(WDS)设置
  10. Simpleperf分析之Android系统篇