blob: 9ffbc80f22b3c27163d3ed7b4d4cdaa9062077d5 [file] [log] [blame]
// Copyright lowRISC contributors.
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
// SPDX-License-Identifier: Apache-2.0
//############################################################################
//
// *Name: adc
// *Module Description: Analog/Digital Converter
//
//############################################################################
`timescale 1ns/1ps
module adc #(
parameter int AdcDataWidth = 10,
parameter int AdcChannels = 2,
parameter int AdcCnvtClks = 44
) (
input [AdcChannels-1:0] adc_ai, // One signal per channel
input [AdcChannels-1:0] adc_chnsel_i, // Onehot value only for selrction
input adc_pd_i,
input clk_adc_i,
input rst_adc_ni,
output logic [AdcDataWidth-1:0] adc_d_o,
output logic adc_d_val_o
);
// Behavioral Model
logic [8-1:0] ConvertCount;
logic [8-1:0] cnv_cnt;
logic [AdcChannels-1:0] cnv_chnsel;
logic chn_selected;
logic rst_pd_adc_n;
// 2 ahalog channels as digital for testing
logic [AdcDataWidth-1:0] adc_a_chn0;
logic [AdcDataWidth-1:0] adc_a_chn1;
assign ConvertCount = AdcCnvtClks[8-1:0]; // 44
assign adc_a_chn0 = {AdcDataWidth{1'b0}}; // All '0'
assign adc_a_chn1 = {AdcDataWidth{1'b1}}; // All '1'
assign chn_selected = |(adc_chnsel_i[AdcChannels-1:0]);
assign rst_pd_adc_n = rst_adc_ni && ~adc_pd_i;
always_ff @( posedge clk_adc_i, negedge rst_pd_adc_n ) begin
if (!rst_pd_adc_n ) begin
cnv_cnt <= 8'h00;
cnv_chnsel <= {AdcChannels{1'b0}};
adc_d_o <= {AdcDataWidth{1'b0}};
adc_d_val_o <= 1'b0;
end
else if ( !chn_selected ) begin
cnv_cnt <= 8'h00;
cnv_chnsel <= {AdcChannels{1'b0}};
adc_d_val_o <= 1'b0;
end
else if ( cnv_cnt != ConvertCount ) begin
cnv_chnsel <= adc_chnsel_i[AdcChannels-1:0];
cnv_cnt <= cnv_cnt + 1'b1;
adc_d_val_o <= 1'b0;
end
else begin
adc_d_o <= (cnv_chnsel == 2'b00) ? adc_d_o :
(cnv_chnsel == 2'b01) ? adc_a_chn0 :
(cnv_chnsel == 2'b10) ? adc_a_chn1 : {AdcDataWidth{1'bx}};
adc_d_val_o <= 1'b1;
end
end
endmodule // of adc