自己开发网站怎么盈利,项目从立项到施工的程序,张家口网站建设zjktao,搭建论坛网站使用的系统0 核心思想
根据指令功能#xff0c;分析出需求#xff0c;从而得出需要的部件、控制信号以及其他设计。
1. 针对的指令
取指阶段#xff0c;针对所有指令#xff0c;任何指令都需要进行取指。
2 功能#xff08;需求#xff09;分析
CPU的内部采用的是字节编址分析出需求从而得出需要的部件、控制信号以及其他设计。
1. 针对的指令
取指阶段针对所有指令任何指令都需要进行取指。
2 功能需求分析
CPU的内部采用的是字节编址每次取指之后都进行PC 4。
需要执行的操作是
取指令M[PC]更新PCPC - PC 4
3 需要的部件
PC寄存器加法器指令存储器ROM 4 控制线控制信号
4.1 自身必须
clk时钟信号用于同步reset复位信号清零 clear
问题PC更新是上升沿还是下降沿
答这取决于设计。
4.2 来源外部
无
5 数据线
数据线存储的就是ROM的地址由于MIPS内部都是32位运算所以PC寄存器必须是32位外部的ROM不一定是32位完全可以小于32位只需要截断PC高位即可
特别注意 此处我们PC使用的是字节编址的地址值而ROM使用的是字编址的地址值一个地址代表了一条32位指令因此除了PC高位截断最低两位也要截断根据字节对齐原则PC的最低两位必然是00。
6 地址线
无
7 注意点
字节编址的PC值与字编址的ROM地址值要对应去掉最低2位对于数据输入端未来可能有多个来源还会增加控制信号以及多个可选择的数据以后再增加即可。注意模块的独立性
8 错误的代码模块功能混杂了
timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2020/11/12 20:31:59
// Design Name:
// Module Name: pc_1
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//module pc_1(input clk,input rst_n,input [31:0] pcNew, // The PC value from outsideoutput [31:0] pcOld);reg [31:0] pc 0;
assign pcOld pc;
assign pcNew pcOld;// Update PC register
always (posedge clk)
beginif(rst_n 1) // Xilinx 官方推荐reset 高电平有效beginpc 0;endelsebeginpc pcNew 4;end
endendmodule
来看看这个好像没什么错误的代码…… 看起来没什么错误呀
但是我们仿真一看
module tb_pc_1;// pc_1 Parameters
parameter PERIOD 10;// pc_1 Inputs
reg clk 0 ;
reg rst_n 1 ;
reg [31:0] pcNew 0 ;// pc_1 Outputs
wire [31:0] pcOld ;initial
beginforever #(PERIOD/2) clk~clk;
endinitial
begin#(PERIOD*2) rst_n 0;
endpc_1 u_pc_1 (.clk ( clk ),.rst_n ( rst_n ),.pcNew ( pcNew [31:0] ),.pcOld ( pcOld [31:0] )
);endmodule尴尬了那么问题在哪里?
关注x这说明可能
没有输入这个信号这显然不可能信号冲突了0和1一起输入导致变成x
这里我们看看发生了什么。 蓝色框出来的是内部蓝色外部是外部信号。
很明显……我们的4应该在外部执行而不是内部……内部的4和外部的0撞一起了。
总结 模块独立性非常重要外部就是外部内部就是内部功能不要混杂在一起……
9 正确的代码
pc.v
module pc_1(input clk,input rst_n,input [31:0] pcNew, // The PC value from outside.output [31:0] pcOld);reg [31:0] pc 0;
assign pcOld pc;// Update PC register
always (posedge clk)
beginif(rst_n 1) // Xilinx 官方推荐reset 高电平有效beginpc 0;endelsebeginpc pcNew 4;end
endendmoduleRTL优化结果
测试的时候注意将pcNew和pcOld接一起。 tb_pc.v
module tb_pc_1;// pc_1 Parameters
parameter PERIOD 10;// pc_1 Inputs
reg clk 0 ;
reg rst_n 1 ;
// reg [31:0] pcNew 0 ;// pc_1 Outputs
wire [31:0] pcOld ;initial
beginforever #(PERIOD/2) clk~clk;
endinitial
begin#(PERIOD*2) rst_n 0;
endpc_1 u_pc_1 (.clk ( clk ),.rst_n ( rst_n ),.pcNew ( pcOld [31:0] ),.pcOld ( pcOld [31:0] )
);这次就对啦
10 后续的改进预告
后续PC的值可能不止是4还可能来自于j类指令或者b类因此真正输入的pc的pcNew需要从不同的值中选出一个需要多个跳转值的输入需要正确的选择信号这些都是pc模块可以增加的东西后续有需要的时候再增加。
我们期待的是
pc寄存器本身是独立的pc的输入是可选的二者是分开的先用其他方式选择好输入的数据再输入到pc中更新再输出这几部分是相对独立的尽管它们在一个模块中
图示如下 红框内部是内部结构外部是外部输入数据包括
4个可能的pc输入情况1个选择信号1个pc输出信号