Quartus 平台 FPGA 片内 RAM 使用

这篇具有很好参考价值的文章主要介绍了Quartus 平台 FPGA 片内 RAM 使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Quartus 平台 FPGA 片内 RAM 使用

本文将以 Quartus 自带的 RAM:2-PORT 为例,介绍 EP4CE6E22C8 On Chip Memory 的使用

一、在 IP Catalog 搜索 RAM

位于 On Chip Memory 下有两个 RAM IP 核
分别是单端口 RAM 和双端口 RAM:
单端口RAM只有一组地址线,这组地址线控制着写数据端口和读数据端口,
而双端口RAM具有两组地址线,这两组地址线分别控制着写数据端口和读数据端口,
双端口 RAM 可以帮助我们更容易地实现的同时读写和双缓存(个人暂时的理解
Quartus 平台 FPGA 片内 RAM 使用
这里双击打开 RAM:2-PORT

二、配置

(1)设置双地址线
Quartus 平台 FPGA 片内 RAM 使用
(2)根据需求设置 memory 大小以及数据总线宽度
Quartus 平台 FPGA 片内 RAM 使用
(3)时钟线的分配
将输入输出 clock 给入不同的时钟,可以实现写入读取速度不对等的应用(个人暂时的理解
Quartus 平台 FPGA 片内 RAM 使用
(4)时钟使能、异步清除功能的开关
Quartus 平台 FPGA 片内 RAM 使用
(5)对相同地址同时读写时,数据输出的状态
Quartus 平台 FPGA 片内 RAM 使用
Quartus 平台 FPGA 片内 RAM 使用
(6)RAM 内容初始化
Quartus 平台 FPGA 片内 RAM 使用
(7)Finish 生成模块

三、读写测试 逻辑实现

(1)端口 a 作为写端口,端口 b 作为读端口
(2)一个时钟周期可以完成一次读操作或者写操作
下面代码实现的是,周期性的对同一地址写入同上一个数据 + 1 的值,然后周期性的读出该地址的数据,串口周期性的发送该数据:文章来源地址https://www.toymoban.com/news/detail-435469.html

module FPGA_RAM (
	input clk,
	input rst_n,
	input uart_rx,
	output uart_tx
);

reg uart_send_valid;
wire uart_send_ready;

reg [31:0] counter = 32'd0;
parameter state_wait = 4'd0;
parameter state_send = 4'd1;
reg [3:0] state = state_wait;
reg [7:0] data_len = 8'd0;

always@(posedge clk_200M or negedge rst_n) begin
	if(!rst_n) begin
		uart_send_valid <= 0;
		counter <= 32'd0;
		state <= state_wait;
		data_len <= 8'd0;
	end
	else begin
		case (state)
			state_wait: begin
				counter <= counter + 32'd1;
				if(counter >= 32'd4999999) begin
					counter <= 32'd0;
					state <= state_send;
				end
			end
			state_send: begin
				if(uart_send_ready && data_len <= 8'd0) begin
					uart_send_valid <= 1;
					data_len <= data_len + 8'd1;
				end
				else begin
					uart_send_valid <= 0;
					data_len <= 8'd0;
					state <= state_wait;
				end
			end
		endcase
	end
end

uart uart0 (
	.clk_clk                 (clk_200M),                 // clk.clk
	.reset_reset_n           (rst_n),           // reset.reset_n
//	.rs232_0_from_uart_ready (<connected-to-rs232_0_from_uart_ready>), // rs232_0_avalon_data_receive_source.ready
//	.rs232_0_from_uart_data  (<connected-to-rs232_0_from_uart_data>),  // .data
//	.rs232_0_from_uart_error (<connected-to-rs232_0_from_uart_error>), // .error
//	.rs232_0_from_uart_valid (<connected-to-rs232_0_from_uart_valid>), // .valid
	.rs232_0_to_uart_data    (data_read),    //  rs232_0_avalon_data_transmit_sink.data
//	.rs232_0_to_uart_error   (<connected-to-rs232_0_to_uart_error>),   // .error
	.rs232_0_to_uart_valid   (uart_send_valid),   // .valid
	.rs232_0_to_uart_ready   (uart_send_ready),   // .ready
	.rs232_0_UART_RXD        (uart_rx),        // rs232_0_external_interface.RXD
	.rs232_0_UART_TXD        (uart_tx)         // .TXD
);

reg [7:0] data_write = 8'd00;
reg [7:0] address_write = 8'h00;
reg write_en = 0;
wire [7:0] data_read;
reg [7:0] address_read = 8'h00;
reg read_en = 0;

reg [31:0] counter_ram = 32'd0;
parameter state_ram_wait = 4'd0;
parameter state_ram_write = 4'd1;
parameter state_ram_wait_read = 4'd2;
parameter state_ram_read = 4'd3;
reg [3:0] state_ram = state_ram_wait;
reg [7:0] state_ram_delay = 8'd0;
parameter delay = 8'd0;

always@(posedge clk_200M or negedge rst_n) begin
	if(!rst_n) begin
		data_write <= 8'd0;
		write_en <= 0;
		read_en <= 0;
		counter_ram <= 32'd0;
		state_ram <= state_ram_wait;
	end
	else begin
		case (state_ram)
			state_ram_wait: begin
				counter_ram <= counter_ram + 32'd1;
				if(counter_ram >= 32'd49999999) begin
					counter_ram <= 32'd0;
					state_ram <= state_ram_write;
				end
			end
			state_ram_write: begin
				if(write_en) begin
					write_en <= 0;
					state_ram <= state_ram_wait_read;
					data_write <= data_write + 8'd1;
				end
				else begin
					write_en <= 1;
				end
			end
			state_ram_wait_read: begin
				counter_ram <= counter_ram + 32'd1;
				if(counter_ram >= 32'd49999999) begin
					counter_ram <= 32'd0;
					state_ram <= state_ram_read;
				end
			end
			state_ram_read: begin
				if(read_en) begin
					read_en <= 0;
					state_ram <= state_ram_wait;
				end
				else begin
					read_en <= 1;
				end
			end
		endcase
	end
end

ram ram0 (
	.data (data_write),
	.wraddress (address_write),
	.wren (write_en),
	.rdaddress (address_read),
	.rden (read_en),
	.clock (clk_200M),
	.q (data_read)
);

wire clk_200M;

pll pll0 (
	.inclk0 (clk),
	.c0 (clk_200M)
);

endmodule

到了这里,关于Quartus 平台 FPGA 片内 RAM 使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • FPGA入门系列12--RAM的使用

    文章简介 本系列文章主要针对FPGA初学者编写,包括FPGA的模块书写、基础语法、状态机、RAM、UART、SPI、VGA、以及功能验证等。将每一个知识点作为一个章节进行讲解,旨在更快速的提升初学者在FPGA开发方面的能力,每一个章节中都有针对性的代码书写以及代码的讲解,可作

    2024年02月06日
    浏览(40)
  • FPGA入门系列12--RAM的使用1

    文章简介 本系列文章主要针对FPGA初学者编写,包括FPGA的模块书写、基础语法、状态机、RAM、UART、SPI、VGA、以及功能验证等。将每一个知识点作为一个章节进行讲解,旨在更快速的提升初学者在FPGA开发方面的能力,每一个章节中都有针对性的代码书写以及代码的讲解,可作

    2024年02月04日
    浏览(26)
  • ZYNQ之FPGA 片内ROM读写测试实验

    FPGA本身是SRAM架构的,断电之后程序就会消失,那么如何利用FPGA实现一个ROM呢,我们可以利用FPGA内部的RAM资源实现ROM,但这不是真正意义上的ROM,而是每次上电都会把初始化的值先写入RAM。Vivado软件中提供了ROM的IP核 , 我们只需通过IP核例化一个ROM,根据ROM的读时序来读取R

    2024年02月07日
    浏览(32)
  • FPGA原理与结构——RAM IP核的使用与测试

    系列文章目录:FPGA原理与结构(0)——目录与传送门 目录 一、前言 二、RAM IP核定制 1、RAM IP核 step1 打开vivado工程,点击左侧栏中的IP Catalog step2 在搜索栏搜索RAM,找到Block Memory Generator IP核: 2、IP核定制 step3 Baisc界面定制 step4 端口定制 step5 Other Options step6 Summary 3、IP核例化

    2024年02月11日
    浏览(27)
  • FPGA学习笔记 1 -- Quartus软件的使用

    打开软件→新建工程→设计输入(verilog代码)→配置工程(I/O引脚复用)→分析与综合(对设计输入进行分析,检查是否有语法错误)→分配引脚(根据原理图分配)→编译工程(生成sof文件)→下载程序 或 找到工程路劲下的.qsf文件,直接添加或修改引脚 或 创建一个tcl文

    2024年02月12日
    浏览(28)
  • 【FPGA】Quartus18.1的安装以及使用

    https://www.intel.com/content/www/us/en/software-kit/665990/intel-quartus-prime-lite-edition-design-software-version-18-1-for-windows.html 一路next 建立一个 全英文 的文件夹,修改安装路径,点击next即可 软件在此 把license_all.bat复制到安装路径下的 quartusbin64 中,以我的安装路径为例。 安装路径: D:SoftW

    2024年02月04日
    浏览(41)
  • 使用Quartus II做FPGA设计遭遇的一些问题

    问题1:Error:Width mismatch in pin_name – source is 。。。 ** 问题2:Error (275028): Bus name allowed only on bus line – pin “data[7…0]” Error (275029): Incorrect connector style at port “test_data[7…0]” for symbol “inst” of type top

    2024年02月11日
    浏览(42)
  • FPGA之Quartus II 自带的IP核的使用(IP核仅自己学习,未完成)

    1、锁相环:       锁相环是对接收到的信号进行处理,并从其中提取某个时钟的相位信息。锁相环由鉴相器、环路滤波器和压控振荡器组成。  锁相环原理图 鉴相器:         用来鉴别输入信号输入信号Ui与输出信号输出信号Uo之间的相位差相位差,并输出误差电压Ud。Ud

    2023年04月09日
    浏览(31)
  • 基于Quartus Prime平台FPGA关于VGA显示的模块化设计:VGA八种单色屏1s切换显示、横条纹、竖条纹、棋盘格显示、显示模式按键可调、数码管显示单色屏序号

    VGA(Video Graphics Array)是一种显示接口标准,它最初由IBM于1987年推出。VGA协议定义了计算机视频输出信号的格式和特性。它主要用于连接计算机和显示器之间的传输,实现图像和视频的显示。 VGA协议支持最高分辨率为640x480像素,色彩深度为16位色(即65,536种颜色)。它使用模

    2024年02月03日
    浏览(40)
  • FPGA原理与结构(8)——块RAM(Block RAM,BRAM)

    系列文章目录:FPGA原理与结构(0)——目录与传送门         大家对于RAM应该并不陌生,RAM就是一张可读可写的存储表,它经常被拿来与ROM进行对比,相比之下,ROM只可读。而在FPGA中,RAM一般可以分成两种,一种是使用LUT资源组成的分布式RAM(DRAM),另一种就是块RAM(B

    2024年02月08日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包