第八章 可综合的Verilog HDL设计实例
----------------------------------------------------------------------------------------------------------------------
8.2.6.地址多路器
ADDR
PC_ADDR[12 : 0]
IR_ADDR[12 : 0]
FETCH
ADDR[12 : 0]
ADDR[12 : 0]
PC_ADDR[12 : 0]
IR_ADDR[12 : 0]
FETCH
地址多路器用于选择输出的地址是PC(程序计数)地址还是数据/端口地址。每个指令周期的前4个时
钟周期用于从ROM中读取指令,输出的应是PC地址。后4个时钟周期用于对RAM或端口的读写,该地址
由指令中给出。地址的选择输出信号由时钟信号的8分频信号fetch提供。
其VerilogHDL 程序见下面的模块:
//------------------------------------------------------------------------------
module adr(addr,fetch,ir_addr,pc_addr);
output [12:0] addr;
input [12:0] ir_addr, pc_addr;
input fetch;
assign addr = fetch? pc_addr : ir_addr;
endmodule
//------------------------------------------------------------------------------
8.2.7.程序计数器
程序计数器用于提供指令地址。以便读取指令,指令按地址顺序存放在存储器中。有两种途径可形成
指令地址:其一是顺序执行的情况,其二是遇到要改变顺序执行程序的情况,例如执行JMP指令后,
需要形成新的指令地址。下面就来详细说明PC地址是如何建立的。
COUNTER
IR_ADDR[12 : 0]
LOAD
CLOCK
RST
PC_ADDR[12 : 0]
PC_ADDR[12 : 0]
IR_ADDR[12 : 0]
LOAD_PC
INC_PC
RESET
复位后,指令指针为零,即每次CPU重新启动将从ROM的零地址开始读取指令并执行。每条指令执行完
需2个时钟,这时pc_addr已被增2,指向下一条指令。(因为每条指令占两个字节。)如果正执行的
指令是跳转语句,这时CPU状态控制器将会输出load_pc信号,通过load口进入程序计数器。程序计数
器(pc_addr)将装入目标地址(ir_addr),而不是增2。
179