generic_dpram.v
上传用户:jin985143
上传日期:2020-09-30
资源大小:278k
文件大小:12k
源码类别:

Modem编程

开发平台:

VHDL

  1. //////////////////////////////////////////////////////////////////////
  2. ////                                                              ////
  3. ////  Generic Dual-Port Synchronous RAM                           ////
  4. ////                                                              ////
  5. ////  This file is part of memory library available from          ////
  6. ////  http://www.opencores.org/cvsweb.shtml/generic_memories/     ////
  7. ////                                                              ////
  8. ////  Description                                                 ////
  9. ////  This block is a wrapper with common dual-port               ////
  10. ////  synchronous memory interface for different                  ////
  11. ////  types of ASIC and FPGA RAMs. Beside universal memory        ////
  12. ////  interface it also provides behavioral model of generic      ////
  13. ////  dual-port synchronous RAM.                                  ////
  14. ////  It also contains a fully synthesizeable model for FPGAs.    ////
  15. ////  It should be used in all OPENCORES designs that want to be  ////
  16. ////  portable accross different target technologies and          ////
  17. ////  independent of target memory.                               ////
  18. ////                                                              ////
  19. ////  Supported ASIC RAMs are:                                    ////
  20. ////  - Artisan Dual-Port Sync RAM                                ////
  21. ////  - Avant! Two-Port Sync RAM (*)                              ////
  22. ////  - Virage 2-port Sync RAM                                    ////
  23. ////                                                              ////
  24. ////  Supported FPGA RAMs are:                                    ////
  25. ////  - Generic FPGA (VENDOR_FPGA)                                ////
  26. ////    Tested RAMs: Altera, Xilinx                               ////
  27. ////    Synthesis tools: LeonardoSpectrum, Synplicity             ////
  28. ////  - Xilinx (VENDOR_XILINX)                                    ////
  29. ////  - Altera (VENDOR_ALTERA)                                    ////
  30. ////                                                              ////
  31. ////  To Do:                                                      ////
  32. ////   - fix Avant!                                               ////
  33. ////   - add additional RAMs (VS etc)                             ////
  34. ////                                                              ////
  35. ////  Author(s):                                                  ////
  36. ////      - Richard Herveille, richard@asics.ws                   ////
  37. ////      - Damjan Lampret, lampret@opencores.org                 ////
  38. ////                                                              ////
  39. //////////////////////////////////////////////////////////////////////
  40. ////                                                              ////
  41. //// Copyright (C) 2000 Authors and OPENCORES.ORG                 ////
  42. ////                                                              ////
  43. //// This source file may be used and distributed without         ////
  44. //// restriction provided that this copyright statement is not    ////
  45. //// removed from the file and that any derivative work contains  ////
  46. //// the original copyright notice and the associated disclaimer. ////
  47. ////                                                              ////
  48. //// This source file is free software; you can redistribute it   ////
  49. //// and/or modify it under the terms of the GNU Lesser General   ////
  50. //// Public License as published by the Free Software Foundation; ////
  51. //// either version 2.1 of the License, or (at your option) any   ////
  52. //// later version.                                               ////
  53. ////                                                              ////
  54. //// This source is distributed in the hope that it will be       ////
  55. //// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
  56. //// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
  57. //// PURPOSE.  See the GNU Lesser General Public License for more ////
  58. //// details.                                                     ////
  59. ////                                                              ////
  60. //// You should have received a copy of the GNU Lesser General    ////
  61. //// Public License along with this source; if not, download it   ////
  62. //// from http://www.opencores.org/lgpl.shtml                     ////
  63. ////                                                              ////
  64. //////////////////////////////////////////////////////////////////////
  65. //
  66. // CVS Revision History
  67. //
  68. // $Log: not supported by cvs2svn $
  69. // Revision 1.4  2002/09/28 08:18:52  rherveille
  70. // Changed synthesizeable FPGA memory implementation.
  71. // Fixed some issues with Xilinx BlockRAM
  72. //
  73. // Revision 1.3  2001/11/09 00:34:18  samg
  74. // minor changes: unified with all common rams
  75. //
  76. // Revision 1.2  2001/11/08 19:11:31  samg
  77. // added valid checks to behvioral model
  78. //
  79. // Revision 1.1.1.1  2001/09/14 09:57:10  rherveille
  80. // Major cleanup.
  81. // Files are now compliant to Altera & Xilinx memories.
  82. // Memories are now compatible, i.e. drop-in replacements.
  83. // Added synthesizeable generic FPGA description.
  84. // Created "generic_memories" cvs entry.
  85. //
  86. // Revision 1.1.1.2  2001/08/21 13:09:27  damjan
  87. // *** empty log message ***
  88. //
  89. // Revision 1.1  2001/08/20 18:23:20  damjan
  90. // Initial revision
  91. //
  92. // Revision 1.1  2001/08/09 13:39:33  lampret
  93. // Major clean-up.
  94. //
  95. // Revision 1.2  2001/07/30 05:38:02  lampret
  96. // Adding empty directories required by HDL coding guidelines
  97. //
  98. //
  99. //`include "timescale.v"
  100. //
  101. `include "defs.vh"
  102. //`define VENDOR_FPGA
  103. //`define VENDOR_XILINX
  104. //`define VENDOR_ALTERA
  105. module generic_dpram(
  106. // Generic synchronous dual-port RAM interface
  107. rclk, rrst, rce, oe, raddr, do,
  108. wclk, wrst, wce, we, waddr, di
  109. );
  110. //
  111. // Default address and data buses width
  112. //
  113. parameter aw = 5;  // number of bits in address-bus
  114. parameter dw = 16; // number of bits in data-bus
  115. //
  116. // Generic synchronous double-port RAM interface
  117. //
  118. // read port
  119. input           rclk;  // read clock, rising edge trigger
  120. input           rrst;  // read port reset, active high
  121. input           rce;   // read port chip enable, active high
  122. input           oe;    // output enable, active high
  123. input  [aw-1:0] raddr; // read address
  124. output [dw-1:0] do;    // data output
  125. // write port
  126. input          wclk;  // write clock, rising edge trigger
  127. input          wrst;  // write port reset, active high
  128. input          wce;   // write port chip enable, active high
  129. input          we;    // write enable, active high
  130. input [aw-1:0] waddr; // write address
  131. input [dw-1:0] di;    // data input
  132. //
  133. // Module body
  134. //
  135. `ifdef VENDOR_FPGA
  136. //
  137. // Instantiation synthesizeable FPGA memory
  138. //
  139. // This code has been tested using LeonardoSpectrum and Synplicity.
  140. // The code correctly instantiates Altera EABs and Xilinx BlockRAMs.
  141. //
  142. reg [dw-1:0] mem [(1<<aw) -1:0]; // instantiate memory
  143. reg [aw-1:0] ra;                 // register read address
  144. // read operation
  145. always @(posedge rclk)
  146.   if (rce)
  147.     ra <= #1 raddr;
  148. assign do = mem[ra];
  149. // write operation
  150. always@(posedge wclk)
  151. if (we && wce)
  152. mem[waddr] <= #1 di;
  153. `else
  154. `ifdef VENDOR_XILINX
  155. //
  156. // Instantiation of FPGA memory:
  157. //
  158. // Virtex/Spartan2 BlockRAMs
  159. //
  160. xilinx_ram_dp xilinx_ram(
  161. // read port
  162. .CLKA(rclk),
  163. .RSTA(rrst),
  164. .ENA(rce),
  165. .ADDRA(raddr),
  166. .DIA( {dw{1'b0}} ),
  167. .WEA(1'b0),
  168. .DOA(do),
  169. // write port
  170. .CLKB(wclk),
  171. .RSTB(wrst),
  172. .ENB(wce),
  173. .ADDRB(waddr),
  174. .DIB(di),
  175. .WEB(we),
  176. .DOB()
  177. );
  178. defparam
  179. xilinx_ram.dwidth = dw,
  180. xilinx_ram.awidth = aw;
  181. `else
  182. `ifdef VENDOR_ALTERA
  183. //
  184. // Instantiation of FPGA memory:
  185. //
  186. // Altera FLEX/APEX EABs
  187. //
  188. altera_ram_dp altera_ram(
  189. // read port
  190. .rdclock(rclk),
  191. .rdclocken(rce),
  192. .rdaddress(raddr),
  193. .q(do),
  194. // write port
  195. .wrclock(wclk),
  196. .wrclocken(wce),
  197. .wren(we),
  198. .wraddress(waddr),
  199. .data(di)
  200. );
  201. defparam
  202. altera_ram.dwidth = dw,
  203. altera_ram.awidth = aw;
  204. `else
  205. `ifdef VENDOR_ARTISAN
  206. //
  207. // Instantiation of ASIC memory:
  208. //
  209. // Artisan Synchronous Double-Port RAM (ra2sh)
  210. //
  211. art_hsdp #(dw, 1<<aw, aw) artisan_sdp(
  212. // read port
  213. .qa(do),
  214. .clka(rclk),
  215. .cena(~rce),
  216. .wena(1'b1),
  217. .aa(raddr),
  218. .da( {dw{1'b0}} ),
  219. .oena(~oe),
  220. // write port
  221. .qb(),
  222. .clkb(wclk),
  223. .cenb(~wce),
  224. .wenb(~we),
  225. .ab(waddr),
  226. .db(di),
  227. .oenb(1'b1)
  228. );
  229. `else
  230. `ifdef VENDOR_AVANT
  231. //
  232. // Instantiation of ASIC memory:
  233. //
  234. // Avant! Asynchronous Two-Port RAM
  235. //
  236. avant_atp avant_atp(
  237. .web(~we),
  238. .reb(),
  239. .oeb(~oe),
  240. .rcsb(),
  241. .wcsb(),
  242. .ra(raddr),
  243. .wa(waddr),
  244. .di(di),
  245. .do(do)
  246. );
  247. `else
  248. `ifdef VENDOR_VIRAGE
  249. //
  250. // Instantiation of ASIC memory:
  251. //
  252. // Virage Synchronous 2-port R/W RAM
  253. //
  254. virage_stp virage_stp(
  255. // read port
  256. .CLKA(rclk),
  257. .MEA(rce_a),
  258. .ADRA(raddr),
  259. .DA( {dw{1'b0}} ),
  260. .WEA(1'b0),
  261. .OEA(oe),
  262. .QA(do),
  263. // write port
  264. .CLKB(wclk),
  265. .MEB(wce),
  266. .ADRB(waddr),
  267. .DB(di),
  268. .WEB(we),
  269. .OEB(1'b1),
  270. .QB()
  271. );
  272. `else
  273. //
  274. // Generic dual-port synchronous RAM model
  275. //
  276. //
  277. // Generic RAM's registers and wires
  278. //
  279. reg [dw-1:0] mem [(1<<aw)-1:0]; // RAM content
  280. reg [dw-1:0] do_reg;            // RAM data output register
  281. //
  282. // Data output drivers
  283. //
  284. assign do = (oe & rce) ? do_reg : {dw{1'bz}};
  285. // read operation
  286. always @(posedge rclk)
  287. if (rce)
  288.            do_reg <= #1 (we && (waddr==raddr)) ? {dw{1'b x}} : mem[raddr];
  289. // write operation
  290. always @(posedge wclk)
  291. if (wce && we)
  292. mem[waddr] <= #1 di;
  293. // Task prints range of memory
  294. // *** Remember that tasks are non reentrant, don't call this task in parallel for multiple instantiations.
  295. task print_ram;
  296. input [aw-1:0] start;
  297. input [aw-1:0] finish;
  298. integer rnum;
  299.    begin
  300.      for (rnum=start;rnum<=finish;rnum=rnum+1)
  301.        $display("Addr %h = %h",rnum,mem[rnum]);
  302.    end
  303. endtask
  304. `endif // !VENDOR_VIRAGE
  305. `endif // !VENDOR_AVANT
  306. `endif // !VENDOR_ARTISAN
  307. `endif // !VENDOR_ALTERA
  308. `endif // !VENDOR_XILINX
  309. `endif // !VENDOR_FPGA
  310. endmodule
  311. //
  312. // Black-box modules
  313. //
  314. `ifdef VENDOR_ALTERA
  315. module altera_ram_dp(
  316. data,
  317. wraddress,
  318. rdaddress,
  319. wren,
  320. wrclock,
  321. wrclocken,
  322. rdclock,
  323. rdclocken,
  324. q) /* synthesis black_box */;
  325. parameter awidth = 7;
  326. parameter dwidth = 8;
  327. input [dwidth -1:0] data;
  328. input [awidth -1:0] wraddress;
  329. input [awidth -1:0] rdaddress;
  330. input               wren;
  331. input               wrclock;
  332. input               wrclocken;
  333. input               rdclock;
  334. input               rdclocken;
  335. output [dwidth -1:0] q;
  336. // synopsis translate_off
  337. // exemplar translate_off
  338. syn_dpram_rowr #(
  339. "UNUSED",
  340. dwidth,
  341. awidth,
  342. 1 << awidth
  343. )
  344. altera_dpram_model (
  345. // read port
  346. .RdClock(rdclock),
  347. .RdClken(rdclocken),
  348. .RdAddress(rdaddress),
  349. .RdEn(1'b1),
  350. .Q(q),
  351. // write port
  352. .WrClock(wrclock),
  353. .WrClken(wrclocken),
  354. .WrAddress(wraddress),
  355. .WrEn(wren),
  356. .Data(data)
  357. );
  358. // exemplar translate_on
  359. // synopsis translate_on
  360. endmodule
  361. `endif // VENDOR_ALTERA
  362. `ifdef VENDOR_XILINX
  363. module xilinx_ram_dp (
  364. ADDRA,
  365. CLKA,
  366. ADDRB,
  367. CLKB,
  368. DIA,
  369. WEA,
  370. DIB,
  371. WEB,
  372. ENA,
  373. ENB,
  374. RSTA,
  375. RSTB,
  376. DOA,
  377. DOB) /* synthesis black_box */ ;
  378. parameter awidth = 7;
  379. parameter dwidth = 8;
  380. // port_a
  381. input               CLKA;
  382. input               RSTA;
  383. input               ENA;
  384. input [awidth-1:0]  ADDRA;
  385. input [dwidth-1:0]  DIA;
  386. input               WEA;
  387. output [dwidth-1:0] DOA;
  388. // port_b
  389. input               CLKB;
  390. input               RSTB;
  391. input               ENB;
  392. input [awidth-1:0]  ADDRB;
  393. input [dwidth-1:0]  DIB;
  394. input               WEB;
  395. output [dwidth-1:0] DOB;
  396. // insert simulation model
  397. // synopsys translate_off
  398. // exemplar translate_off
  399. C_MEM_DP_BLOCK_V1_0 #(
  400. awidth,
  401. awidth,
  402. 1,
  403. 1,
  404. "0",
  405. 1 << awidth,
  406. 1 << awidth,
  407. 1,
  408. 1,
  409. 1,
  410. 1,
  411. 1,
  412. 1,
  413. 1,
  414. 1,
  415. 1,
  416. 1,
  417. 1,
  418. 1,
  419. 1,
  420. "",
  421. 16,
  422. 0,
  423. 0,
  424. 1,
  425. 1,
  426. 1,
  427. 1,
  428. dwidth,
  429. dwidth)
  430. xilinx_dpram_model (
  431. .ADDRA(ADDRA),
  432. .CLKA(CLKA),
  433. .ADDRB(ADDRB),
  434. .CLKB(CLKB),
  435. .DIA(DIA),
  436. .WEA(WEA),
  437. .DIB(DIB),
  438. .WEB(WEB),
  439. .ENA(ENA),
  440. .ENB(ENB),
  441. .RSTA(RSTA),
  442. .RSTB(RSTB),
  443. .DOA(DOA),
  444. .DOB(DOB));
  445. // exemplar translate_on
  446. // synopsys translate_on
  447. endmodule
  448. `endif // VENDOR_XILINX