一天一个设计实例-ROM和RAM组合程序设计 2024-06-13 04:30:29 图3‑12 实验建模图图3‑12是本次设计的建模图,组合模块 savemod_demo 的内容包括一支核心操作,一只数码管基础模块,还有一个储存模块。核心操作会拉高 oEn,并且将相关的 Addr 与 Data 写入储存模块,紧接着该储存模块会经由 oData 驱动数码管基础模块。图3‑13 推挤位移存储模块的建模图顾名思义,该模块是推挤功能再加上位移功能的储存模块,左边是储存模块常见的 iEn,iAddr 与 iData,右边则是超乎常规的 oData。代码3‑7 推挤位移存储模块代码 1.module pushshift_savemod2.(3. input CLOCK,RESET,4. input iEn,5. input [3:0]iAddr,6. input [3:0]iData,7. output [23:0]oData8.);9. reg [3:0] RAM [15:0];10. reg [23:0] D1;11.12. always @ ( posedge CLOCK or negedge RESET )13. if( !RESET )14. begin15. D1 <= 24'd0;16. end17. else if( iEn )18. begin19. RAM[ iAddr ] <= iData;20. D1[3:0] <= RAM[ iAddr ];21. D1[7:4] <= D1[3:0];22. D1[11:8] <= D1[7:4];23. D1[15:12] <= D1[11:8];24. D1[19:16] <= D1[15:12];25. D1[23:20] <= D1[19:16];26. end27.28. assign oData = D1;29.30.endmodule 第 3~7 行是相关的出入端声明。第 9 行是片上内存 RAM 的声明,第 10 行则是寄存器 D1 的声明。第 15 行则是 D1 的复位操作。第 17 行表示 iEn 不拉高该模块就不工作。第 18~26 行是该模块的核心操作,第 19 行表示 RAM 将 iData 储存至 iAddr 指定的位置;第 20 行表示, RAM 将 iAddr 指定的内容赋予 D1[3:0]。如此一来,第 19 行与第 20 行的结合就成为推挤功能。至于第 21~25 行则是 6 个深度的位移功能(即 4 位宽为一个深度), iEn 每拉高一个时钟, D1 的内容就向左移动一个深度。savemod_demo.v组合模块的连线部署根据图3‑12,具体内容我们还是来看代码吧。代码3‑8 savemod_demo.v组合代码 1.module savemod_demo2.(3. input CLOCK,RESET,4. output [7:0]DIG,5. output [5:0]SEL6.);7. reg [3:0]i;8. reg [3:0]D1,D2; // D1 for Address, D2 for Data9. reg isEn;10.11. always @ ( posedge CLOCK or negedge RESET ) // Core12. if( !RESET )13. begin14. i <= 4'd0;15. { D1,D2 } <= 8'd0;16. isEn <= 1'b0;17. end18. else19. case( i )20.21. 0:22. begin isEn <= 1'b1; D1 <= 4'd0; D2 <= 4'hA; i <= i + 1'b1; end23.24. 1:25. begin isEn <= 1'b1; D1 <= 4'd0; D2 <= 4'hB; i <= i + 1'b1; end26.27. 2:28. begin isEn <= 1'b1; D1 <= 4'd0; D2 <= 4'hC; i <= i + 1'b1; end29.30. 3:31. begin isEn <= 1'b1; D1 <= 4'd0; D2 <= 4'hD; i <= i + 1'b1; end32.33. 4:34. begin isEn <= 1'b1; D1 <= 4'd0; D2 <= 4'hE; i <= i + 1'b1; end35.36. 5:37. begin isEn <= 1'b1; D1 <= 4'd0; D2 <= 4'hF; i <= i + 1'b1; end38.39. 6:40. begin isEn <= 1'b1; D1 <= 4'd0; D2 <= 4'h0; i <= i + 1'b1; end41.42. 7:43. begin isEn <= 1'b0; i <= i; end44.45. endcase46.47. wire [23:0]DataU1;48.49. pushshift_savemod U150. (51. .CLOCK( CLOCK ),52. .RESET( RESET ),53. .iEn( isEn ), // < Core54. .iAddr( D1 ), // < Core55. .iData( D2 ), // < Core56. .oData( DataU1 ) // > U257. );58.59. smg_basemod U260. (61. .CLOCK( CLOCK ),62. .RESET( RESET ),63. .DIG( DIG ), // top64. .SEL( SEL ), // top65. .iData( DataU1 ) // < U166. );67.68.endmodule 第3~5行内容是相关的出入端声明。第7~18行内容是相关的寄存器声明以及复位操作。其中 D1 用来暂存地址数据, D2 用来暂存读写数据。第 12~17 行是这些寄存器的复位操作第19~45行内容为核心操作,操作过程如下:步骤 0 为地址 0 写入数据 4’hA;,将原本的数据挤出来,并且发生位移。步骤 1 为地址 0 写入数据 4’hB;,将 4’hA 挤出来,并且发生位移。步骤 2 为地址 0 写入数据 4’hC;,将 4’hB 挤出来,并且发生位移。步骤 3 为地址 0 写入数据 4’hD;,将 4’hC 挤出来,并且发生位移。步骤 4 为地址 0 写入数据 4’hE;,将 4’hD 挤出来,并且发生位移。步骤 5 为地址 0 写入数据 4’hF,将 4’hE 挤出来,并且发生位移。步骤 6 为地址 0 写入数据 4’d0,将 4’hF 挤出来,并且发生位移。步骤 7 结束操作。图3‑14 savemod_demo 部分时序图图3‑14是 savemod_demo 部分重要的理想时序图,其中 isEn, D1 与 D2 是核心操作所发送的数据,至于 RAM[0]与 oData 是推挤位移储存模块的内部状况与输出结果。时序过程如下:T0,核心操作拉高 isEn,发送 4’d0 地址数据与 4’hA 读写数据。T1,核心操作拉高 isEn,发送 4’d0 地址数据与 4’hB 读写数据。储存模块将 4’hA 载入地址 0。T2,核心操作拉高 isEn,发送 4’d0 地址数据与 4’hC 读写数据。储存模块将 4’hB 载入地址 0,并且将数据 4’hA 挤出, oData 的结果为 24’h00000A。T3,核心操作拉高 isEn,发送 4’d0 地址数据与 4’hD 读写数据。储存模块将 4’hC 载入地址 0,并且将数据 4’hB 挤出,同时发生位移, oData 的结果为 24’h0000AB。T4,核心操作拉高 isEn,发送 4’d0 地址数据与 4’hE 读写数据。储存模块将 4’hD 载入地址 0,并且将数据 4’hC 挤出,同时发生位移, oData 的结果为 24’h000ABC。T5,核心操作拉高 isEn,发送 4’d0 地址数据与 4’hF 读写数据。储存模块将 4’hE 载入地址 0,并且将数据 4’hD 挤出,同时发生位移, oData 的结果为 24’h00ABCD。T6,核心操作拉高 isEn,发送 4’d0 地址数据与 4’d0 读写数据。储存模块将 4’hF 载入地址 0,并且将数据 4’hE 挤出,同时发生位移, oData 的结果为 24’h0ABCDE。T7,储存模块将 4’d0 载入地址 0,并且将数据 4’hF 挤出,同时发生位移, oData 的结果为 24’hABCDEF。第 47~58 行是该储存模块的实例化。第 59~66 行是数码管基础模块的实例化。编译完毕便下载程序,如果数码管从左至右显示“ABCDEF”,那么表示实验成功。最后还是要强调一下,推挤位移目前是没有意义的储存模块,可是实验十四的目的也非常清楚,就是解释储存模块,演示畸形的储存模块。 赞 (0) 相关推荐 硬盘电路板的工作原理 一,硬盘电路板的工作原理 硬盘的电路主要负责连接九三级的主板,并负责与计算机的通信整理,同时还控制管理整个硬盘的工作.如果硬盘的电路板设计不良,或电路板出现故障,俊辉造成硬盘的故障,下面具体的说一下硬 ... 有了norflash是不是意味着可以不需要RAM呢? 在看到norflash和nandflash的不同点之后,知道了norflash有个特性就是可以片上运行.网上大部分解释就是说norflash一般用来存放启动代码,这样启动代码就可以直接在norflas ... 一天一个设计实例-RAM、ROM模块程序设计 1.1.1RAM和ROM 前面已经介绍了,RAM和SRAM之间的区别,这里就详细介绍RAM和ROM. 前面说,存储分为"存储资源"和"存储方式". 代码3‑3 ... 一天一个设计实例-基于FPGA的模数、数模转换器应用设计 基于FPGA的模数.数模转换器应用设计 本节设计采用黑金ADDA模块,模块硬件结构如下: 图7‑32 硬件结构 数模转换( DA) 电路 如硬件结构图所示, DA 电路由高速 DA 芯片. 7 阶巴特 ... 一天一个设计实例-基于FPGA的数模转换器应用设计 基于FPGA的数模转换器应用设计 1.1.1带 EEPROM 存储器的 12 位MCP4725应用设计 7.4.1.1 MCP4725简介 MCP4725 是低功耗.高精度.单通道的 12 位缓冲电压 ... 一天一个设计实例-基于FPGA的模数转换器应用设计 基于FPGA的模数转换器应用设计 1.1.1八通道AD7606应用设计 7.3.1.1 AD7606简介 AD7606 是一款集成式 8 通道数据采集系统,片内集成输入放大器.过压保护电路.二阶模拟抗 ... 一天一个设计实例-AD转换器原理 AD转换器原理 A/D 转换器的基本原理 图7‑2 A/D转换器功能示意图 A/D转换器(Analog-to-Digital Converter)又叫模/数转换器,即是将模拟信号(电压或是电流的形式) ... 一天一个设计实例-LCD12864的应用设计 LCD12864的应用设计 LCD12864的应用基本和LCD1602的自定义字库非常类似,下面就简单介绍下LCD12864. 12864 中文 汉字图形点阵液晶显示模块,可显示汉字及图形,内置 81 ... 一天一个设计实例-LCD1602的应用设计 LCD1602的应用设计 1.1.1LCD1602的简介 工业字符型液晶,能够同时显示16x02即32个字符.(16列2行) 图6‑16 LCD1602实物图 注:为了表示的方便 ,后文皆以1表示高电 ... 一天一个设计实例-LED显示模块设计 LED显示模块设计 LED点阵模块指的是利用封装8*8的模块组合点元板形成模块,而LED模组应用中一般指两类产品:一种是用插灯或表贴封装做成的单元板,常用户外门头单红屏.户外全彩屏,室内全彩屏等:另外 ... 一天一个设计实例-GPIO PWM应用 GPIO PWM 1.1.1PWM简介 脉冲宽度调制脉冲宽度调制(PWM),是英文"Pulse Width Modulation"的缩写,简称脉宽调制,是利用微处理器的数字输出来对 ...