diff --git a/SL_ADC_8bits/flist/sl_adc_8bits_ip.flist b/SL_ADC_8bits/flist/sl_adc_8bits_ip.flist
new file mode 100644
index 0000000000000000000000000000000000000000..046d7cb0d6fff20959f7e0ed7b7ec8b0ca70f7ec
--- /dev/null
+++ b/SL_ADC_8bits/flist/sl_adc_8bits_ip.flist
@@ -0,0 +1,2 @@
+$(SOCLABS_NANOSOC_TECH_DIR)/nanosoc/sl_ams_tech/SL_ADC_8bits/logical/soclabs_adc.v
+$(SOCLABS_NANOSOC_TECH_DIR)/nanosoc/sl_ams_tech/SL_ADC_8bits/logical/soclabs_adc_8bits.vams
\ No newline at end of file
diff --git a/SL_ADC_8bits/logical/soclabs_adc.v b/SL_ADC_8bits/logical/soclabs_adc.v
new file mode 100644
index 0000000000000000000000000000000000000000..18b55d4f1836c54b9c38332bf3779a6a8c3d12a6
--- /dev/null
+++ b/SL_ADC_8bits/logical/soclabs_adc.v
@@ -0,0 +1,146 @@
+`include "constants.vams"
+`include "disciplines.vams"
+
+`default_discipline logic
+module soclabs_adc (
+    input  wire             PCLK,     
+    input  wire             PCLKG,    
+    input  wire             PRESETn,  
+    input  wire             PSEL,     
+    input  wire [9:0]       PADDR,    
+    input  wire             PENABLE,  
+    input  wire             PWRITE,   
+    input  wire [31:0]      PWDATA,   
+    output wire [31:0]      PRDATA,   
+    output wire             PREADY,   
+    output wire             PSLVERR, 
+
+    input         EXTIN,    
+    output wire             ADCINT
+);
+
+reg [31:0]  DATA_reg;
+reg [31:0]  STATUS_reg;
+reg [7:0]   ENABLE_reg;
+reg [31:0]  CLK_DIV;
+reg [63:0]  ID_reg = 64'h534C_0061_6463_0008;
+
+reg [31:0] PRDATA_reg;
+reg [31:0] counter;
+reg PSLVERR_reg;
+reg  adc_clk_reg;
+wire adc_clk;
+wire [7:0] data;
+wire READY;
+reg CLR_READY_reg;
+
+assign PRDATA = PRDATA_reg;
+assign PSLVERR = PSLVERR_reg;
+
+
+// Clock divider
+always @(posedge PCLK or negedge PRESETn) begin
+    if(~PRESETn) begin
+        CLK_DIV <= 32'd10;
+        ENABLE_reg <= 8'd0;
+        counter <= 32'd0;
+        adc_clk_reg <= 1'b0;
+        STATUS_reg<= 32'd0;
+    end else begin
+        STATUS_reg<={31'd0, READY};
+        DATA_reg <= {24'd0, data};
+        counter <= counter + 1;
+        if(counter == CLK_DIV) begin
+            adc_clk_reg <= ~adc_clk_reg;
+            counter <= 32'd0;
+        end
+    end
+end
+
+assign adc_clk = adc_clk_reg & ENABLE_reg[0];
+
+// APB interface
+localparam  APB_IDLE = 2'd0,
+            APB_WRITE = 2'd1,
+            APB_READ = 2'd2;
+
+reg [1:0] apb_current_state;
+reg [1:0] apb_next_state;
+
+always @(posedge PCLK or negedge PRESETn) begin
+    if(~PRESETn) begin
+        apb_current_state <= APB_IDLE;
+        PSLVERR_reg <= 1'b0;
+    end else begin
+        apb_current_state <= apb_next_state;
+    end
+end
+
+always @(*) begin
+    case(apb_current_state)
+        APB_IDLE: begin
+            CLR_READY_reg = 1'b0;
+            PSLVERR_reg = 1'b0;
+            if(PSEL) begin
+                if(PWRITE) begin
+                    apb_next_state = APB_WRITE;
+                end else begin
+                    apb_next_state = APB_READ;
+                end
+            end
+            else begin
+                apb_next_state = APB_IDLE;
+            end
+        end
+        APB_WRITE: begin
+            case(PADDR)
+                10'h000: PSLVERR_reg = 1'b1;
+                10'h001: PSLVERR_reg = 1'b1;
+                10'h002: CLK_DIV = PWDATA;
+                10'h003: ENABLE_reg = PWDATA[7:0];
+                10'h3F0: PSLVERR_reg = 1'b1;
+                10'h3F1: PSLVERR_reg = 1'b1;
+                10'h3F2: PSLVERR_reg = 1'b1;
+                10'h3F3: PSLVERR_reg = 1'b1;
+                10'h3F4: PSLVERR_reg = 1'b1;
+                10'h3F5: PSLVERR_reg = 1'b1;
+                10'h3F6: PSLVERR_reg = 1'b1;
+                10'h3F7: PSLVERR_reg = 1'b1;
+            endcase
+            apb_next_state = APB_IDLE;
+        end
+        APB_READ: begin
+            case(PADDR)
+                10'h000: begin
+                    PRDATA_reg = DATA_reg;
+                    CLR_READY_reg = 1'b1;
+                end
+                10'h001: PRDATA_reg = STATUS_reg;
+                10'h002: PRDATA_reg = CLK_DIV;
+                10'h003: PRDATA_reg = {24'd0, ENABLE_reg};
+                10'h3F0: PRDATA_reg = {24'd0, ID_reg[63:56]};
+                10'h3F1: PRDATA_reg = {24'd0, ID_reg[55:48]};
+                10'h3F2: PRDATA_reg = {24'd0, ID_reg[47:40]};
+                10'h3F3: PRDATA_reg = {24'd0, ID_reg[39:32]};
+                10'h3F4: PRDATA_reg = {24'd0, ID_reg[31:24]};
+                10'h3F5: PRDATA_reg = {24'd0, ID_reg[23:16]};
+                10'h3F6: PRDATA_reg = {24'd0, ID_reg[15:8]};
+                10'h3F7: PRDATA_reg = {24'd0, ID_reg[7:0]};
+                default: PRDATA_reg = 32'hDEADDEAD;
+            endcase 
+            apb_next_state = APB_IDLE;
+        end
+    endcase
+end
+
+assign PREADY = (apb_current_state==APB_READ|apb_current_state==APB_WRITE)? 1'b1:1'b0;
+
+soclabs_adc_8bits u_adc_8bits(
+    .adc_clk(adc_clk),
+    .resetn(PRESETn),
+    .READY(READY),
+    .CLR_READY(CLR_READY_reg),
+    .DATA(data)
+);
+
+endmodule
\ No newline at end of file
diff --git a/SL_ADC_8bits/logical/soclabs_adc_8bits.vams b/SL_ADC_8bits/logical/soclabs_adc_8bits.vams
new file mode 100644
index 0000000000000000000000000000000000000000..f7b1c5d4b247c847356fa63ced2076279040abc9
--- /dev/null
+++ b/SL_ADC_8bits/logical/soclabs_adc_8bits.vams
@@ -0,0 +1,75 @@
+`include "constants.vams"
+`include "disciplines.vams"
+
+`default_discipline logic
+module soclabs_adc_8bits (          
+    input  wire             adc_clk,
+	input  wire  			resetn,
+    output wire  [7:0]      DATA,
+	output wire 			READY,
+	input  wire 			CLR_READY,
+    input                   EXTIN,    
+    output wire             ADCINT
+	);
+parameter integer bits = 8;// from [1:24];	// resolution (bits)
+parameter real fullscale = 1.2;		// input range is from 0 to fullscale (V)
+parameter real td = 0.01;			// delay from clock to output (ns)
+electrical EXTIN;
+real sample, midpoint, cmp;
+integer i;
+reg [bits-1:0] buffer;
+reg [bits-1:0] out;
+reg READY_reg;
+assign READY=READY_reg;
+
+assign DATA=out;
+assign midpoint = fullscale/2.0;
+
+real int_in;
+assign int_in = 0.6*sin(2*3.14159265358979323846*100*$abstime)+0.6;
+electrical n1;
+parameter real gain = 0.6, freq = 1000.0;
+localparam real omegac = 2.0 * 3.14159 * freq;
+analog V(n1) <+ gain * sin(idt(omegac,0.0))+0.6;
+
+assign cmp = buffer[7]*(fullscale/2.0) + buffer[6]*(fullscale/4.0) + buffer[5]*(fullscale/8.0) + buffer[4]*(fullscale/16.0)
+	 + buffer[3]*(fullscale/32.0) + buffer[2]*(fullscale/64.0) + buffer[1]*(fullscale/128.0) + buffer[0]*(fullscale/256.0);
+always @(posedge adc_clk or negedge resetn) begin
+	if(~resetn) begin
+		i <= 7;
+		buffer <= 8'h80;
+		out <= 8'h00;
+		READY_reg <= 0;
+	end else begin
+		if (CLR_READY)
+			READY_reg<=1'b0;
+		if(i==0) begin
+			if (sample>cmp) 
+				out <= {buffer[7:1], 1'b1};
+			else
+				out <= {buffer[7:1], 1'b0};
+			buffer <= 8'h80;
+			i <= 7;
+			sample = V(n1);
+			READY_reg <= 1'b1;
+		end else begin
+			if (sample>cmp) 
+				buffer[i]<=1'b1;
+			else
+				buffer[i]<=1'b0;
+			if(i!=0)
+				buffer[i-1]<=1'b1;
+			i <= i-1;
+		end
+	end
+end
+
+always @(posedge adc_clk or posedge CLR_READY) begin
+	if(CLR_READY)
+		READY_reg <= 1'b0;
+	else
+		if(i==0)
+			READY_reg <= 1'b1;
+end
+
+endmodule
\ No newline at end of file
diff --git a/SL_ADC_8bits/verif/makefile b/SL_ADC_8bits/verif/makefile
new file mode 100644
index 0000000000000000000000000000000000000000..625ceeedc3670cfe7f5f248d08e0274d1b527151
--- /dev/null
+++ b/SL_ADC_8bits/verif/makefile
@@ -0,0 +1,8 @@
+compile_vcs:
+	vcs -ad -ams soclabs_adc_tb.vams soclabs_adc.vams -debug_access+all -kdb > compile.log
+
+sim_vcs:
+	./simv -gui
+
+compile_mti:
+	vlog -vams soclabs_adc_tb.vams 
\ No newline at end of file
diff --git a/SL_ADC_8bits/verif/soclabs_adc_tb.vams b/SL_ADC_8bits/verif/soclabs_adc_tb.vams
new file mode 100644
index 0000000000000000000000000000000000000000..e398fe5424d31967748c75c29cad80a64fe4a969
--- /dev/null
+++ b/SL_ADC_8bits/verif/soclabs_adc_tb.vams
@@ -0,0 +1,24 @@
+`timescale 10ns / 10ps
+`include "disciplines.vams"
+`default_discipline logic
+
+module testbench ();
+    electrical gnd;
+    ground gnd;
+    reg clk;
+    wire [0:7] out;
+    integer ii;
+    reg [0:7] plot_out; 
+
+    initial clk=0;
+
+    always #1 clk=~clk;
+
+    always @(out) for (ii=0; ii<8; ii=ii+1) plot_out[ii] <= out[7-ii];
+
+    soclabs_adc adc0 (
+        .PCLK(clk),
+        .EXTIN(in),
+        .PRDATA(out));
+    vsource #(.type("sine"), .ampl(0.5), .dc(0.5), .freq(0.5M)) v0 (in, gnd);
+endmodule
diff --git a/vcsAD.init b/vcsAD.init
new file mode 100644
index 0000000000000000000000000000000000000000..b7d069c0445b36c224bd1cb4659430500870dd96
--- /dev/null
+++ b/vcsAD.init
@@ -0,0 +1 @@
+choose xa;
\ No newline at end of file