upsilon/gateware/rtl/control_loop/control_loop_sim_top.v

143 lines
2.6 KiB
Verilog

/* Copyright 2023 (C) Peter McGoron
* This file is a part of Upsilon, a free and open source software project.
* For license terms, refer to the files in `doc/copying` in the Upsilon
* source distribution.
*/
`include "control_loop_cmds.vh"
module control_loop_sim_top #(
parameter ADC_WID = 18,
parameter ADC_WID_SIZ = 5,
parameter ADC_POLARITY = 1,
parameter ADC_PHASE = 0,
parameter DAC_POLARITY = 0,
parameter DAC_PHASE = 1,
parameter DAC_DATA_WID = 20,
parameter DAC_WID = 24,
parameter DAC_WID_SIZ = 5,
parameter CONSTS_WHOLE = 21,
parameter CONSTS_FRAC = 43,
`define CONSTS_WID (CONSTS_WHOLE + CONSTS_FRAC)
parameter CONSTS_SIZ = 7,
parameter DELAY_WID = 16
)(
input clk,
input rst_L,
output in_loop,
output [DAC_DATA_WID-1:0] curset,
output dac_err,
input [ADC_WID-1:0] measured_value,
output request,
input fulfilled,
output adc_err,
input [`CONSTS_WID-1:0] word_into_loop,
output [`CONSTS_WID-1:0] word_outof_loop,
input start_cmd,
output finish_cmd,
input [`CONTROL_LOOP_CMD_WIDTH-1:0] cmd
);
/* Emulate a control loop environment with simulator controlled
SPI interfaces.
*/
wire adc_miso;
wire adc_sck;
wire adc_ss_L;
/* ADC */
adc_sim #(
.WID(ADC_WID),
.WID_LEN(5),
.POLARITY(ADC_POLARITY),
.PHASE(ADC_PHASE)
) adc (
.clk(clk),
.rst_L(rst_L),
.indat(measured_value),
.request(request),
.fulfilled(fulfilled),
.err(adc_err),
.miso(adc_miso),
.sck(adc_sck),
.ss_L(adc_ss_L)
);
wire dac_miso;
wire dac_mosi;
wire dac_ss_L;
wire dac_sck;
/* DAC */
dac_sim #(
.WID(DAC_WID),
.DATA_WID(DAC_DATA_WID),
.WID_LEN(5),
.POLARITY(DAC_POLARITY),
.PHASE(DAC_PHASE)
) dac (
.clk(clk),
.rst_L(rst_L),
.curset(curset),
.mosi(dac_mosi),
.miso(dac_miso),
.sck(dac_sck),
.ss_L(dac_ss_L),
.err(dac_err)
);
control_loop #(
.ADC_WID(ADC_WID),
.ADC_WID_SIZ(ADC_WID_SIZ),
.ADC_POLARITY(ADC_POLARITY),
.ADC_PHASE(ADC_PHASE),
/* Keeping cycle half wait and conv wait the same
* since it doesn't matter for this simulation */
.CONSTS_WHOLE(CONSTS_WHOLE),
.CONSTS_FRAC(CONSTS_FRAC),
.CONSTS_SIZ(CONSTS_SIZ),
.DELAY_WID(DELAY_WID),
.DAC_WID(DAC_WID),
.DAC_WID_SIZ(DAC_WID_SIZ),
.DAC_DATA_WID(DAC_DATA_WID),
.DAC_POLARITY(DAC_POLARITY),
.DAC_PHASE(DAC_PHASE)
) cloop (
.clk(clk),
.rst_L(rst_L),
.in_loop(in_loop),
.dac_mosi(dac_mosi),
.dac_miso(dac_miso),
.dac_ss_L(dac_ss_L),
.dac_sck(dac_sck),
.adc_miso(adc_miso),
.adc_conv_L(adc_ss_L),
.adc_sck(adc_sck),
.word_in(word_into_loop),
.word_out(word_outof_loop),
.start_cmd(start_cmd),
.finish_cmd(finish_cmd),
.cmd(cmd)
);
`ifdef VERILATOR
initial begin
$dumpfile("control_loop.fst");
$dumpvars;
end
`endif
endmodule
`undefineall