美文网首页程序员
PC取指令的demo

PC取指令的demo

作者: XEBY_ec67 | 来源:发表于2019-06-01 09:27 被阅读0次

title: VeriogHDL
date: 2019-05-28 15:20:35
tags: verilog
categories: verilog


PC取指令的demo

PC寄存器

pc_reg.v

module pc_reg(
    input wire clk,//时钟信号
    input wire rst,//复位信号
    output reg[5:0] pc,//指令寄存器
    output reg ce//指令使能信号
);
/*当复位信号有效时,取指令使能信号无效,指令地址复位
//当复位信号无效时,使能信号有效,指令地址加一
*/
always @(posedge clk) begin
if(rst==1'b1)begin
    ce<=1'b0;
    end else begin
    ce<=1'b1;
    end
end

always @(posedge clk)begin
    if(ce==1'b0)begin
        pc<=6'h00;
    end else begin
        pc<=pc+1'b1;
    end;
end;
endmodule;

ROM

rom.v`

module rom(
    input wire ce,//pc_reg的输出,有效时从rom中取
    input wire[5:0] addr,//pc_reg的输出,指令地址
    output reg[31:0] inst//取出的数据
);
    reg[31:0] rom [63:0]//二重指针相当于64行三十二列,每个但地址里存有32bit数据
    initial $readmemh ( "rom.data", rom );//初始化rom中的数据
always@(*)begin
    if(ce==1'b0)begin//使能信号无效时输出0
            inst <=32'h0;
        end else begin 
            inst <=rom[addr];//使能信号有效时输出地址中的数据,异步
            end
        end
endmodule

取指令单元

inst_fetch.v

module inst_fetch(
    input wire clk,
    input wire rst,
    output wire [31:0] inst_o
);
    wire[5:0] pc;//就是一般意义上的连接线,将pc_reg和rom连在一起
    wire rom_ce;
    pc_reg pc_reg0(.clk(clk),.rst(rst),
                    .pc(pc),.ce(rom_ce));
    rom rom0(.ce(rom_ce),.addr(pc),.inst(inst_o));
endmodule

rom数据

rom.data

00000000
01010101
02020202
03030303
04040404
05050505
06060606
07070707
08080808
09090909
0a0a0a0a
0b0b0b0b
0c0c0c0c
0d0d0d0d
0e0e0e0e
0f0f0f0f
10101010
11111111
12121212
13131313
14141414
15151515
16161616
17171717
18181818
19191919
1a1a1a1a
1b1b1b1b
1c1c1c1c
1d1d1d1d
1e1e1e1e
1f1f1f1f
20202020
21212121
22222222
23232323
24242424
25252525
26262626
27272727
28282828
29292929
2a2a2a2a
2b2b2b2b
2c2c2c2c
2d2d2d2d
2e2e2e2e
2f2f2f2f
30303030
31313131
32323232
33333333
34343434
35353535
36363636
37373737
38383838
39393939
3a3a3a3a
3b3b3b3b
3c3c3c3c
3d3d3d3d
3e3e3e3e
3f3f3f3f

34020020
3403ff00
3404ffff

测试单元

module inst_fetch_tb;

  reg     CLOCK_50;
  reg     rst;
  wire[31:0]    inst;
  
       
  initial begin
    CLOCK_50 = 1'b0;//时钟信号
    forever #10 CLOCK_50 = ~CLOCK_50;//十纳秒后反向,周期二十纳秒
  end
      
  initial begin
    rst = 1'b1;//复位信号
    #195 rst= 1'b0;//195ns后失效,ce会在下一个上升沿变化
    #1000 $stop;//1000ns后结束仿真
  end
       
  inst_fetch inst_fetch0(
        .clk(CLOCK_50),
        .rst(rst),
        .inst_o(inst)   
    );

endmodule
1559030063022.png

相关文章

  • PC取指令的demo

    title: VeriogHDLdate: 2019-05-28 15:20:35tags: verilogcat...

  • 简单-CPU的结功能构

    CPU功能:1.控制器功能 取指令 分析指令(指令控制) PC IR 执行指令,发出各种操作命令(操作控制)CU ...

  • 2019-03-28

    1、程序计数器(简称 PC),他存放的是一个指令地址,这个地址指向的是下一条要取的指令; 2、指令寄存器,用于存放...

  • 汇编(二)

    1. bl指令 CPU从何处执行指令是由pc中的内容决定的,我们可以通过改变pc的内容来控制CPU执行目标指令 A...

  • 002--汇编(函数)

    一、bl指令 cpu从何处执行指令是由PC中的内容决定的,我们可以通过改变PC的内容来控制CPU执行目标指令ARM...

  • 《深入浅出计算机组成原理》笔记二

    指令周期 1.Fetch(取得指令),从 PC 寄存器里找到对应的指令地址,根据指令地址从内存里把具体的指令,加载...

  • 常用ADB指令总结

    1 常用Linus文件操作指令: 2 adb相关指令 adb shell指令 adb shell是指从PC进入目标...

  • 你所不知道的cpu分支预测

    CPU执行一条指令的简单流程 取指令 分析指令 执行程序 我们看一下整个流程,A部件进行取指令,把指令交给B部件去...

  • 503 - 3种指令及控制信号

    运算指令的控制信号 加法指令的操作步骤 addu rd, rs, rt① MEM[PC] - 从指令存储器中取回指...

  • 4.状态寄存器&代码还原

    [TOC] 回顾-函数 指令:bl、ret 指令:pc、lr、sp 栈:函数开辟 ​ 存放局部变量、参数,寄存...

网友评论

    本文标题:PC取指令的demo

    本文链接:https://www.haomeiwen.com/subject/aprotctx.html