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
生成.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