x393  1.0
FPGAcodeforElphelNC393camera
cmd_readback.v
Go to the documentation of this file.
1 
39 `timescale 1ns/1ps
40 
41 module cmd_readback#(
42  parameter AXI_WR_ADDR_BITS= 14,
43  parameter AXI_RD_ADDR_BITS = 14,
44  parameter CONTROL_RBACK_DEPTH= 11, // 10 - 1xbram, 11 - 2xbram
45 
46  parameter CONTROL_ADDR = 'h0000, // AXI write address of control write registers
47  parameter CONTROL_ADDR_MASK = 'h3800, // AXI write address of control registers
48  parameter CONTROL_RBACK_ADDR = 'h0000, // AXI write address of control write registers
49  parameter CONTROL_RBACK_ADDR_MASK = 'h3800 // AXI write address of control registers
50 )(
51  input mrst, // @posedge mclk - sync reset
52  input arst, // @posedge axi_clk - sync reset
53  input mclk,
54  input axi_clk,
55  input [AXI_WR_ADDR_BITS-1:0] par_waddr, // parallel address
56  input [31:0] par_data, // parallel 32-bit data
57  input ad_stb, // low address output strobe (and parallel A/D)
58 
59  input [AXI_RD_ADDR_BITS-1:0] axird_pre_araddr, // status read address, 1 cycle ahead of read data
60  input axird_start_burst, // start of read burst, valid pre_araddr, save externally to control ext. dev_ready multiplexer
61  input [CONTROL_RBACK_DEPTH-1:0] axird_raddr, // .raddr(read_in_progress?read_address[9:0]:10'h3ff), // read address
62  input axird_ren, // .ren(bram_reg_re_w) , // read port enable
63 // input axird_regen, //==axird_ren?? - remove? .regen(bram_reg_re_w), // output register enable
64  output [31:0] axird_rdata, // combinatorial multiplexed (add external register layer, modify axibram_read?) .data_out(rdata[31:0]), // data out
65  output axird_selected // axird_rdata contains cvalid data from this module, vcalid next after axird_start_burst
66 
67 );
68  localparam integer DATA_2DEPTH = (1<<CONTROL_RBACK_DEPTH)-1;
69  reg [31:0] ram [0:DATA_2DEPTH];
71  reg we;
72  reg [31: 0] wdata;
73 
74  wire select_w;
75  reg select_r;
76  reg select_d;
77 
78  wire rd;
79  wire regen;
80  reg [31:0] axi_rback_rdata;
81  reg [31:0] axi_rback_rdata_r;
83  wire we_w;
84 
85  assign we_w = ad_stb && (((par_waddr ^ CONTROL_ADDR) & CONTROL_ADDR_MASK)==0);
87  assign rd = axird_ren && select_r;
88  assign regen = axird_regen && select_d;
90  assign axird_selected = select_r;
91 
92 
93  always @ (posedge axi_clk) begin
94  if (arst) axird_regen <= 0;
95  else axird_regen <= axird_ren;
96 
97  if (arst) select_r <= 0;
98  else if (axird_start_burst) select_r <= select_w;
99 
100  end
101  always @ (posedge axi_clk) begin
104  select_d <= select_r;
105  end
106 
107  always @ (posedge mclk) begin
108  if (mrst) we <= 0;
109  else we <= we_w;
110  end
111  always @ (posedge mclk) begin
112  if (we_w) wdata <= par_data;
114 
115  end
116 
117  always @ (posedge mclk) begin
118  if (we) ram[waddr] <= wdata; // shifted data here
119  end
120 
121 
122 endmodule
123 
10185AXI_WR_ADDR_BITS14
Definition: cmd_readback.v:42
10207waddrreg[CONTROL_RBACK_DEPTH-1:0]
Definition: cmd_readback.v:70
10187CONTROL_RBACK_DEPTH11
Definition: cmd_readback.v:44
10190CONTROL_RBACK_ADDR'h0000
Definition: cmd_readback.v:48
10188CONTROL_ADDR'h0000
Definition: cmd_readback.v:46
10210select_wwire
Definition: cmd_readback.v:74
[AXI_WR_ADDR_BITS-1:0] 10196par_waddr
Definition: cmd_readback.v:55
10209wdatareg[31:0]
Definition: cmd_readback.v:72
[CONTROL_RBACK_DEPTH-1:0] 10201axird_raddr
Definition: cmd_readback.v:61
[31:0] 10203axird_rdata
Definition: cmd_readback.v:64
[AXI_RD_ADDR_BITS-1:0] 10199axird_pre_araddr
Definition: cmd_readback.v:59
10217axird_regenreg
Definition: cmd_readback.v:82
10191CONTROL_RBACK_ADDR_MASK'h3800
Definition: cmd_readback.v:49
10216axi_rback_rdata_rreg[31:0]
Definition: cmd_readback.v:81
10215axi_rback_rdatareg[31:0]
Definition: cmd_readback.v:80
[31:0] 10197par_data
Definition: cmd_readback.v:56
[0:DATA_2DEPTH] 10206ramreg[31:0]
Definition: cmd_readback.v:69
integer 10205DATA_2DEPTH(1<<CONTROL_RBACK_DEPTH)-1
Definition: cmd_readback.v:68
10186AXI_RD_ADDR_BITS14
Definition: cmd_readback.v:43
10189CONTROL_ADDR_MASK'h3800
Definition: cmd_readback.v:47