ZYNQ_project:ram_dual_port

伪双端口ram:写端口:clk_w,en_A,we_A,addr_A,din_A;读端口:clk_r,en_B,addr_B;dout_B.

设计读写模块,写入256个数据,再读出256个数据。

输入时钟100Mhz,输出时钟50Mhz。

多bit数据,高速时钟域到低速时钟域处理。

模块框图:

代码:

module ram_real_wr(input       wire            clk_w       ,input       wire            clk_r       ,input       wire            sys_rst_n   ,output      reg             en_A        ,output      reg             we_A        ,output      wire    [7:0]   addr_A      ,output      wire    [7:0]   din_A       ,output      reg             en_B        ,output      wire    [7:0]   addr_B      
);//  parameterparameter   WR_NUM = 256 ,RD_NUM = 256 ;reg     [7:0]       cnt_w   ; // 用来产生写地�?与写数据�?reg                 flag_wr ;reg                 done    ;reg     [7:0]       cnt_r   ;always @(posedge clk_w or negedge sys_rst_n) beginif(~sys_rst_n) cnt_w <= 8'd0 ;else if(en_A && we_A && (cnt_w == WR_NUM - 1))cnt_w <= 8'd0 ;else if(en_A && we_A)cnt_w <= cnt_w + 1'b1 ;else cnt_w <= cnt_w;endalways @(posedge clk_w or negedge sys_rst_n) beginif(~sys_rst_n) flag_wr <= 1'b1 ;else if(cnt_w == WR_NUM - 2)flag_wr <= 1'b0 ;else flag_wr <= flag_wr ;endalways @(posedge clk_w or negedge sys_rst_n) beginif(~sys_rst_n) en_A <= 1'b0 ; else en_A <= 1'b1 ;endalways @(posedge clk_w or negedge sys_rst_n) beginif(~sys_rst_n) we_A <= 1'b0 ; else we_A <= flag_wr ;endassign  addr_A = (we_A) ? cnt_w : 8'd0 ;assign  din_A  = (we_A) ? cnt_w : 8'd0 ;always @(posedge clk_r or negedge sys_rst_n) beginif(~sys_rst_n)done <= 1'b0 ;else if(en_B && (cnt_r == RD_NUM - 2))done <= 1'b1 ;else done <= done ; endalways @(posedge clk_r or negedge sys_rst_n) beginif(~sys_rst_n) en_B <= 1'b0 ;else if(~done) beginif(~flag_wr)en_B <= 1'b1 ;else en_B <= 1'b0 ;endelseen_B <= 1'b0 ;endalways @(posedge clk_r or negedge sys_rst_n) beginif(~sys_rst_n)cnt_r <= 8'd0 ;else if(en_B && (cnt_r == RD_NUM - 1))cnt_r <= 8'd0 ;else if(en_B)cnt_r <= cnt_r + 1'b1 ;elsecnt_r <= 8'd0 ;endassign addr_B = (en_B) ? cnt_r : 8'd0 ;endmodule
module top(input       wire            sys_clk     ,input       wire            sys_rst_n   ,output      wire    [7:0]   data_out    
);// 例化间连�?wire  			clk_100Mhz  ;wire  			clk_50Mhz   ;wire  			locked 		;wire  			rst_n 		;wire            en_A        ;wire            we_A        ;wire    [7:0]   addr_A      ;wire    [7:0]   din_A       ;wire            en_B        ;wire	[7:0]	addr_B      ;
pll_clk pll_clk_inst(.resetn					( sys_rst_n 	) ,.clk_in1				( sys_clk   	) ,.clk_out1				( clk_100Mhz	) ,.clk_out2				( clk_50Mhz 	) ,.locked					( locked		) );assign 	rst_n = sys_rst_n && locked ;ram_real_wr ram_real_wr_inst(.clk_w       			( clk_100Mhz	) ,.clk_r       			( clk_50Mhz 	) ,.sys_rst_n   			( rst_n     	) ,.en_A        			( en_A  		) ,.we_A        			( we_A  		) ,.addr_A      			( addr_A		) ,.din_A       			( din_A 		) ,.en_B        			( en_B  		) ,.addr_B     			( addr_B		)  
); blk_mem_gen_0 blk_mem_gen_0_inst(.clka                   ( clk_100Mhz 	) , .ena                    ( en_A  		) , .wea                    ( we_A  		) , .addra                  ( addr_A		) , .dina                   ( din_A 		) , .clkb                   ( clk_50Mhz 	) , .enb                    ( en_B   		) , .addrb                  ( addr_B 		) , .doutb                  ( data_out 		) 
);endmodule

改进一下,使得只读出偶数地址内的数据:

module ram_real_wr(input       wire            clk_w       ,input       wire            clk_r       ,input       wire            sys_rst_n   ,output      reg             en_A        ,output      reg             we_A        ,output      wire    [7:0]   addr_A      ,output      wire    [7:0]   din_A       ,output      reg             en_B        ,output      wire    [7:0]   addr_B      
);//  parameterparameter   WR_NUM = 256 ,RD_NUM = 256 ;reg     [7:0]       cnt_w   ; // 用来产生写地�?与写数据�?reg                 flag_wr ;
//    reg                 done    ;reg     [7:0]       cnt_r   ;always @(posedge clk_w or negedge sys_rst_n) beginif(~sys_rst_n) cnt_w <= 8'd0 ;else if(en_A && we_A && (cnt_w == WR_NUM - 1))cnt_w <= 8'd0 ;else if(en_A && we_A)cnt_w <= cnt_w + 1'b1 ;else cnt_w <= cnt_w;endalways @(posedge clk_w or negedge sys_rst_n) beginif(~sys_rst_n) flag_wr <= 1'b1 ;else if(cnt_w == WR_NUM - 2)flag_wr <= 1'b0 ;else flag_wr <= flag_wr ;endalways @(posedge clk_w or negedge sys_rst_n) beginif(~sys_rst_n) en_A <= 1'b0 ; else en_A <= 1'b1 ;endalways @(posedge clk_w or negedge sys_rst_n) beginif(~sys_rst_n) we_A <= 1'b0 ; else if(cnt_w == WR_NUM - 2)we_A <= 1'b0 ;else we_A <= flag_wr ;endassign  addr_A = (we_A) ? cnt_w : 8'd0 ;assign  din_A  = (we_A) ? cnt_w : 8'd0 ;// always @(posedge clk_r or negedge sys_rst_n) begin//     if(~sys_rst_n)//         done <= 1'b0 ;//     else if(en_B && (cnt_r == RD_NUM - 2))//         done <= 1'b1 ;//     else //         done <= done ; // end// always @(posedge clk_r or negedge sys_rst_n) begin//     if(~sys_rst_n) //         en_B <= 1'b0 ;//     else if(~done) begin//         if(~flag_wr)//             en_B <= 1'b1 ;//         else //             en_B <= 1'b0 ;//     end//     else//         en_B <= 1'b0 ;// end// always @(posedge clk_r or negedge sys_rst_n) begin//只读出偶数地址的数据。//     if(~sys_rst_n) //         en_B <= 1'b0 ;//     else if(~flag_wr) begin//         if(cnt_r[0]) // 奇数赋值1,读使能有效,偶数读使能无效。//             en_B <= 1'b1 ;//         else //             en_B <= 1'b0 ;//     end//     else //         en_B <= 1'b0 ;// endalways @(posedge clk_r or negedge sys_rst_n) begin//只读出偶数地址的数据。if(~sys_rst_n) en_B <= 1'b0 ;else if(~flag_wr && (cnt_r[0])) en_B <= 1'b1 ;else en_B <= 1'b0 ;endalways @(posedge clk_r or negedge sys_rst_n) beginif(~sys_rst_n)cnt_r <= 8'd0 ;else if(~flag_wr && (cnt_r == RD_NUM - 1))cnt_r <= 8'd0 ;else if(~flag_wr)cnt_r <= cnt_r + 1'b1 ;elsecnt_r <= 8'd0 ;endassign addr_B = (en_B) ? cnt_r : 8'd0 ;endmodule

 

仿真图:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/174305.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

做一个springboot登陆注册功能

目录 一、环境搭建 1、数据库 2、引入依赖 3、配置信息 4、创建包结构和数据库实体类 二、接口开发-注册接口 前提准备 响应数据 需求分析 全局异常处理 代码编写 测试 三、接口开发-登录接口 前提准备 响应数据 需求分析 代码编写 测试 拦截器 测试 一、环…

字典管理怎么使用,vue3项目使用若依的的字典管理模块

若依框架数据字典的使用_若依数据字典_哈哈水水水水的博客-CSDN博客 【精选】关于数据字典的理解与设计_数据字典怎么设计-CSDN博客 若依的字典值如何使用&#xff08;超详细图文教程&#xff09;_若依字典管理_丿BAIKAL巛的博客-CSDN博客 Vue3组合式API&#xff1a;getCurr…

行业追踪,2023-11-13

自动复盘 2023-11-13 凡所有相&#xff0c;皆是虚妄。若见诸相非相&#xff0c;即见如来。 k 线图是最好的老师&#xff0c;每天持续发布板块的rps排名&#xff0c;追踪板块&#xff0c;板块来开仓&#xff0c;板块去清仓&#xff0c;丢弃自以为是的想法&#xff0c;板块去留让…

CentOs7 NAT模式连接网络

1.配置动态网络 1.1 检查主机网卡配置 检查主机的网络设置 进入控制面板&#xff0c;找到网络共享中心 查看适配器是否都已经开启 1.2 设置虚拟机的网络配置 打开虚拟机网络配置设置&#xff0c;对网卡VMnet8 进行设置 记住网关 全部选择应用&#xff0c;确定 1.3 设置…

您的计算机已被Mallox勒索病毒感染?恢复您的数据的方法在这里!

尊敬的读者&#xff1a; 随着科技的迅速发展&#xff0c;网络安全问题日益凸显&#xff0c;其中勒索病毒是一种极具威胁性的恶意软件。在这些勒索病毒中&#xff0c;.mallox 勒索病毒尤为突出&#xff0c;它能够加密用户的数据文件&#xff0c;要求支付赎金才能解密。本文将介…

【Python基础】一个简单的TCP通信程序

&#x1f308;欢迎来到Python专栏 &#x1f64b;&#x1f3fe;‍♀️作者介绍&#xff1a;前PLA队员 目前是一名普通本科大三的软件工程专业学生 &#x1f30f;IP坐标&#xff1a;湖北武汉 &#x1f349; 目前技术栈&#xff1a;C/C、Linux系统编程、计算机网络、数据结构、Mys…

从0开始python学习-34.pytest常用插件

目录 1. pytest-html&#xff1a;生成HTML测试报告 2.pytest-xdist&#xff1a;并发执行用例 3. pytest-order&#xff1a;自定义用例的执行顺序 4. pytest-rerunfailures&#xff1a;用例失败时自动重试 5. pytest-result-log:用例执行结果记录到日志文件 1. pytest-html…

STM32笔记—USART

课外知识插入&#xff1a;STM32单片机extern全局变量_stm32全局变量-CSDN博客 如果你把temple定义在A中&#xff0c;然后让A.h和B.h包含在includes.h中&#xff0c;然后把includes.h放在A.c和B.c中单个编译是没有问题的&#xff0c;但是链接的时候会出现问题&#xff0c; “S…

Rust编程中的共享状态并发执行

1.共享状态并发 虽然消息传递是一个很好的处理并发的方式&#xff0c;但并不是唯一一个。另一种方式是让多个线程拥有相同的共享数据。在学习Go语言编程过程中大家应该听到过一句口号:"不要通过共享内存来通讯"。 在某种程度上&#xff0c;任何编程语言中的信道都类…

Django(五、视图层)

文章目录 一、视图层1.视图函数返回值的问题2.三板斧的使用结论&#xff1a;在视图文件中写视图函数的时候不能没有返回值&#xff0c;默认返回的是None&#xff0c;但是页面上会报错&#xff0c;用来处理请求的视图函数都必须返回httpResponse对象。 二、JsonReponse序列化类的…

力扣 232. 用栈实现队列(C语言实现)

目录 1.解题思路2.代码实现 1.解题思路 利用两个栈&#xff0c;设栈s1为入栈,s2为出栈&#xff0c;则当s2为空时&#xff0c;出队列只能将s1的后N-1项挪到s2后剩下的就为出栈的项&#xff0c;但如果s2不为空那就说明此时s2栈中的元素就已经是按照队列的顺序排好了&#xff0c;…

HTML5学习系列之主结构

HTML5学习系列之主结构 前言HTML5主结构定义页眉定义导航定义主要区域定义文章块定义区块定义附栏定义页脚 具体使用总结 前言 学习记录 HTML5主结构 定义页眉 head表示页眉&#xff0c;用来表示标题栏&#xff0c;引导和导航作用的结构元素。 <header role"banner…