当前位置: 首页 > article >正文

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

一、实验目的

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


http://www.kler.cn/a/445882.html

相关文章:

  • 基于字节大模型的论文翻译(含免费源码)
  • ubuntu18.04升级到ubuntu20.04
  • 本地maven项目打包部署到maven远程私库
  • 【STM32 Modbus编程】-作为主设备写入多个线圈和寄存器
  • 时间序列异常值检测方法
  • 学习反射(反射的使用,反射的应用场景)
  • 【论文复现】找出图像中物体的角点
  • 热更新解决方案4——xLua热补丁
  • [react] 优雅解决typescript动态获取redux仓库的类型问题
  • ES倒排索引
  • 全链路触达,Klaviyo 助力跨境电商打造数据驱动的智能化营销体验
  • 区间预测 | MATLAB实现QRDNN深度神经网络分位数回归时间序列区间预测
  • PDF无法打印!怎么办?
  • 数据结构_双向循环链表实战
  • 大数据:HDFS:特性、架构
  • C# 中的闭包
  • 【C++】C++中的lambda函数详解
  • Unity ECS和OOP优劣对比
  • 数据结构泛谈
  • git以及gitee仓库注册创建
  • 38.在 Vue 3 中使用 OpenLayers 导出地图为 PDF
  • C#.net CAD二次开发调试时进行日志记录并输出错误
  • 【Python】【数据分析】深入探索 Python 数据可视化:Plotly 绘图库全面解析
  • 使用LS-DYNA对秸秆进行切削仿真(记录版)
  • 免费开源!推荐一款网页版数据库管理工具!
  • edge_tts 实现实时流式语音播放输出