summaryrefslogtreecommitdiff
path: root/src/rtl/ram_1rw_1ro_readfirst.v
blob: 7ba11ea5ff4070ba2b78dd4fa10dc25ad4126167 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
`timescale 1ns / 1ps

module ram_1rw_1ro_readfirst
	(
		clk,
		a_addr, a_wr, a_in, a_out,
		b_addr, b_out
	);

		
		//
		// Parameters
		//
	parameter	MEM_WIDTH		= 32;
   parameter	MEM_ADDR_BITS	= 8;
		
		
		//
		// Ports
		//
	input		wire								clk;
	
	input		wire	[MEM_ADDR_BITS-1:0]	a_addr;
	input		wire								a_wr;
	input		wire	[MEM_WIDTH-1:0]		a_in;
	output	wire	[MEM_WIDTH-1:0]		a_out;
	
	input		wire	[MEM_ADDR_BITS-1:0]	b_addr;
	output	wire	[MEM_WIDTH-1:0]		b_out;
		
		
		//
		// BRAM
		//
   (* RAM_STYLE="BLOCK" *)
   reg	[MEM_WIDTH-1:0]	bram[0:(2**MEM_ADDR_BITS)-1];
	
	
		//
		// Output Registers
		//
   reg	[MEM_WIDTH-1:0]	bram_reg_a;
	reg	[MEM_WIDTH-1:0]	bram_reg_b;
	
	assign a_out = bram_reg_a;
	assign b_out = bram_reg_b;


		//
		// Read-Write Port A
		//
   always @(posedge clk) begin
		//
		bram_reg_a <= bram[a_addr];
		//
		if (a_wr) bram[a_addr] <= a_in;
		//
	end
		
		
		//
		// Read-Only Port B
		//
	always @(posedge clk)
		//
		bram_reg_b <= bram[b_addr];
		
	
endmodule