dual-mcp3201-pmod-fw/source/dual_mcp3201_pmod.sv
2021-02-02 23:54:49 +03:00

78 lines
1.9 KiB
Systemverilog

`timescale 1ns/100ps
`default_nettype none
`define MULTICHANNEL_VERSION
module dual_mcp3201_pmod #(parameter CLOCK_FREQ = 25000000,
parameter SAMPLE_RATE = 50000)
(input wire clock,
input wire reset,
output wire radc_ssn,
output wire radc_clk,
input wire radc_dat,
output wire ladc_ssn,
output wire ladc_clk,
input wire ladc_dat,
output wire [11:0] rdata,
output wire rstrb,
output wire [11:0] ldata,
output wire lstrb);
`ifdef MULTICHANNEL_VERSION
/* Multichannel and sample rate accurate version */
localparam SPI_SCLK_FREQ = 1000000;
mcp3201_ma #(.CHANNELS(2),
.CLOCK_FREQ(CLOCK_FREQ),
.SCLK_FREQ(SPI_SCLK_FREQ),
.SAMPLE_RATE(SAMPLE_RATE)) adcs
(.clock, .reset,
.spi_clk_o(radc_clk),
.spi_ssn_o(radc_ssn),
.spi_miso_i({ radc_dat, ladc_dat }),
.data_o({ rdata, ldata }),
.strb_o(rstrb));
assign ladc_clk = radc_clk;
assign ladc_ssn = radc_ssn;
assign lstrb = rstrb;
`else
/* Single channel inaccurate version */
localparam MCP3201_CLOCK_PER_SAMPLE = 17;
localparam SCLK_FREQ = SAMPLE_RATE * MCP3201_CLOCK_PER_SAMPLE;
logic spi_clk;
spi_sclk_gen #(.CLOCK_FREQ(CLOCK_FREQ),
.SCLK_FREQ(SCLK_FREQ)) spi_sclk_gen_impl
(.clock, .reset,
.sclk_o(spi_clk));
mcp3201 adc_left
(.clock, .reset,
.spi_clk_i(spi_clk),
.spi_ssn_o(ladc_ssn),
.spi_miso_i(ladc_dat),
.data_o(ldata),
.strb_o(lstrb));
mcp3201 adc_right
(.clock, .reset,
.spi_clk_i(spi_clk),
.spi_ssn_o(radc_ssn),
.spi_miso_i(radc_dat),
.data_o(rdata),
.strb_o(rstrb));
assign ladc_clk = spi_clk;
assign radc_clk = spi_clk;
`endif
endmodule // dual_mcp3201_pmod