数据通路的作用

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

  • 内部数据通路: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. FPGA之道(63)“万能”的查表法
  2. 树莓派3上安装kali后的相关配置kali(2)
  3. PostgreSQL技术周刊第20期:PostgreSQL何以支持丰富的NoSQL特性?
  4. 【Python学习系列十八】基于scikit-learn库逻辑回归训练模型(delta比赛代码3)
  5. 11、修改和删除索引(DROP INDEX)
  6. 【干货】搭建社区运营团队的一些经验和“血的教训”
  7. 数据结构与算法 / 排序算法(2)
  8. 为什么 Go 模块在下游服务抖动恢复后,CPU 占用无法恢复
  9. 【vulnhub】靶机- [DC系列]DC9(附靶机))
  10. map和hash_map
  11. 今天的这天晚上的飞鸽传书
  12. 【Python-GPU】GPU数据科学加速包——RAPIDS
  13. 大数据时代的全能日志分析专家--Splunk安装与实践
  14. 利用Pin分析程序的动态行为特征
  15. 计算机网络——大数据、物联网
  16. Tkinter 学习笔记
  17. java dog cat animal,理解Java的多态
  18. 解决MATLAB2018b打开m文件后注释乱码的问题
  19. Altium的基本使用方法
  20. 关于hover改变其他元素

热门文章

  1. 51单处片机c语言编程,51单片c语言总结.doc
  2. Android OpenGL 仿自如 APP 裸眼 3D 效果
  3. Jmeter调用第三方jar包,配合BeanShell使用
  4. Junit3和Junit4区别
  5. poweramp音乐播放器+viper4android音效驱动,另一种让V4a音效在Poweramp上生效的方法
  6. uboot启动参数详解和一些细节
  7. sqlserver jdbc 包下载
  8. 已知有十六支男子足球队参加2008 北京奥运会。写一个程序,把这16 支球队随机分为4 个组。注:参赛球队列表见附录注2:使用Math.random 来产生随机数。(也可以使用其它方法)
  9. windows2008上安装proxycap后,本地解析不出域名了
  10. 【离散数学】一阶逻辑等值演算与推理