数据通路的作用

数据在功能部件之间传送的路径称为数据通路,建立数据通路的任务是由“控制部件"来完成的

  • 内部数据通路:CPU内部的数据传送通路,用于在寄存器之间或寄存器ALU之间传送数据。
  • 外部数据通路:一般借助系统总线,将寄存器(MAR和MDR)与存储器和I/O模块连接起来。
  • 内部总线:是指同一部件,如CPU内部连接各寄存器及运算部件之间的总线
  • 系统总线:是指同一台计算机系统的各部件,如CPU、内存、通道和各类I/O接口间互相连接的总线。

快速索引

  • 数据通路的作用
  • 一、多周期实现示例
    • ALU
    • GRS
  • 二、单周期实现示例
    • GRS模块
    • ALU模块
  • 公用模块
    • 七段数码管显示模块
    • 寄存器

一、多周期实现示例

顶层代码:

`default_nettype none
module VirtualBoard (input  logic  CLOCK,      // 10 MHz Input Clockinput  logic [19:0] PB,   // 20 Push Buttons, logical 1 when pressedinput  logic [35:0] S,    // 36 Switchesoutput logic [35:0] L,    // 36 LEDs, drive logical 1 to light upoutput logic  [7:0] SD7,  // 8 common anode Seven-segment Displayoutput logic  [7:0] SD6,output logic  [7:0] SD5,output logic  [7:0] SD4,output logic  [7:0] SD3,output logic  [7:0] SD2,output logic  [7:0] SD1,output logic  [7:0] SD0
);/********* Seven-segment decoder instantiation **********/
logic [3:0] HD[7:0];  // 8 hexadecimal display
SevenSegDecode ssdecode_inst7(.iData(HD[7]), .oSeg(SD7));
SevenSegDecode ssdecode_inst6(.iData(HD[6]), .oSeg(SD6));
SevenSegDecode ssdecode_inst5(.iData(HD[5]), .oSeg(SD5));
SevenSegDecode ssdecode_inst4(.iData(HD[4]), .oSeg(SD4));
SevenSegDecode ssdecode_inst3(.iData(HD[3]), .oSeg(SD3));
SevenSegDecode ssdecode_inst2(.iData(HD[2]), .oSeg(SD2));
SevenSegDecode ssdecode_inst1(.iData(HD[1]), .oSeg(SD1));
SevenSegDecode ssdecode_inst0(.iData(HD[0]), .oSeg(SD0));/** The input port is replaced with an internal signal **/
wire reset  = PB[0];
wire clk    = PB[1];
wire [3:0] DATA  = S[3:0];
wire [1:0] INDEX = S[5:4];
wire RFoe   = S[6];
wire GRSoe = S[7];
wire DATAoe= S[8];
wire [3:0] ALUop = S[12:9];
// wire    = S[13];
wire RFce = S[14];
wire PSWce= S[15];
wire GRSce= S[16];
wire RXce = S[17];/************* The logic of this experiment *************/
//各模块间连线信号
wire [3:0] BUS, RX_Q, F, RF_Q, GRS_Q;
wire [3:0] FLAG, PSW_Q;//模块实例
ALU #(4) ALU_inst(.iOp(ALUop), .iX(RX_Q), .iY(BUS), .oF(F), .oFlag(FLAG), .Cin(PSW_Q[0]));GRS #(4) GRS_inst(.iD(BUS), .oQ (GRS_Q), .Load(GRSce), .Clk(clk), .Index(INDEX));DataReg #(4) RX_inst(.oQ(RX_Q), .iD(BUS), .Clk(clk), .Load(RXce), .Reset(reset));DataReg #(4) RF_inst(.oQ(RF_Q), .iD(F), .Clk(clk), .Load(RFce), .Reset(reset));DataReg #(4) PSW_inst(.oQ(PSW_Q), .iD(FLAG), .Clk(clk), .Load(PSWce ), .Reset(reset));//三态缓冲器逻辑描述
assign BUS = RFoe   ? RF_Q  : 4'bzzzz;
assign BUS = GRSoe  ? GRS_Q : 4'bzzzz;
assign BUS = DATAoe ? DATA  : 4'bzzzz;/****** Internal signal assignment to output port *******/
assign L[25:22] = PSW_Q;
assign L[21:18] = FLAG;
assign HD[5] = RX_Q;
assign HD[4] = BUS;
assign HD[3] = GRS_Q;
assign HD[1] = RF_Q;
assign HD[0] = F;endmodule

ALU

module ALU
#(parameter N=4)
(
input wire [N-1:0]iOp,
input wire Cin,
input wire [N-1:0] iX,
input wire [N-1:0] iY ,
output wire [N-1:0] oF,
output wire [N-1:0] oFlag
);
wire [N-1:0]M;
logic [N:0]result;
wire SR;
wire SV;
wire SL;
wire [1:0]SW;wire [N-1:0] A,B;
wire C0;
always@(iOp[N-1:0])begincase(iOp[N-1:0])  //F=X;4'b0000:beginSW[1:0]=2'b00;  //11M[3:0]=4'b0000;SV=1'b1;SR=1'b0;SL=1'b0;end4'b0001: begin  //F=X+YSW[1:0]=2'b00;M[3:0]=4'b0001;SV=1'b1;SR=1'b0;SL=1'b0;end4'b0010: begin    //F=X-YSW[1:0]=2'b00;SV=1'b1;M[3:0]=4'b0110;SR=1'b0;SL=1'b0;       end4'b0011:begin     //F=X &YSV=1'b1;SW[1:0]=2'b01;M[3:0]=4'b0001;SR=1'b0;SL=1'b0;end4'b0100:begin   // F=X or YSV=1'b1;SW[1:0]=2'b10;M[3:0]=4'b0001;SR=1'b0;SL=1'b0;end4'b0101:begin       //F=X ^YSV=1'b1;SW[1:0]=2'b11;M[3:0]=4'b0001;SL=1'b0;SR=1'b0;end4'b0110:begin     //F=X/2SR=1'b1;SV=1'b0;SL=1'b0;SW[1:0]=2'b00;M[3:0]=4'b0000;end4'b0111:beginSL=1'b1;    //F=2XSV=1'b0;SR=1'b0;SW[1:0]=2'b00;M[3:0]=4'b0000;end4'b1000:begin  //F=!XSV=1'b1;SW[1:0]=2'b11;M[3:0]=4'b0011;SL=1'b0;SR=1'b0;end4'b1001:begin  //F=X+1SV=1'b1;M[3:0]=4'b0100;SL=1'b0;SR=1'b0;SW[1:0]=2'b00;end4'b1010:begin  //F=X-1SV=1'b1;M[3:0]=4'b0011;SL=1'b0;SR=1'b0;SW[1:0]=2'b00;end4'b1011:begin //F=X+Y+CinSV=1'b1;M[3:0]=4'b1001;SL=1'b0;SR=1'b0;SW[1:0]=2'b00;end4'b1100:begin  //F=X-Y-CinSV=1'b1;M[3:0]=4'b1010;SL=1'b0;SR=1'b0;SW[1:0]=2'b00;enddefault:beginSV=1'b0;M[3:0]=4'b0000;SL=1'b0;SR=1'b0;SW[1:0]=2'bXX;endendcaseend//assign C0 =(Cin & M[3] & M[0]| M[2]);
wire sign, zero, overflow, carryOut;
assign A[3]=SR & iX[3] | iX[3] & SV | SL &iX[2] ;
assign A[2]=SR & iX[3] | iX[2] & SV | SL &iX[1];
assign A[1]=SR & iX[2] | iX[1] & SV | SL &iX[0] ;
assign A[0]=SR & iX[1] | iX[0] & SV | SL &1'b0 ;
assign B[3] =(M[0] & iY[3]) | (M[1] & !iY[3]) ;
assign B[2] =M[0] & iY[2] | M[1] & !iY[2] ;
assign B[1] =M[0] & iY[1] | M[1] & !iY[1] ;
assign B[0] =M[0] & iY[0] | M[1] & !iY[0] ;always_combbegin case({SW[1:0]})2'b00: result=A+B+C0;2'b01: result=iX & B;2'b10: result=iX |B;2'b11: result=iX ^ B;default:beginif(SV==0 & SR==0 & SL==0)result={(5){1'bZ}};endendcase
endassign carryOut=result[4];
assign oF[3:0] = result[3:0];
assign sign = oF[3];
always@( SV,SR,SL)
begin
if(SV==0 & SR==0 & SL==0)zero=0;elsezero = (oF==0) ? 1 : 0;  // ~|F;
end
assign overflow = (~A[3]) & ~B[3] & oF[3] | (A[3]) & B[3] & ~oF[3] ;assign oFlag={sign, zero, overflow, carryOut};
endmodule

GRS

module GRS
#(parameter N = 4)(input wire [N-1:0]iD,input wire Load,input  wire[1:0]Index,input wire Clk,output  wire[N-1:0]oQ);
// 2-4 decode 二四译码器
logic load3, load2, load1, load0;
always_comb beginif (Load)case (Index)2'b00: {load3, load2, load1, load0} = 4'b0001;2'b01: {load3, load2, load1, load0} = 4'b0010;2'b10: {load3, load2, load1, load0} = 4'b0100;2'b11: {load3, load2, load1, load0} = 4'b1000;default: {load3, load2, load1, load0} = 4'bx;endcaseelse{load3, load2, load1, load0} = 4'b0000;
end// register instantiation 译码器的实例化
logic [N-1:0] R0_Q, R1_Q, R2_Q, R3_Q;
DataReg #(N) R0(.oQ(R0_Q), .iD(iD), .Clk(Clk), .Load(load0), .Reset(1'b0));//由于本实验没有用到复位信号,所以reset恒为0,在待会的三端口寄存器堆里可以将第一个寄存器的信号设置为1使它无法存值
DataReg #(N) R1(.oQ(R1_Q), .iD(iD), .Clk(Clk), .Load(load1), .Reset(1'b0));
DataReg #(N) R2(.oQ(R2_Q), .iD(iD), .Clk(Clk), .Load(load2), .Reset(1'b0));
DataReg #(N) R3(.oQ(R3_Q), .iD(iD), .Clk(Clk), .Load(load3), .Reset(1'b0));// 4-1 MUX 四选一多路器always_comb begincase (Index)//根据地址信号选择输出哪个寄存器的值2'b00: oQ = R0_Q;2'b01: oQ = R1_Q;2'b10: oQ = R2_Q;2'b11: oQ = R3_Q;endcase
end
/****** Internal signal assignment to output port *******/endmodule

二、单周期实现示例

视频演示

顶层代码:

`default_nettype none
module VirtualBoard (input  logic  CLOCK,      // 10 MHz Input Clockinput  logic [19:0] PB,   // 20 Push Buttons, logical 1 when pressedinput  logic [35:0] S,    // 36 Switchesoutput logic [35:0] L,    // 36 LEDs, drive logical 1 to light upoutput logic  [7:0] SD7,  // 8 common anode Seven-segment Displayoutput logic  [7:0] SD6,output logic  [7:0] SD5,output logic  [7:0] SD4,output logic  [7:0] SD3,output logic  [7:0] SD2,output logic  [7:0] SD1,output logic  [7:0] SD0
);/********* Seven-segment decoder instantiation **********/
logic [3:0] HD[7:0];  // 8 hexadecimal display
SevenSegDecode ssdecode_inst7(.iData(HD[7]), .oSeg(SD7));
SevenSegDecode ssdecode_inst6(.iData(HD[6]), .oSeg(SD6));
SevenSegDecode ssdecode_inst5(.iData(HD[5]), .oSeg(SD5));
SevenSegDecode ssdecode_inst4(.iData(HD[4]), .oSeg(SD4));
SevenSegDecode ssdecode_inst3(.iData(HD[3]), .oSeg(SD3));
SevenSegDecode ssdecode_inst2(.iData(HD[2]), .oSeg(SD2));
SevenSegDecode ssdecode_inst1(.iData(HD[1]), .oSeg(SD1));
SevenSegDecode ssdecode_inst0(.iData(HD[0]), .oSeg(SD0));/** The input port is replaced with an internal signal **/
wire reset  = PB[0];
wire clk    = PB[1];
wire [1:0] WINDEX = S[5:4];
wire RFoe   = S[6];wire [1:0]SW =S[13:12];
wire M0 = S[14];wire [3:0] enter=S[11:8];wire[1:0]RA1=S[1:0];
wire [1:0]RA2=S[3:2];wire choose =S[7];
/************* The logic of this experiment *************/
//各模块间连线信号
wire [3:0] tempmux,  F, GRS_Q1,GRS_Q2;
wire [3:0] FLAG;assign tempmux = choose? enter:GRS_Q2 ;
//模块实例
ALU #(4) ALU_inst(.iX(GRS_Q1), .iY(tempmux), .oF(F), .oFlag(FLAG), .M0(M0),.SW(SW));GRS #(4) GRS_inst(.iD(F),.Load(RFoe),.WIndex(WINDEX),.RIndex1(RA1),.RIndex2(RA2),.Clk(clk),.oQ1 (GRS_Q1), .oQ2(GRS_Q2));/****** Internal signal assignment to output port *******/assign L[21:18] = FLAG;
assign HD[1] = GRS_Q1;
assign HD[2] = GRS_Q2;
assign HD[0] = tempmux;
assign HD[3] = F;endmodule

GRS模块

module GRS
#(parameter N = 4)(input wire [N-1:0]iD,input wire Load,input  wire[1:0]WIndex,input wire [1:0]RIndex1,input wire [1:0]RIndex2,input wire Clk,output  wire[N-1:0]oQ1,output wire [N-1:0]oQ2);
// 2-4 decode
logic load3, load2, load1, load0;
always_comb beginif (Load)case (WIndex)2'b00: {load3, load2, load1, load0} = 4'b0001;2'b01: {load3, load2, load1, load0} = 4'b0010;2'b10: {load3, load2, load1, load0} = 4'b0100;2'b11: {load3, load2, load1, load0} = 4'b1000;default: {load3, load2, load1, load0} = 4'bx;endcaseelse{load3, load2, load1, load0} = 4'b0000;
end
// register instantiation
logic [N-1:0] R0_Q, R1_Q, R2_Q, R3_Q;
DataReg #(N) R0(.oQ(R0_Q), .iD(iD), .Clk(Clk), .Load(load0), .Reset(1'b1));//这个reset改了
DataReg #(N) R1(.oQ(R1_Q), .iD(iD), .Clk(Clk), .Load(load1), .Reset(1'b0));
DataReg #(N) R2(.oQ(R2_Q), .iD(iD), .Clk(Clk), .Load(load2), .Reset(1'b0));
DataReg #(N) R3(.oQ(R3_Q), .iD(iD), .Clk(Clk), .Load(load3), .Reset(1'b0));// 4-1 MUX 现在有两个多路器
logic  [N-1:0] GRS_Q1, GRS_Q2;
always_comb begincase (RIndex1)2'b00: oQ1 = R0_Q;2'b01: oQ1 = R1_Q;2'b10: oQ1 = R2_Q;2'b11: oQ1 = R3_Q;endcasecase (RIndex2)2'b00: oQ2 = R0_Q;2'b01: oQ2 = R1_Q;2'b10: oQ2 = R2_Q;2'b11: oQ2 = R3_Q;endcaseend
endmodule

ALU模块

module ALU
#(parameter N=4)
(
input wire [N-1:0] iX,
input wire [N-1:0] iY ,
input wire [1:0]SW,
input wire M0,
output wire [N-1:0] oF,
output wire [N-1:0] oFlag
);
logic [N:0]result;wire [N-1:0] A,B;
wire C0;
assign C0=M0;
wire sign, zero, overflow, carryOut;
assign A=iX;
assign B=iY ;
always_combbegin case({SW[1:0]})2'b00: result=A+B^M0+C0;2'b01: result=A & B;2'b10: result=A|B;2'b11: result=A ^ B;default:result={(N+1){1'bx}};endcase
endassign carryOut = result[N];
assign oF[N-1:0] = result[N-1:0];
assign sign = oF[N-1];
assign overflow = (~A[N-1]) & ~B[N-1] & oF[N-1] | (A[N-1]) & B[N-1] & ~oF[N-1] ;assign oFlag={sign, zero, overflow, carryOut};
endmodule

公用模块

七段数码管显示模块

module SevenSegDecode(input logic[3:0]iData,output logic[7:0]oSeg
);always_combbegincase(iData)4'h0:oSeg=8'b11000000;4'h1:oSeg=8'b11111001;4'h2:oSeg=8'b10100100;4'h3:oSeg=8'b10110000;4'h4:oSeg=8'b10011001;4'h5:oSeg=8'b10010010;4'h6:oSeg=8'b10000010;4'h7:oSeg=8'b11111000;4'h8:oSeg=8'b10000000;4'h9:oSeg=8'b10010000;4'hA:oSeg=8'b10001000;4'hB:oSeg=8'b10000011;4'hC:oSeg=8'b11000110;4'hD:oSeg=8'b10100001;4'hE:oSeg=8'b10000110;4'hF:oSeg=8'b10001110;default:oSeg=8'bx;endcaseend
endmodule

寄存器

module DataReg
#(parameter N = 4)
(   output reg [N-1:0] oQ,input wire [N-1:0] iD,input wire Clk,input wire Load,input wire Reset
);
always @(posedge Clk or posedge Reset)
beginif (Reset)oQ <= 0;    else if (Load)oQ <= iD;
end
endmodule

计算机组成原理cpu数据通路(Verilog HDL虚拟实验)相关推荐

  1. 计算机组成原理单周期mips,计算机组成原理CPU单周期数据通路(MIPS)

    计算机组成原理CPU单周期数据通路(MIPS) [计算机组成原理]CPU:单周期数据通路(MIPS) 寄存器传送语言RTL 1)R(r)表示寄存器r的内容 2)M(address)表示主存储器地址ad ...

  2. 计算机组成原理 控制器.ppt,计算机组成原理(CPU的控制器部件)课件.ppt

    <计算机组成原理(CPU的控制器部件)课件.ppt>由会员分享,提供在线免费全文阅读可下载,此文档格式为ppt,更多相关<计算机组成原理(CPU的控制器部件)课件.ppt>文档 ...

  3. 计算机原理复杂模型机改动,计算机组成原理之复杂模型机设计实验

    计算机组成原理之复杂模型机设计实验 计 算 机 与 信 息 技 术 学 院实 验 报 告姓 名 学 号 专业班 级 2009 级 计算机科学与技术课程名称 计算机组成原理课程设计 实验日 期 2011 ...

  4. 计算机组成原理CPU与译码器,计算机组成原理CPU的结构和功能.ppt

    计算机组成原理CPU的结构和功能 算术逻辑单元 状态条件寄存器 程序记数器PC 地址寄存器AR 地址总线ABUS 数据总线DBUS 累加器AC 缓冲寄存器DR CPU ALU 指令寄存器IR 指令译码 ...

  5. 生成计算机组成原理:8位算术逻辑运算实验数据

     74LS181 ALU真值表如下: 代码实现:  /*计算机组成原理数据生成器使用与第一次实验实现了74LS181的逻辑结构 如果发现那个有问题请自行修改 */#include <stdio. ...

  6. 计算机组成原理计数器实验报告,计算机组成原理4位二制计数器实验报告.doc

    计算机组成原理4位二制计数器实验报告 计算机组成原理实验一 4位二进制计数器实验 姓名:李云弟 学号:1205110115 网工1201 [实验环境] 1. Windows 2000 或 Window ...

  7. 计算机组成原理第4位,计算机组成原理4位进制计数器实验报告.doc

    计算机组成原理4位进制计数器实验报告 计算机组成原理实验一 4位二进制计数器实验 姓名:李云弟 学号:1座机电话号码5 网工1201 [实验环境] 1. Windows 2000 或 Windows ...

  8. 概念模型计算机实验总结,计算机组成原理——cpu的简单模型实验报告

    #cpu与简单模型机 姓名:学号: 班级:计科班 实验名称:CPU与简单模型机实验性质:综合型实验时间:2018.12.1 一.实验目的 (1) 掌握一个简单 CPU 的组成原理. (2) 在掌握部件 ...

  9. 计算机组成原理——cpu的简单模型实验报告

    #cpu与简单模型机 姓名: 学号: 班级:计科班实验名称:CPU与简单模型机 实验性质:综合型实验 时间:2018.12.1 一.实验目的 (1) 掌握一个简单 CPU 的组成原理. (2) 在掌握 ...

最新文章

  1. Rocksdb 写流程,读流程,WAL文件,MANIFEST文件,ColumnFamily,Memtable,SST文件原理详解
  2. AI研究过于集中狭隘,我们是不是该反思了?
  3. AAAI2018正式落幕 13个世界顶尖AI教授都讲了啥?
  4. C语言实现二进制文件读写
  5. 数据源架构模式之数据映射器
  6. 如何在网页中嵌入自己想要的字体(实例下载)
  7. css改变指针形状,css 指针样式
  8. [渝粤教育] 中国地质大学 金融保险业会计 复习题 (2)
  9. 第十三节:Asp.Net Core WebApi基础总结和请求方式-第十八节
  10. 公钥 私钥_区块链中私钥、公钥和钱包地址三者关系
  11. C# Winform 窗体美化(二、LayeredSkin 界面库)
  12. python语言高空坠球_高空坠物打击体验装置制造方法
  13. joomla添加html,如何将自定义html代码添加到Joomla 2.5菜单项?
  14. java返回xls格式_java后台获得url返回的excel文件
  15. LINUX安装fossil
  16. 学校计算机考试交卷过程中关机了,计算机基础考试注意事项
  17. 计算机系统论文题目,计算机系统维护毕业论文题目(572个).doc
  18. 电脑不断弹窗的解决办法
  19. 安利超实用的(cc协议)游戏3d模型素材网站
  20. linux下获得root权限运行程序

热门文章

  1. 运筹说 第83期丨我国网络计划奠基人——华罗庚
  2. RK3399平台开发系列讲解(PCI/PCI-E)5.53、PCIE RC侧 地址映射
  3. javascript特效模拟marquee
  4. 商城订单使用优惠卷价格计算逻辑,举例计算
  5. vue-cli5脚手架搭建项目过程详解 -vue组件单元测试
  6. DTAS3D 三维公差分析与尺寸链计算软件-AI自动建模案例
  7. python下载与安装(详细教程)
  8. 什么是DDos攻击,如何有效缓解DDos攻击?
  9. kafka和zookeeper下载地址和安装方法和JAVA消费者方法
  10. selenium项目实战(三):实现网页验证码识别