计算机组成原理cpu数据通路(Verilog HDL虚拟实验)
数据通路的作用
数据在功能部件之间传送的路径称为数据通路,建立数据通路的任务是由“控制部件"来完成的
- 内部数据通路: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虚拟实验)相关推荐
- 计算机组成原理单周期mips,计算机组成原理CPU单周期数据通路(MIPS)
计算机组成原理CPU单周期数据通路(MIPS) [计算机组成原理]CPU:单周期数据通路(MIPS) 寄存器传送语言RTL 1)R(r)表示寄存器r的内容 2)M(address)表示主存储器地址ad ...
- 计算机组成原理 控制器.ppt,计算机组成原理(CPU的控制器部件)课件.ppt
<计算机组成原理(CPU的控制器部件)课件.ppt>由会员分享,提供在线免费全文阅读可下载,此文档格式为ppt,更多相关<计算机组成原理(CPU的控制器部件)课件.ppt>文档 ...
- 计算机原理复杂模型机改动,计算机组成原理之复杂模型机设计实验
计算机组成原理之复杂模型机设计实验 计 算 机 与 信 息 技 术 学 院实 验 报 告姓 名 学 号 专业班 级 2009 级 计算机科学与技术课程名称 计算机组成原理课程设计 实验日 期 2011 ...
- 计算机组成原理CPU与译码器,计算机组成原理CPU的结构和功能.ppt
计算机组成原理CPU的结构和功能 算术逻辑单元 状态条件寄存器 程序记数器PC 地址寄存器AR 地址总线ABUS 数据总线DBUS 累加器AC 缓冲寄存器DR CPU ALU 指令寄存器IR 指令译码 ...
- 生成计算机组成原理:8位算术逻辑运算实验数据
74LS181 ALU真值表如下: 代码实现: /*计算机组成原理数据生成器使用与第一次实验实现了74LS181的逻辑结构 如果发现那个有问题请自行修改 */#include <stdio. ...
- 计算机组成原理计数器实验报告,计算机组成原理4位二制计数器实验报告.doc
计算机组成原理4位二制计数器实验报告 计算机组成原理实验一 4位二进制计数器实验 姓名:李云弟 学号:1205110115 网工1201 [实验环境] 1. Windows 2000 或 Window ...
- 计算机组成原理第4位,计算机组成原理4位进制计数器实验报告.doc
计算机组成原理4位进制计数器实验报告 计算机组成原理实验一 4位二进制计数器实验 姓名:李云弟 学号:1座机电话号码5 网工1201 [实验环境] 1. Windows 2000 或 Windows ...
- 概念模型计算机实验总结,计算机组成原理——cpu的简单模型实验报告
#cpu与简单模型机 姓名:学号: 班级:计科班 实验名称:CPU与简单模型机实验性质:综合型实验时间:2018.12.1 一.实验目的 (1) 掌握一个简单 CPU 的组成原理. (2) 在掌握部件 ...
- 计算机组成原理——cpu的简单模型实验报告
#cpu与简单模型机 姓名: 学号: 班级:计科班实验名称:CPU与简单模型机 实验性质:综合型实验 时间:2018.12.1 一.实验目的 (1) 掌握一个简单 CPU 的组成原理. (2) 在掌握 ...
最新文章
- FPGA之道(63)“万能”的查表法
- 树莓派3上安装kali后的相关配置kali(2)
- PostgreSQL技术周刊第20期:PostgreSQL何以支持丰富的NoSQL特性?
- 【Python学习系列十八】基于scikit-learn库逻辑回归训练模型(delta比赛代码3)
- 11、修改和删除索引(DROP INDEX)
- 【干货】搭建社区运营团队的一些经验和“血的教训”
- 数据结构与算法 / 排序算法(2)
- 为什么 Go 模块在下游服务抖动恢复后,CPU 占用无法恢复
- 【vulnhub】靶机- [DC系列]DC9(附靶机))
- map和hash_map
- 今天的这天晚上的飞鸽传书
- 【Python-GPU】GPU数据科学加速包——RAPIDS
- 大数据时代的全能日志分析专家--Splunk安装与实践
- 利用Pin分析程序的动态行为特征
- 计算机网络——大数据、物联网
- Tkinter 学习笔记
- java dog cat animal,理解Java的多态
- 解决MATLAB2018b打开m文件后注释乱码的问题
- Altium的基本使用方法
- 关于hover改变其他元素
热门文章
- 51单处片机c语言编程,51单片c语言总结.doc
- Android OpenGL 仿自如 APP 裸眼 3D 效果
- Jmeter调用第三方jar包,配合BeanShell使用
- Junit3和Junit4区别
- poweramp音乐播放器+viper4android音效驱动,另一种让V4a音效在Poweramp上生效的方法
- uboot启动参数详解和一些细节
- sqlserver jdbc 包下载
- 已知有十六支男子足球队参加2008 北京奥运会。写一个程序,把这16 支球队随机分为4 个组。注:参赛球队列表见附录注2:使用Math.random 来产生随机数。(也可以使用其它方法)
- windows2008上安装proxycap后,本地解析不出域名了
- 【离散数学】一阶逻辑等值演算与推理