summaryrefslogtreecommitdiff
path: root/rtl/gfx/gfx_mem.sv
blob: 4b671be44aea0768416a0369ba62be5d2798b262 (plain)
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
70
`include "gfx/gfx_defs.sv"

module gfx_mem
(
	input  logic      clk,
	                  rst_n,

	input  logic      mem_waitrequest,
	                  mem_readdatavalid,
	input  mem_word   mem_readdata,
	output mem_addr   mem_address,
	output logic      mem_read,
	                  mem_write,
	output mem_word   mem_writedata,

	input  logic      rop_write,
	input  mem_word   rop_writedata,
	input  half_coord rop_address,
	output logic      rop_waitrequest,

	input  logic      fb_read,
	input  half_coord fb_address,
	output logic      fb_waitrequest,
	                  fb_readdatavalid,
	output mem_word   fb_readdata
);

	// Esto está mal, hay que reescribirlo totalmente

	logic lock, lock_rop, select_rop, wait_state;

	assign fb_readdata = mem_readdata;
	assign fb_readdatavalid = mem_readdatavalid;

	assign mem_writedata = rop_writedata;

	assign wait_state = (mem_read || mem_write) && mem_waitrequest;

	always_comb begin
		select_rop = !fb_read;

		if (lock)
			select_rop = lock_rop;

		mem_read = 0;
		mem_write = 0;
		fb_waitrequest = 1;
		rop_waitrequest = 1;

		if (select_rop) begin
			mem_write = rop_write;
			mem_address = {6'd0, rop_address};

			rop_waitrequest = mem_waitrequest;
		end else begin
			mem_read = fb_read;
			mem_address = {6'd0, fb_address};

			fb_waitrequest = mem_waitrequest;
		end
	end

	always_ff @(posedge clk or negedge rst_n)
		lock <= !rst_n ? 0 : wait_state;

	always_ff @(posedge clk)
		if (wait_state)
			lock_rop <= select_rop;

endmodule