【计算机组成原理】实验三 CPU 部件实现之 PC 和半导体存储器 RAM

1. 使用 Verilog 完成程序计数器 PC 的设计,要求: PC 为 8 位计数器

module PC(clk,rst,y);
input clk,rst;
output y;
reg[7:0] y;
initial y = 0;
always@(posedge clk or negedge rst)begin
    if(!rst)
        y = 0;
    else
        y = y + 1;
end


endmodule

module test(
    );
reg clk,rst;
wire[7:0] y;
PC f(.clk(clk),.rst(rst),.y(y));
initial begin
   clk = 0;rst=1;
   #2700 rst = 0;
   #10 rst = 1;
   #300 rst = 0;
   #20 rst = 1;
   #1000 $stop;
end
always #5 clk = ~clk;
endmodule

在这里插入图片描述
在这里插入图片描述

2. 使用 Verilog 完成数据存储器的设计,并编写测试仿真文件验证其正确性。

要求 存储字长 16 位,存储容量 1K 字节; 一根读写控制信号线控制读写,低电平有效。

这下面写成了寄存器堆了

module Member(WE,data_write,address,data_read);
input WE;
input[15:0] data_write;
input[8:0] address;
output data_read;
reg[15:0] data_read;

reg[15:0] unit[512:0];//有512个16位寄存器
integer i;

initial begin
    for(i=0;i<512;i=i+1)
        unit[i] = 2*i + 1;
end
always@(*)begin
    if(WE == 1) // 高电平为读信号
        data_read = unit[address];
    else
        unit[address] = data_write;
end
endmodule
module test(
    );
reg WE;
reg[15:0]data_write;
reg[8:0]address;
wire[15:0]data_read;
Member f(.WE(WE),.data_write(data_write),
.address(address),.data_read(data_read));

initial begin
    WE = 1;address = 0;data_write = 3;
    #3000 $stop; 
end
always begin
    #100 WE = 0;
    #10 WE = 1;
end
always begin
    #10 address = address + 1;
        data_write = data_write + 2;
end

endmodule

在这里插入图片描述
在这里插入图片描述
基于Vivado的存储器设计实验

生成.coe文件:

创建记事本,记事本内容为如下代码,命名为Test_Mem.coe,保存的路径最好不要有中文,不然IP核关联的时候会出现迷之报错。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
unsigned short usrand(void) {
    return (
        (((unsigned short)rand() << 8) & 0xFF00u)
        | (((unsigned short)rand()) & 0x00FFu));
}
int i;
unsigned short us;
int main() {
    srand(time(NULL));
    for (i = 0; i < 511; i++) {
        us = usrand();
        printf("%04x,", us);
    }
    us = usrand();
    printf("%04x;", us);
    return 0;
}

在这里插入图片描述
在这里插入图片描述
配置IP核:

在搜索栏输入block,能快速找到实验要求的IP核型号

双击下图第三步
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
编写测试模块:

下面只测试读的效果

module test(
    );
reg clk,WE;//时钟信号(时钟上升沿有效)、写控制信号(高电平有效),
reg[15:0]data_write;//写入的数据
reg[8:0]address;//读出和写入的地址
wire[15:0]data_read;//读出的数据

RAM_B f(
    .clka(clk),//时钟信号端口
    .wea(WE),//读写控制信号端口
    .addra(address),//读写地址端口
    .dina(data_write),//要写入数据的端口
    .douta(data_read)//读数据的端口
    );
initial begin
    WE = 0;//保证一直是读
    clk = 0;//时钟信号一开始设置低电平
    address = 0;//地址从0开始
    data_write = 0;
    #5 clk = 1;
    #3000 $stop; 
end
always #5 clk = ~clk;
always begin
    #10 address = address + 1;
end

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值