【Verilog】实验九 存储器设计与IP调用

发布于:2024-12-18 ⋅ 阅读:(14) ⋅ 点赞:(0)

一、实验目的

1. 掌握单端口RAM和ROM原理和设计方法。

2. 掌握单端口RAM和ROM的IP生成和调用方法。

2. 掌握ModelSim和VIVADO工具软件。

3. 掌握基本的测试代码编写和FPGA开发板使用方法。

二、实验环境

1. 装有ModelSim和VIVADO的计算机。

2. Sword实验系统。

三、实验原理

片内存储器分为RAM和ROM两大类。RAM是随机存储器,存储单元的内容可按需随意取出或存入。这种存储器在断电后将丢失所有数据,因此一般用来存储一些短时间内使用的程序和数据。

ROM即只读存储器,是一种只能读出事先存储的数据的存储器,其特性是存入的数据无法改变。也就是说,这种存储器只能读不能写。由于ROM在断电之后数据不会丢失,所以通常用在不需经常变更的电子资料。

四、实验任务

1. 用Verilog HDL设计深度为32、位宽为8 bit的单端口RAM,在Modelsim上仿真测试。

2.用Verilog HDL设计深度为8、位宽为8 bit的ROM。在Modelsim上仿真测试。

top.v

`timescale 1ns / 1ps
module 	 TOP_new(input  wire clk_200MHz_p,          
	             input wire clk_200MHz_n,
						input  wire[15:0]SW,
						
						output wire led_clk,
						output wire led_clrn,
						output wire led_sout,
						output wire LED_PEN
				
						);
wire clk_100mhz;
    clk_wiz_0 	  instance_name   (
								// Clock out ports
									.clk_out1(clk_100mhz),     // output clk_out1
								// Status and control signals
									.reset(1'b0), // input reset
									.locked(),       // output locked
								// Clock in ports
									.clk_in1_p(clk_200MHz_p),    // input clk_in1_p
									.clk_in1_n(clk_200MHz_n)     // input clk_in1_n
								  );					  
wire[31:0]Div;
wire CK;	
	wire[7:0] out;
	ram U1(Div[26],SW[15:11],SW[10],SW[9],SW[7:0],out[7:0]);
	//module ram(clk,addm,cs_n,we_n,din,dout);
	//SW[10]片选--0,SW[9]为1是读,为0是写,SW[7:0]是输入的数据,SW[15:11]是写入的地址
	//dist_mem_gen_1 U3(SW[15:11],SW[7:0],Div[26],SW[9],out);
	//rom U3(out[7:0],Div[26],SW[2:0],SW[3]);
	clk_div       U8(clk_100mhz,1'b0,SW[2],Div,CK);
wire[15:0]LED_DATA;
	LED_P2S 	  #(.DATA_BITS(16),.DATA_COUNT_BITS(4)) 
				  PLED (clk_100mhz,
						1'b0,
						Div[20],
						LED_DATA,
						led_clk,
						led_clrn,
						led_sout,
						LED_PEN
						);					
	assign LED_DATA = {out[0],out[1],out[2],out[3],out[4],out[5],out[6],out[7],1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,Div[26]};
	
endmodule





		


ram.v

module ram(clk,addm,cs_n,we_n,din,dout);
    input clk;
    input [4:0] addm;
    input cs_n,we_n;
    input [7:0] din;
    output [7:0] dout;
    reg [7:0] dout;
    reg [7:0] ram[7:0];
    always@(posedge clk)
        begin
            if(cs_n) dout<=8'bzzzz_zzzz;
            else
                if(we_n) dout<=ram[addm];
                else ram[addm]<=din;
        end
endmodule