move SPI master out of control loop design

This commit is contained in:
Peter McGoron 2022-10-17 14:37:37 -04:00
parent 0ef00c15d7
commit dc2b1fe339
1 changed files with 25 additions and 53 deletions

View File

@ -1,9 +1,10 @@
/* TODO: move SPI masters out of the control loop design */ /* TODO: standardised access that isn't ad-hoc: wishbone
* bus */
/************ Introduction to PI Controllers /************ Introduction to PI Controllers
* The continuous form of a PI loop is * The continuous form of a PI loop is
* *
* A(t) = P e(t) + I e(t')dt' * A(t) = P e(t) + I e(t')dt'
* where e(t) is the error (setpoint - measured), and * where e(t) is the error (setpoint - measured), and
* the integral goes from 0 to the current time 't'. * the integral goes from 0 to the current time 't'.
* *
@ -128,20 +129,20 @@ module control_loop
) ( ) (
input clk, input clk,
input arm, input arm,
output running,
output adc_sck, input signed [ADC_WID-1:0] measured_value,
input adc_in, output adc_conv,
output adc_conv, // active high output adc_arm,
input adc_finished,
output dac_sck, output signed [DAC_WID-1:0] to_dac,
output dac_ss, // active high output dac_ss,
output dac_out, output dac_arm,
input dac_finished
/* Informational output.
* These registers are also used for storing information while
* the loop is running.
*/
input reg read_err_cur,
output reg read_err_cur_finished,
output signed [ERR_WID-1:0] err_cur, output signed [ERR_WID-1:0] err_cur,
output signed [CONSTS_WID-1:0] adj, output signed [CONSTS_WID-1:0] adj,
@ -220,28 +221,8 @@ reg [STATESIZ-1:0] state = WAIT_ON_ARM;
* --> reinterpret and write into DAC: DAC_DATA_WID.0 * --> reinterpret and write into DAC: DAC_DATA_WID.0
*/ */
/******* Get measured value ********/
reg signed [ADC_WID-1:0] measured = 0;
reg adc_arm = 0;
wire adc_finished;
spi_master_no_write #(
.WID(ADC_WID),
.POLARITY(ADC_POLARITY),
.PHASE(ADC_PHASE),
.CYCLE_HALF_WAIT(1),
.TIMER_LEN(3)
) adc (
.clk(clk),
.from_slave(adcbuf),
.miso(adc_in),
.sck_wire(adc_sck),
.arm(adc_arm),
.finished(adc_finished)
);
/**** Calculate Error ****/ /**** Calculate Error ****/
assign err_cur = measured - setpoint; assign err_cur = measured_value - setpoint;
/****** Multiplication ******* /****** Multiplication *******
* Truncation of a fixed-point integer to a smaller buffer requires * Truncation of a fixed-point integer to a smaller buffer requires
@ -268,7 +249,7 @@ wire signed [MUL_WID-1:0] alpha_err;
wire p_err_prev_fin; wire p_err_prev_fin;
wire signed [MUL_WID-1:0] p_err_prev; wire signed [MUL_WID-1:0] p_err_prev;
wire mul_finished = alpha_err_prev_fin & p_err_fin; wire mul_finished = alpha_err_fin & p_err_fin;
/* αe */ /* αe */
boothmul #( boothmul #(
@ -334,28 +315,14 @@ wire signed dac_adj_val[DAC_DATA_WID-1:0];
intsat #( intsat #(
.IN_LEN(RTRUNC_WID), .IN_LEN(RTRUNC_WID),
.LTRUNC(DAC_DATA_WID) .LTRUNC(DAC_DATA_WID)
) ( ) sat_newadj_rtrunc (
.inp(newadj_rtrunc), .inp(newadj_rtrunc),
.outp(dac_adj_val) .outp(dac_adj_val)
); );
/**** Write to DAC ****/ /**** Write to DAC ****/
reg dac_arm = 0; assign to_dac = {4'b0010,dac_adj_val};
spi_master_no_read #(
.WID(DAC_WID),
.WID_LEN(5),
.CYCLE_HALF_WAIT(3),
.TIMER_LEN(3),
.POLARITY(DAC_POLARITY),
.PHASE(DAC_PHASE)
) dac (
.clk(clk),
.to_slave({4'b0010,dac_adj_val}),
.mosi(dac_out),
.sck_wire(dac_sck),
.arm(dac_arm)
);
reg [DELAY_WID-1:0] timer = 0; reg [DELAY_WID-1:0] timer = 0;
@ -366,14 +333,19 @@ always @ (posedge clk) begin
adj_prev <= 0; adj_prev <= 0;
err_prev <= 0; err_prev <= 0;
timer <= 0; timer <= 0;
running <= 0;
end else if (timer == 0) begin end else if (timer == 0) begin
saved_delay <= delay_in; saved_delay <= delay_in;
timer <= 1; timer <= 1;
running <= 1;
setpt <= setpt_in;
/* TODO: cl_alpha change only when loop is stopped */
cl_alpha_reg <= cl_alpha_in;
cl_p_reg <= cl_p_in;
state <= WAIT_LOOP_DELAY;
end else if (timer < saved_delay) begin end else if (timer < saved_delay) begin
timer <= timer + 1; timer <= timer + 1;
setpt <= setpt_in; setpt <= setpt_in;
cl_alpha_reg <= cl_alpha_in;
cl_p_reg <= cl_p_in;
end else begin end else begin
state <= WAIT_ON_ADC; state <= WAIT_ON_ADC;
timer <= 0; timer <= 0;