Skip to content
Snippets Groups Projects
Commit 37724a60 authored by BRONES Romain's avatar BRONES Romain
Browse files

Dissociate X and Y plane for corr coef and control

* Two different register for enable and reset
* Duplicate coeffs
* Based on PSCID **table index**. > 50 is Y

* Threshold autostop is kept on both plane.
  Control moved to a dedicated register.
  When reached, stop both planes.
parent 90d4abe7
No related branches found
No related tags found
No related merge requests found
...@@ -12,13 +12,20 @@ entity corr_ll is ...@@ -12,13 +12,20 @@ entity corr_ll is
clk : in std_logic; clk : in std_logic;
rst_n : in std_logic; rst_n : in std_logic;
coef_a : in signed(C_W_COR_COEF-1 downto 0);
coef_b : in signed(C_W_COR_COEF-1 downto 0);
coef_ic : in signed(C_W_COR_COEF-1 downto 0);
coef_d : in signed(C_W_COR_COEF-1 downto 0);
enable_corr : in std_logic; coef_a_x : in signed(C_W_COR_COEF-1 downto 0);
reset_corr : in std_logic; coef_b_x : in signed(C_W_COR_COEF-1 downto 0);
coef_ic_x : in signed(C_W_COR_COEF-1 downto 0);
coef_d_x : in signed(C_W_COR_COEF-1 downto 0);
coef_a_y : in signed(C_W_COR_COEF-1 downto 0);
coef_b_y : in signed(C_W_COR_COEF-1 downto 0);
coef_ic_y : in signed(C_W_COR_COEF-1 downto 0);
coef_d_y : in signed(C_W_COR_COEF-1 downto 0);
enable_corr_x : in std_logic;
reset_corr_x : in std_logic;
enable_corr_y : in std_logic;
reset_corr_y : in std_logic;
matmult : in signed_array(0 to C_N_MM_PSC-1)(C_W_MM-1 downto 0); matmult : in signed_array(0 to C_N_MM_PSC-1)(C_W_MM-1 downto 0);
matmult_valid : in std_logic; matmult_valid : in std_logic;
...@@ -83,8 +90,33 @@ begin ...@@ -83,8 +90,33 @@ begin
signal rz_mult_b : signed(C_W_COR_SUMSAT-1 downto 0); signal rz_mult_b : signed(C_W_COR_SUMSAT-1 downto 0);
signal rz_mult_d : signed(C_W_COR_SUMSAT-1 downto 0); signal rz_mult_d : signed(C_W_COR_SUMSAT-1 downto 0);
signal coef_a : signed(C_W_COR_COEF-1 downto 0);
signal coef_b : signed(C_W_COR_COEF-1 downto 0);
signal coef_ic : signed(C_W_COR_COEF-1 downto 0);
signal coef_d : signed(C_W_COR_COEF-1 downto 0);
signal enable_corr : std_logic;
signal reset_corr : std_logic;
begin begin
-- Signal mux for X/Y coef and enable/reset, based on PSCID number
if I < 51 then
coef_a <= coef_a_x;
coef_b <= coef_b_x;
coef_ic <= coef_ic_x;
coef_d <= coef_d_x;
enable_corr <= enable_corr_x;
reset_corr <= reset_corr_x;
else
coef_a <= coef_a_y;
coef_b <= coef_b_y;
coef_ic <= coef_ic_y;
coef_d <= coef_d_y;
enable_corr <= enable_corr_y;
reset_corr <= reset_corr_y;
end if;
p_main:process(clk, rst_n) p_main:process(clk, rst_n)
begin begin
if rst_n = '0' then if rst_n = '0' then
......
...@@ -65,7 +65,8 @@ architecture struct of top_corr_matrix is ...@@ -65,7 +65,8 @@ architecture struct of top_corr_matrix is
signal corrout_valid : std_logic; signal corrout_valid : std_logic;
signal corrout_seq : std_logic_vector(C_W_BPMSEQ-1 downto 0); signal corrout_seq : std_logic_vector(C_W_BPMSEQ-1 downto 0);
signal corrout : signed_array(0 to C_N_MM_PSC-1)(C_W_COR-1 downto 0); signal corrout : signed_array(0 to C_N_MM_PSC-1)(C_W_COR-1 downto 0);
signal enable_corr : std_logic; signal enable_corr_x : std_logic;
signal enable_corr_y : std_logic;
-- Serializer -- Serializer
signal overrun_flag : std_logic; signal overrun_flag : std_logic;
...@@ -230,13 +231,19 @@ begin ...@@ -230,13 +231,19 @@ begin
matmult_seq => matmult_seq, matmult_seq => matmult_seq,
-- Corr coefs -- Corr coefs
coef_a => signed(mm_a2l.CORR_K1A.data.data), coef_a_x => signed(mm_a2l.CORR_K1A_X.data.data),
coef_b => signed(mm_a2l.CORR_K1B.data.data), coef_b_x => signed(mm_a2l.CORR_K1B_X.data.data),
coef_ic => signed(mm_a2l.CORR_K1IC.data.data), coef_ic_x => signed(mm_a2l.CORR_K1IC_X.data.data),
coef_d => signed(mm_a2l.CORR_K1D.data.data), coef_d_x => signed(mm_a2l.CORR_K1D_X.data.data),
coef_a_y => signed(mm_a2l.CORR_K1A_Y.data.data),
reset_corr => mm_a2l.CONTROL.RST_CORR.data(0), coef_b_y => signed(mm_a2l.CORR_K1B_Y.data.data),
enable_corr => enable_corr, coef_ic_y => signed(mm_a2l.CORR_K1IC_Y.data.data),
coef_d_y => signed(mm_a2l.CORR_K1D_Y.data.data),
reset_corr_x => mm_a2l.CONTROL.RST_CORR.data(0),
enable_corr_x => enable_corr_x,
reset_corr_y => mm_a2l.CONTROL.RST_CORR.data(0),
enable_corr_y => enable_corr_y,
-- Corr output -- Corr output
corrout_valid => corrfirst_valid, corrout_valid => corrfirst_valid,
...@@ -259,13 +266,19 @@ begin ...@@ -259,13 +266,19 @@ begin
matmult_seq => corrfirst_seq, matmult_seq => corrfirst_seq,
-- Corr coefs -- Corr coefs
coef_a => signed(mm_a2l.CORR_K2A.data.data), coef_a_x => signed(mm_a2l.CORR_K2A_X.data.data),
coef_b => signed(mm_a2l.CORR_K2B.data.data), coef_b_x => signed(mm_a2l.CORR_K2B_X.data.data),
coef_ic => signed(mm_a2l.CORR_K2IC.data.data), coef_ic_x => signed(mm_a2l.CORR_K2IC_X.data.data),
coef_d => signed(mm_a2l.CORR_K2D.data.data), coef_d_x => signed(mm_a2l.CORR_K2D_X.data.data),
coef_a_y => signed(mm_a2l.CORR_K2A_Y.data.data),
reset_corr => mm_a2l.CONTROL.RST_CORR.data(0), coef_b_y => signed(mm_a2l.CORR_K2B_Y.data.data),
enable_corr => enable_corr, coef_ic_y => signed(mm_a2l.CORR_K2IC_Y.data.data),
coef_d_y => signed(mm_a2l.CORR_K2D_Y.data.data),
reset_corr_x => mm_a2l.CONTROL_X.RST_CORR.data(0),
enable_corr_x => enable_corr_x,
reset_corr_y => mm_a2l.CONTROL_Y.RST_CORR.data(0),
enable_corr_y => enable_corr_y,
-- Corr output -- Corr output
corrout_valid => corrout_valid, corrout_valid => corrout_valid,
...@@ -273,7 +286,8 @@ begin ...@@ -273,7 +286,8 @@ begin
corrout => corrout corrout => corrout
); );
enable_corr <= mm_a2l.CONTROL.ENABLE_CORR.data(0) and not thresh_reached; enable_corr_x <= mm_a2l.CONTROL_X.ENABLE_CORR.data(0) and not thresh_reached;
enable_corr_y <= mm_a2l.CONTROL_Y.ENABLE_CORR.data(0) and not thresh_reached;
--------------------- ---------------------
-- DATA SERIALIZER -- -- DATA SERIALIZER --
...@@ -347,8 +361,8 @@ begin ...@@ -347,8 +361,8 @@ begin
s_axis_tdata_cor => ser_tdata(C_W_COR-1 downto 0), s_axis_tdata_cor => ser_tdata(C_W_COR-1 downto 0),
s_axis_tvalid => ser_tvalid, s_axis_tvalid => ser_tvalid,
enable_thresh => mm_a2l.CONTROL.ENABLE_THRESH.data(0), enable_thresh => mm_a2l.THRESH.ENABLE.data(0),
rst_thresh => mm_a2l.CONTROL.RST_THRESH.data(0), rst_thresh => mm_a2l.THRESH.RST.data(0),
thresh_reached => thresh_reached thresh_reached => thresh_reached
); );
......
...@@ -28,13 +28,25 @@ addrmap corr_matrix { ...@@ -28,13 +28,25 @@ addrmap corr_matrix {
} VERSION @0x04; } VERSION @0x04;
reg { reg {
desc="Global control of the corrector."; desc="X-plane control of the corrector.";
default sw=rw; default hw=r; default sw=rw; default hw=r;
field {} ENABLE_CORR; field {} ENABLE_CORR;
field {} RST_CORR; field {} RST_CORR;
field {} ENABLE_THRESH; } CONTROL_X;
field {} RST_THRESH;
} CONTROL; reg {
desc="Y-plane control of the corrector.";
default sw=rw; default hw=r;
field {} ENABLE_CORR;
field {} RST_CORR;
} CONTROL_Y;
reg {
desc="Theshold autostop.";
default sw=rw; default hw=r;
field {} ENABLE;
field {} RST;
} THRESH;
reg { reg {
desc="Global status of the corrector."; desc="Global status of the corrector.";
...@@ -45,43 +57,84 @@ addrmap corr_matrix { ...@@ -45,43 +57,84 @@ addrmap corr_matrix {
reg { reg {
desc="Correction coefficient A."; desc="Correction coefficient A.";
field {sw = rw; hw = r;} data[`C_W_COR_COEF]; field {sw = rw; hw = r;} data[`C_W_COR_COEF];
} CORR_K1A; } CORR_K1A_X;
reg {
desc="Correction coefficient B.";
field {sw = rw; hw = r;} data[`C_W_COR_COEF];
} CORR_K1B_X;
reg {
desc="Correction coefficient (inverse) C.";
field {sw = rw; hw = r;} data[`C_W_COR_COEF];
} CORR_K1IC_X;
reg {
desc="Correction coefficient D.";
field {sw = rw; hw = r;} data[`C_W_COR_COEF];
} CORR_K1D_X;
reg {
desc="Correction coefficient A.";
field {sw = rw; hw = r;} data[`C_W_COR_COEF];
} CORR_K2A_X;
reg { reg {
desc="Correction coefficient B."; desc="Correction coefficient B.";
field {sw = rw; hw = r;} data[`C_W_COR_COEF]; field {sw = rw; hw = r;} data[`C_W_COR_COEF];
} CORR_K1B; } CORR_K2B_X;
reg { reg {
desc="Correction coefficient (inverse) C."; desc="Correction coefficient (inverse) C.";
field {sw = rw; hw = r;} data[`C_W_COR_COEF]; field {sw = rw; hw = r;} data[`C_W_COR_COEF];
} CORR_K1IC; } CORR_K2IC_X;
reg { reg {
desc="Correction coefficient D."; desc="Correction coefficient D.";
field {sw = rw; hw = r;} data[`C_W_COR_COEF]; field {sw = rw; hw = r;} data[`C_W_COR_COEF];
} CORR_K1D; } CORR_K2D_X;
reg {
desc="Correction coefficient A.";
field {sw = rw; hw = r;} data[`C_W_COR_COEF];
} CORR_K1A_Y;
reg {
desc="Correction coefficient B.";
field {sw = rw; hw = r;} data[`C_W_COR_COEF];
} CORR_K1B_Y;
reg {
desc="Correction coefficient (inverse) C.";
field {sw = rw; hw = r;} data[`C_W_COR_COEF];
} CORR_K1IC_Y;
reg {
desc="Correction coefficient D.";
field {sw = rw; hw = r;} data[`C_W_COR_COEF];
} CORR_K1D_Y;
reg { reg {
desc="Correction coefficient A."; desc="Correction coefficient A.";
field {sw = rw; hw = r;} data[`C_W_COR_COEF]; field {sw = rw; hw = r;} data[`C_W_COR_COEF];
} CORR_K2A; } CORR_K2A_Y;
reg { reg {
desc="Correction coefficient B."; desc="Correction coefficient B.";
field {sw = rw; hw = r;} data[`C_W_COR_COEF]; field {sw = rw; hw = r;} data[`C_W_COR_COEF];
} CORR_K2B; } CORR_K2B_Y;
reg { reg {
desc="Correction coefficient (inverse) C."; desc="Correction coefficient (inverse) C.";
field {sw = rw; hw = r;} data[`C_W_COR_COEF]; field {sw = rw; hw = r;} data[`C_W_COR_COEF];
} CORR_K2IC; } CORR_K2IC_Y;
reg { reg {
desc="Correction coefficient D."; desc="Correction coefficient D.";
field {sw = rw; hw = r;} data[`C_W_COR_COEF]; field {sw = rw; hw = r;} data[`C_W_COR_COEF];
} CORR_K2D; } CORR_K2D_Y;
reg { reg {
desc="Number of ID to count for matrix multiplication."; desc="Number of ID to count for matrix multiplication.";
...@@ -121,7 +174,7 @@ addrmap corr_matrix { ...@@ -121,7 +174,7 @@ addrmap corr_matrix {
} external ERRORBITX; } external ERRORBITX;
mem { mem {
desc = "X Average orbit error"; desc = "Y Average orbit error";
sw=r; sw=r;
memwidth = 32; memwidth = 32;
mementries = 2**`C_W_MM_IDCNT; mementries = 2**`C_W_MM_IDCNT;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment