You are on page 1of 26

实 模块 实验样例(说明:黄色部分为选做内容,其余为比做) 模块定义

验 类型


单 数据 同步(时钟上升沿)输入\输出数据存储器 DataRAM,容量为 2n*m (示例代码 SyncRAM.v) module
模 存储 输入引脚:地址线 Addr (位宽 n)、输入数据线 DataIn(位宽 m),写控制信号 MemWR(高电平写入,低电平输出),同步时钟 Clk SyncRAM(Addr,
块 器 输出引脚:数据输出 DataOut(位宽 m,具有保持功能) DataIn, MemWR,
Clk, DataOut);
示例文件:SyncRAM.v
parameter
SyncRAM
n=5,m=32;
m DataIn
n Addr DataOut m endmodule
MemWR
Clk

仿真激励:(仿真激励文件 SyncRAM_sim.v)
实例化 32 个存储单元,所有存储单元初始值都为 0
产生如下激励波形:时钟周期为 10ns,

仿真输入输出正确波形:(DataIn,DataOut 都为十进制数)输入信号的名称带黄点,其余为输出,判断正误依据——输出信号是否一致

同步(时钟上升沿)输入\异步输出数据存储器 DataRAM,容量为 2n*m (示例代码 DataRAM.v) module


输入引脚:地址线 Addr (位宽 n)、输入数据线 DataIn(位宽 m),写控制信号 MemWR(高电平有效),同步时钟 Clk DataRAM(Addr,
输出引脚:数据输出 DataOut(位宽 m,具有保持功能) DataIn, MemWR,
Clk, DataOut);
示例文件:DataRAM.v parameter
n=5,m=32;
DataRAM
m DataIn endmodule
n Addr DataOut m
MemWR
Clk
仿真激励:(仿真激励文件 dataram_sim.v)
实例化 32 个存储单元,所有存储单元初始值都为 0
产生如下激励波形:时钟周期为 10ns,

仿真输入输出正确波形:(DataIn,DataOut 都为十进制数)

异步输入输出数据存储器 DataRAM,容量为 2n*m module


输入引脚:地址线 Addr (位宽 n)、输入数据线 DataIn(位宽 m),写控制信号 MemWR(上升沿有效), AsyncRAM(Addr
输出引脚:数据输出 DataOut(位宽 m,具有保持功能) , DataIn,
MemWR,
示例文件:AsyncRAM.v
MemRD,
DataOut);
parameter
n=5,m=32;
AsyncRAM endmodule
m DataIn
n Addr DataOut m
MemWR

仿真激励:(仿真激励文件 AsyncRAM_sim.v)
产生激励波形:

输入输出正确波形:(DataIn,DataOut 都显示为十进制数)

指令 同步(时钟上升沿)输出指令存储器 InstrROM,容量为 2n*32 module


存储 输入引脚:地址线 Addr (位宽 n)、同步时钟 Clk InstrROM (Addr,
器 输出引脚:指令 Instr(位宽 32,具有保持功能) Clk, Instr);
parameter n=5;
示例文件:InstrROM.v
InstrROM
endmodule
n Addr Instr 32
Clk

仿真激励:
实例化 32 个存储单元,每个存储单元的初始值为其地址*4
产生如下仿真激励波形:(仿真激励文件 instrrom_sim.v)时钟周期为 10ns
输入输出正确波形:

异步输出指令存储器 InstrROM,容量为 2n*32 module


输入引脚:地址线 Addr (位宽 n) AsyncROM
输出引脚:指令 Instr(位宽 32) (Addr, Instr);
parameter n=5;
示例文件:AsyncROM.v
AsyncROM
endmodule
n Addr Instr 32

仿真激励:(仿真激励文件 AsynROM_sim.v)实例化 32 个存储单元,每个存储单元的初始值为其地址*4


产生激励波形:

输入输出正确波形:

寄存 同步输入\异步输出寄存器文件 RegFile,容量为 32*32,且编号为 0 的寄存器取值恒为 0 module RegFile


器文 输入引脚:Rs 寄存器编号 RsAddr (位宽 5)、Rt 寄存器编号 RtAddr (位宽 5),写寄存器编号 WrAddr((位宽 5))输入数据线 DataIn(位宽 (RsAddr, RtAddr,
件 32),写控制信号 RegWr(高电平有效),同步时钟 Clk WrAddr, DataIn,
RegWr,Clk,
输出引脚:Rs 寄存器数据 RsData(位宽 32),Rt 寄存器数据 RtData(位宽 32)
RsData, RtData);
示例文件:RegFile.v
endmodule
RegFile
32 DataIn
5 RsAddr RsData 32
5 RtAddr
5 RtData 32
WrAddr
RegWR
Clk
仿真激励:(仿真激励文件 regfile_sim.v)
所有寄存器初始值为 0,
产生如图所示仿真激励波形:

输入输出正确波形:所有多位宽数据都为 10 进制数

异步输入输出寄存器文件 RegFile,容量为 32*32,且编号为 0 的寄存器取值恒为 0 ,异步复位信号 Reset 高电平有效 module


输入引脚:Rs 寄存器编号 RsAddr (位宽 5)、Rt 寄存器编号 RtAddr (位宽 5),写寄存器编号 WrAddr((位宽 5))输入数据线 DataIn(位宽 AsyncRegFile
32),写控制信号 RegWr(上升沿有效写入) (RsAddr, RtAddr,
WrAddr, DataIn,
输出引脚:Rs 寄存器数据 RsDataOut(位宽 32),Rt 寄存器数据 RtDataOut(位宽 32) RegWr,
示例文件:AsyncRegFile.v RsDataOut,
AsyncRegFile RtDataOut);
32 DataIn

RsAddr RsData 32
endmodule
5
5 RtAddr RtData 32
5 WrAddr

RegWR

仿真激励:(仿真激励文件 AsyncRegFile_sim.v)
所有寄存器初始值为 0,
产生如图所示仿真激励波形:

输入输出正确波形:

ALU 32 位宽算术逻辑运算单元 ALU module ALU


输入引脚:输入数据源 1-In1(32 位),输入数据源 2-In2(32 位),运算类型控制-ALUCtr(3 位) (In1, In2,
运算类型 ALUCtr 编码 ALUCtr, Res,
加 0010 Zero);
减 0110
小于设置 0111 endmodule
与 0000
或 0001
输出引脚:运算结果 Res(32 位宽),运算结果零标志 Zero(1 位,如果 Res 不为零 Zero 为 0,否则 Zero 为 1)
示例文件:ALU.v
32 In1
Res 32
ALU
Zero
32 In2 ALUCtr
4

仿真激励:仿真激励文件(alu_sim.v)
产生如下激励波形:所有数据为 16 进制符号数

输入输出正确波形:(输入输出都为 16 进制显示)

主控 主控制器 MainCtr 将操作码译码产生各模块控制信号 module MainCtr


制器 输入信号:OpCode(6 位) (OpCode, J, B,
输出信号: J, B, RegDst, RegWr, ALUSrc, MemWr, Mem2Reg, ALUOp(2 位) RegDst, RegWr,
ALUSrc,
示例文件:MainCtr.v
MemWr,
Mem2Reg,
ALUOp);

endmodule
Mainctr
J
B
RegDst
RegWr
6 OpCode ALUSrc
MemWr
Mem2Reg
ALUOp 2

输入输出真值表:
Opcode J B RegDst RegWr ALUSrc MemWr Mem2Reg ALUOp
0000000 0 0 1 1 0 0 0 10
100011 0 0 0 1 1 0 1 00
101011 0 0 x 0 1 1 x 00
000100 0 1 x 0 0 0 x 01
000010 1 x x 0 x 0 x xx
仿真激励:(激励文件 mainctr_sim.v)
产生激励波形:

输入输出正确波形:

产生 主控制器 SyncMainCtr 将操作码译码产生各模块控制信号,且 RegWr 以及 MemWr 有效信号形式为与时钟通宽度的正脉冲


脉冲 输入信号:OpCode(6 位),Clk
写控 输出信号: J, B, RegDst, RegWr, ALUSrc, MemWr, Mem2Reg, ALUOp(2 位)
制信 示例文件:SyncMainCtr.v
号的 SyncMainctr
主控 J
制器 B
RegDst
RegWr
6 OpCode ALUSrc
MemWr
Clk
Mem2Reg
ALUOp 2

输入输出真值表:
Opcode J B RegDst RegWr ALUSrc MemWr Mem2Reg ALUOp
0000000 0 0 1 ↑ 0 0 0 10
100011 0 0 0 ↑ 1 0 1 00
101011 0 0 x 0 1 ↑ x 00
000100 0 1 x 0 0 0 x 01
000010 1 x x 0 x 0 x xx
仿真激励:(激励文件 SyncMainCtr_sim.v)
产生激励波形:

输入输出正确波形:
ALU ALU 控制器 ALUControl 将主控制器产生的 ALUOp 以及指令功能码译码产生 ALU 模块的控制信号 module
控制 输入信号:ALUOp(2 位),Funct(6 位) ALUControl
器 输出信号:ALUCtr(4 位) (ALUOp, Funct,
ALUCtr);
示例文件:ALUControl.v
ALUControl
endmodule
6 Funct
ALUCtr 4
2 ALUOp

输入输出真值表:
ALUOp Funct ALUCtr
00 xxxxxx 0010
00 xxxxxx 0010
01 xxxxxx 0110
10 100000 0010
10 100010 0110
10 100100 0000
10 100101 0001
10 101010 0111
仿真激励:(仿真激励文件 aluctr_sim.v)
产生以下激励波形:

输入输出正确波形:(显示为 16 进制)

符号 将 n 位符号数扩展为 m 位符号数模块 SignedExtend(示例代码 SignExtend.v) module


扩展 输入:In (n 位) SignedExtend (In,
输出:Out(m 位) Out);
parameter
示例文件:SignedExtend.v
n=16,m=32;
SignedExtend
n In Out m endmodule
仿真激励:(仿真激励文件 signextend_sim.v)
产生如下激励波形:

输入输出波形:(显示为 16 进制数)

无符 将 n 位符号数扩展为 m 位符号数模块 UnSignedExtend module


号扩 输入:In (n 位) UnsignedExtend
展 输出:Out(m 位) (In, Out);
parameter
示例文件:UnsignedExtend.v
n=16,m=32;
UnSignedExtend
n In Out m endmodule
仿真激励:(仿真激励文件 UnsignedExtend_sim.v)
产生激励波形:

输入输出波形:(显示为 16 进制数)

2选1 多路复用器 Mux2_1 将两个 n 位宽的输入通道复用到一个输出同位宽通道,当 sel 为 0 时,选择 In1 输出,否则选择 In2 输出 module Mux2_1
多路 输入:In1(n 位),In2(n 位),sel (In1, In2, sel,
复用 输出:Out(n 位) Out);
parameter n=32;
器 示例文件:Mux2_1.v
Mux2_1 endmodule
n In1
Out n
In2 Sel
n

仿真激励:(仿真激励文件 mux2_1_sim.v),要求实例化两个不同位宽的模块,同时观察不同位宽的输出是否正确
产生激励波形:

输入输出波形:(显示为 16 进制数,Out0 位 5 位宽的复用器输出,Out1 为 32 位宽的复用器输出)


加法 加法器 Adder 将两个 n 位宽的数据相加,输出结果 module Adder
器 输入:In1(n 位),In2(n 位) (In1, In2,Out);
输出:Out(n 位) parameter n=32;
示例文件:Adder.v
endmodule
n In1
Adder Out n

n In2

仿真激励:(仿真激励文件 adder_sim.v)
产生如下仿真波形:

输入输出波形:(显示为 16 进制数)

寄存 寄存器 PC,时钟 Clk 上升沿 Q 锁存输入数据 D, 异步复位信号 Reset 高电平有效,复位时 Q 为 0. module PC(D,
器 输入:输入数据 D(n 位),时钟 Clk,复位 Reset Clk, Reset, Q);
输出:锁存数据 Q(n 位) parameter n=32;
示例文件:PC.v
endmodule
PC
n D Q n
Clk
Reset
仿真激励:(仿真激励文件 pc_sim.v)
产生激励波形:

输入输出波形:(显示为 10 进制数)

位拼 位拼接器 Concat 将输入源 In1(n 位),In2(m 位)拼接合成为 Out(n+m 位,且 In1 在高位部分,In2 在低位部分) module Concat
接器 输入:In1(n 位),In2(m 位) (In1, In2, Out);
输出:Out(n+m 位) parameter
n=4,m=28;
示例文件:Concat.v
Concat endmodule
n In1
Out n+m

m In2
仿真激励:(仿真激励文件 concat_sim.v)
仿真两种情形(实例化两个模块,输出分别为 Out0,Out1)1)n=4,m=28;2)n=1,m=1
产生激励波形:

输入输出正确波形:(显示为 16 进制数)Out0 拼接 In1 的 4 位,In2 的 28 位,Ou2 拼接 In1(1 位宽),In2(1 位宽),

左移 左移运算器 LeftShift 将 n 位数据左移 x 位(低位补充 0,高位移出)输出 m 位数据 module LeftShift


运算 输入:In(n 位) (In, Out);
器 输出:Out(m 位) parameter
n=32,m=32,x=2;
示例文件:LeftShift.v
LeftShift
endmodule
n In Out m

仿真激励:(仿真激励文件 leftshift_sim.v)
仿真三种情形(实例化三个模块,输出分别为 Out1,Out2,Out3):1)n=32,m=32,x=2;2)n=26,m=28,x=2;3)n=26,m=29,x=3
产生激励波形:

输入输出正确波形:(显示为 16 进制数)
引 控制 控制器 Controller 引用主控制器 Mainctr 以及 ALU 控制器 ALUControl 实现对指令的操作码和功能码译码产生控制信号 module Controller
用 器 输入:OpCode(6 位),Funct(6 位) (OpCode, Funct,
子 输出:J, B, RegDst, RegWr, ALUSrc, MemWr, Mem2Reg, ALUCtr(4 位) J, B, RegDst,
RegWr, ALUSrc,
模 示例文件:Controller.v
MemWr,
块 Controller
Mem2Reg,
Mainctr ALUCtr);
J
B
endmodule
RegDst
RegWr
6 OpCode ALUSrc
MemWr
Mem2Reg
ALUControl

ALUOp 2 ALUOp ALUCtr 4


6 Funct

已知主控制器 Mainctr 以及 ALU 控制器 ALUControl 定义如下:


MainCtr (OpCode, J, B, RegDst, RegWr, ALUSrc, MemWr, Mem2Reg, ALUOp);(作为单独的文件存储)
ALUControl (ALUOp, Funct, ALUCtr); (作为单独的文件存储)
仿真激励:(仿真激励文件 controller_sim.v)
产生激励波形:
输入输出波形:(显示为 16 进制)

3选1 n 位 3 选 1 多路复用器 Mux3_1 基于 n 位 2 选 1 多路复用器构建 module Mux3_1


多路 输入:In1(n 位),In2(n 位),In3(n 位), sel(2 位) (In1, In2, In3, sel,
复用 输出:Out(n 位) Out);
parameter n=32;
器 示例文件:Mux3_1.v
Mux3_1 endmodule
In1 Mux2_1
n In1 Mux2_1
Out n In1
In2 Out
In2 Sel Out n
n
n In2 Sel
In3 0
1
Sel
2

功能表:
Sel Out
00 In1
01 In2
1x In3
已知 n 位 2 选 1 多路复用器定义如下:
Mux2_1 (In1, In2, sel, Out); (作为单独的文件存储 Mux2_1.v)
仿真激励:(仿真激励文件 mux3_1_sim.v)
产生激励波形:

输入输出波形:(显示为 16 进制)
简单 4 Mux3_1 module
n
指令 In1 MIPSCPU
In1 Mux2_1 n=32

Adder Out n n In1 (Clk,Reset);
Mux2_1
MIPS n In2 n=32 n Out n In1
In1
Out
微处 Adder Out
In2
In2 Sel Out n
n n endmodule
理器 In2 n=32 n In2 Sel
n In3
[31:28] Concat 0
1
Sel
n In1 2
n=4, Out n+m
m=28
m In2 LeftShift Out
n In m
n=32,m=32,x=2
[25:0]
In LeftShift Out m n In1
n
n=26,m=28,x=2 Mux2_1
Out n
n=32
PC [25:21] 32 DataIn In2 Sel
n
n D Q n [20:16]
Clk n=32 5 RsAddr RsData 32 32 In1
Clk n In1
Reset Reset 5 RtAddr Res 32
Mux2_1 ALU
Out n 5 RtData 32 n In1
WrAddr Zero
[15:11] n=5 Mux2_1 ALUCtr
Sel RegWR Out n 32 In2
n In2 n=32
Clk RegFile n In2 Sel
[15:0]
[6:2] SignedExtend
n Addr Instr n In n=16,m=32Out m
n=5 Concat
Clk InstrROM Controller n In1
Mainctr m DataIn n=5,m=32
n=1, Out n+m [6:2]
J m=1 n Addr m
DataOut
B In2
m MemWR
RegDst Clk DataRAM
RegWr
[31:26]
6 OpCode ALUSrc
MemWr
Mem2Reg
ALUControl

ALUOp 2 ALUOp ALUCtr 4


[5:0]
6 Funct
模块名 MIPSCPU
输入:Clk,Reset
示例文件:MIPSCPU.v (此文件实例化 InstrROM 时,输入引脚 Clk 修改为~Clk
已知子模块列表如下,所有子模块都提供对应文件,各模块可配置参数如图中模块内标注
模块定义 文件名
module InstrROM (Addr, Clk, Instr); InstrROM.v
module RegFile (RsAddr, RtAddr, WrAddr, DataIn, RegWr,Clk, RsData, RtData); RegFile.v
module ALU (In1, In2, ALUCtr, Res, Zero); ALU.v
module DataRAM(Addr, DataIn, MemWR, Clk, DataOut); DataRAM.v
module Controller (OpCode, Funct, J, B, RegDst, RegWr, ALUSrc, MemWr, Mem2Reg, ALUCtr); Controller.v
module MainCtr (OpCode, J, B, RegDst, RegWr, ALUSrc, MemWr, Mem2Reg, ALUOp); MainCtr.v
module ALUControl (ALUOp, Funct, ALUCtr); ALUControl.v
module PC(D, Clk, Reset, Q); PC.v
module Adder (In1,In2,Out); Adder.v
module Mux3_1 (In1, In2,In3, sel, Out); Mux3_1.v
module Mux2_1 (In1, In2, sel, Out) Mux2_1.v
module Concat (In1, In2, Out); Concat.v
module LeftShift (In, Out); LeftShift.v
module SignedExtend (In, Out); SignedExtend.v

仿真激励波形如下图:总仿真时长为 230ns,时钟周期 10ns (仿真激励文件 MIPSCPU_sim.v)

InstrROM 从地址 0 开始的连续 11 个存储单元存放机器指令如文件 test_readmemh.coe 文件,test_readmemh.coe 文件内容如下:


00432020
8c440004
ac420008
00831022
00831025
00831024
0083102a
10830001
08000000
8c620000
08000000
对应汇编指令如下:
main:
add $4,$2,$3
lw $4,4($2)
sw $2,8($2)
sub $2,$4,$3
or $2,$4,$3
and $2,$4,$3
slt $2,$4,$3
beq $4,$3,exit
j main
exit: lw $2,0($3)
j main
RegFile 以及 DataRAM 前 32 个存储单元存储的初始值为单元地址*4
输入输出波形:抽取模块和模块之间连接的信号显示,显示为 16 进制
Asyn 4 Mux3_1
n In1
c In1 Mux2_1 n=32
Adder Out
MIPS n n In1 Mux2_1
CPU n In2 n=32 n Out n In1
In1
In2 Out
Adder Out In2 Sel Out n
n n
In2 n=32 n In2 Sel
n In3
[31:28] Concat 0
1
Sel
n In1 2
n=4, Out n+m
m=28
m In2 LeftShift Out
n In m
n=32,m=32,x=2
[25:0]
In LeftShift Out m n In1
n
n=26,m=28,x=2 Mux2_1
Out n
n=32
PC [25:21] 32 DataIn In2 Sel
n
n D Q n [20:16]
5 RsAddr RsData 32 32 In1
Clk Clk n=32
n In1 Res 32
Reset Reset 5 RtAddr
Mux2_1 ALU
Out n 5 RtData 32 n In1
WrAddr Zero
[15:11] n=5 Mux2_1 ALUCtr
Sel RegWR Out n 32 In2
n In2 n=32
AsyncRegFile n In2 Sel
[15:0]
[6:2] SignedExtend
n Addr Instr n In n=16,m=32Out m
n=5 Concat
AsyncROM SyncController n In1
SyncMainctr m DataIn n=5,m=32
n=1, Out n+m [6:2]
J m=1 n Addr m
DataOut
B In2
m MemWR
RegDst
AsyncRAM
RegWr
[31:26]
6 OpCode ALUSrc
MemWr
Mem2Reg
ALUControl

ALUOp 2 ALUOp ALUCtr 4


[5:0]
6 Funct

模块名 AsyncMIPSCPU
输入:Clk,Reset
示例文件:AsyncMIPSCPU.v
已知子模块列表如下,所有子模块都提供对应文件,各模块可配置参数如图中模块内标注
模块定义 文件名
module AsyncROM (Addr, Instr); AsyncROM.v
module AsyncRegFile (RsAddr, RtAddr, WrAddr, DataIn, RegWr, RsData, RtData); AsyncRegFile.v
module ALU (In1, In2, ALUCtr, Res, Zero); ALU.v
module AsyncRAM(Addr, DataIn, MemWR, DataOut); AsyncRAM.v
module SyncController (OpCode, Funct, J, B, RegDst, RegWr, ALUSrc, MemWr, Mem2Reg, ALUCtr); SyncController.v
module SyncMainCtr (OpCode, J, B, RegDst, RegWr, ALUSrc, MemWr, Mem2Reg, ALUOp); SyncMainCtr.v
module ALUControl (ALUOp, Funct, ALUCtr); ALUControl.v
module PC(D, Clk, Reset, Q); PC.v
module Adder (In1, In2, Out); Adder.v
module Mux3_1 (In1, In2, In3, sel, Out); Mux3_1.v
module Mux2_1 (In1, In2, sel, Out) Mux2_1.v
module Concat (In1, In2, Out); Concat.v
module LeftShift (In, Out); LeftShift.v
module SignedExtend (In, Out); SignedExtend.v

仿真激励波形如下图:总仿真时长为 230ns,时钟周期 10ns (仿真激励文件 AsyncMIPSCPU_sim.v)

InstrROM 从地址 0 开始的连续 11 个存储单元存放机器指令如文件 test_readmemh.coe 文件,test_readmemh.coe 文件内容如下:


00432020
8c440004
ac420008
00831022
00831025
00831024
0083102a
10830001
08000000
8c620000
08000000
对应汇编指令如下:
main:
add $4,$2,$3
lw $4,4($2)
sw $2,8($2)
sub $2,$4,$3
or $2,$4,$3
and $2,$4,$3
slt $2,$4,$3
beq $4,$3,exit
j main
exit: lw $2,0($3)
j main
RegFile 以及 DataRAM 前 32 个存储单元存储的初始值为单元地址*4
输入输出波形:

You might also like