Verilog练习(1)——ram读写测试

1、明确设计目标,是要将64个八位信号写到ram中,然后倒序读出
在这里插入图片描述
2、测试代码主要分三块:ram模块、ram读写模块、TB文件

//一个ram
module ip_ram(
	input clk,
	input en,
	input wr_en,
	input [5:0] addr,
	input [7:0] data,
	output reg [7:0] q
);
 
reg [7:0] ram[63:0];
 
always@(posedge clk)begin		//write to ram
	if(wr_en & en)begin
		ram[addr]<=data;
	end
end
 
always@(posedge clk)begin		//read from ram
	if(!wr_en & en)begin
		q<=ram[addr];
	end
	else begin
		q<=8'hxx;		
	end
end
endmodule
 
//ram读写控制
module ram(
	input clk,
	input rst_n
);

wire en;
wire wr_en;
wire re_en;

reg [5:0] we_addr;
reg [7:0] wr_data;
wire [7:0] re_data;
reg [6:0] cnt;

assign wr_en=(cnt>=7'd0) && (cnt<=7'd63)? 1'b1:1'b0;		//decide what en
assign re_en=(cnt>=7'd64) && (cnt<=7'd127)? 1'b1:1'b0;
assign en=wr_en | re_en;

always@(posedge clk or negedge rst_n)begin	//through cnt to decide wr or re
	if(!rst_n)
		cnt<=7'd0;
	else if(cnt==7'd127)
		cnt<=7'd0;
	else cnt<=cnt+1'b1;
end

always@(posedge clk or negedge rst_n)begin	//wr data to ram
	if(!rst_n)
		wr_data<=8'd0;
	else if(wr_en & en)
		wr_data<=wr_data+1'b1;
	else wr_data<=8'd0;
end

always@(posedge clk or negedge rst_n)begin	//we_addr to decide write or read where
	if(!rst_n)
		we_addr<=6'd0;
	else if(wr_en & en)begin
		if(we_addr==6'd63)
			we_addr<=6'd63;
		else we_addr<=we_addr+1'b1;
	end
	else if(re_en & en)begin
		we_addr<=we_addr-1'b1;
	end
end

ip_ram	u_ip_ram(
	.clk	(clk),
	.en	(en),
	.wr_en	(wr_en),
	.addr		(we_addr),
	.data		(wr_data),
	.q			(re_data)
);
endmodule

//tb测试文件
`timescale 1ns/1ps

module tb();

reg clk;
reg rst_n;

initial begin
	clk=1'b0;
	rst_n=1'b0;
	#50
	rst_n=1'b1;
end

always #10 clk=~clk;

ram u_ram(
	.clk	(clk),
	.rst_n	(rst_n)
);

endmodule

3、综合出来的电路图如下
在这里插入图片描述
在这里插入图片描述
4、modelsim测试结果
在这里插入图片描述
在这里插入图片描述

  • 7
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Verilog是一种硬件描述语言,用于设计和建模数字电路。在Verilog中,可以使用内置的RAM(随机访问存储器)模块来实现对RAM读写操作。 首先,我们可以使用`reg`或`wire`类型的变量声明RAM的输入和输出端口。例如,`input [7:0] addr`表示8位地址端口,`input [7:0] data_in`表示8位数据输入端口,`output [7:0] data_out`表示8位数据输出端口。 接下来,在模块的主体中,可以使用`reg`或`wire`类型的变量定义内部存储器数组。例如,`reg [7:0] ram[0:255]`定义了一个256个8位元素的RAM。内部存储器的大小和位宽可以根据需求进行调整。 然后,可以使用`always`块来实现对RAM读写操作。例如,`always @(posedge clk) begin`表示在时钟上升沿触发时执行以下操作。`posedge clk`根据需要进行调整,以匹配设计中使用的时钟信号。 在`always`块内部,使用`case`语句根据地址进行选择性操作。例如,`case (addr)`表示根据地址进行操作。可以使用`case`语句的多个子分支来实现对不同地址位置的读写操作。 在读操作中,根据给定地址从RAM中读取数据,并将其分配给输出端口。例如,`data_out <= ram[addr]`表示将地址`addr`处的RAM数据赋给输出端口。 在写操作中,根据给定地址将输入数据写入RAM中。例如,`ram[addr] <= data_in`表示将输入数据赋给地址`addr`处的RAM。 最后,需要确保在模块中包含时钟信号的定义,并在仿真或综合过程中正确地连接模块的输入和输出端口。 这是对Verilog中使用RAM进行读写操作的基本概述。实际的实现可能会根据具体需求进行调整和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

树叶~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值