基于iCE40UP5K的FPGA学习平台——利用ADC制作一个数字电压表
基于iCE40UP5K的FPGA学习平台——利用ADC制作一个数字电压表
标签
FPGA
ICE40UP5K
2022寒假在家练
cjmf
更新2022-03-03
中国计量大学
1101

iCE40UP5K及开发板简介

iCE40UP5K由于其独特的性能得到海外创客们的热捧,尤其是其支持开源的开发工具链。不少RISC-V软核都是运行在iCE40UP5K上,基于这个大背景我们开发了一款FPGA核心模块,主要特点:

  • 兼容树莓派基金会刚推出的Pico模块的管脚定义,Pico的GPIO性能比较强大,因此玩家可以对比Pico和FPGA IO管脚的使用,另外也可以借助位PICO推出的各种外设模块(本模块没有串行ADC的功能,只能支持数字端口的模块);
  • 板上集成了基于DAPLink下载功能的STEPLINK功能,可以直接通过USB端口对FPGA的串行Flash进行配置,并可以通过同一个USB端口支持UART通信;
  • 有开源的RISC-V可以移植使用,进而学习在FPGA上完成软核+FPGA的异构设计

 

思路

由于开发板内没有提供ADC芯片,只提供了比较器。所以考虑使用比较器来实现ADC功能。

其中,可以发现旋转电位器的引脚接在了Ain输入,IO输出接在了PWM输入,C_OUT输出接入了FPGA。

FvaGwbboLrcqGHU2jmLbzjrzpoc3

故可以使用FPGA生成PWM波,监听C_OUT输入。如果C_OUT发生跳变,则当前电压就可以确定。

 

实现方式

  1. 顶层文件

顶层主要实现了OLED、PWM、比较器、PLL等模块的例化与连接。

通过引出PWM模块至两个LED灯,用于观察当前运行状态。

module top(
         input				clk_in,		//系统时钟
         input				rst_n_in,	//系统复位,低有效
         input				c_out,

         output				oled_rst,	//OLCD液晶屏复位
         output				oled_dcn,	//OLCD数据指令控制
         output				oled_clk,	//OLCD时钟信号
         output				oled_dat,	//OLCD数据信号

         output				pwm,
         output  			led_1,
         output 			led_2
       );

wire clk_out, lock;

wire[31:0] res,res2;
wire[47:0] char;
wire[7:0] bai,shi,ge;
assign res=33-res2/2;
assign bai = res/100,shi=res/10%10,ge=res%10;
assign char = {"<",shi,".",ge,"V",">"};
assign led_2=~led_1;

OLED12864	OLED12864_u1 (
            .clk     (clk_out) ,
            .rst_n   (rst_n_in),
            .oled_rst(oled_rst),
            .oled_dcn(oled_dcn),
            .oled_clk(oled_clk),
            .oled_dat(oled_dat),
            .nb(char)
          );

pll2 pll2_ul(
       .ref_clk_i(clk_in),
       .rst_n_i(1'b1),
       .outglobal_o(clk_out)
     );

TP1961TR TP1961TR_ul(
           .clk(clk_out),
           .c_out(c_out),
           .pwm2(pwm),
           .res(res2),
           .lock(lock)
         );

pwm_module ledd(
             .clk(clk_out),
             .pwm(led_1),
             .sum_in(res2)
           );

endmodule
  1. OLED模块

OLED通过状态机实现屏幕刷新、汉字显示等功能。代码位于附件中。

  1. PWM模块
module pwm_module(
	input					clk,
	input [31:0]			sum_in,
	output 					pwm
	);

reg [31:0] count=32'd0, sum=32'd0;

assign pwm=count>sum ? 1'b1 : 1'b0;


always@ (posedge clk)
begin
	if (count>=32'd66)
		begin
			count<=0;
			sum<=sum_in;
		end
	else
		begin
			count<=count+1;
		end
end

endmodule

PWM波模块采用时沿触发。由于电压为3.3V,故直接选用33的倍数进行计算,避免了小数的处理。

 

  1. 比较器模块
module TP1961TR(
         input					clk,
         input					c_out,
         output					pwm2,
         output reg				lock,
         output reg[31:0]		res
       );

reg [31:0] sum_in=32'd0;

pwm_module pwm_ul(
             .clk(clk),
             .pwm(pwm2),
             .sum_in(sum_in)
           );

reg [31:0] div=32'd0;

always@ (posedge clk)
  begin
    if(div<32'd66*10)
      begin
        div<=div+1;
      end
	else
	  begin
		div<=32'd0;
		if(c_out==1'b1)
		  begin
			res<=sum_in;
			lock<=1'b1;
			sum_in<=32'd0;
		  end
		  else
			begin
			if(sum_in>=32'd66)
				sum_in<=32'd0;
			else
				sum_in<=sum_in+1;
			end
	  end
  end

endmodule

比较器模块监听C_OUT跳变,并及时记录跳变发生时PWM模块的状态。

 

真机演示

FqgjVvM54JEkEaCg2VHqj5dgH6yPFhUQosvSXKCDkKLLcWIGK1To-26eFvQOkG_evwTIoDa77CPjIzFH9wMp

同时,可以看到红色和绿色的LED等随着电压发生变化。

 

系统框图

 

FiOkvER_CUZCy91RgcbcUID1w7mK

 

资源使用量

 

FueNLdk6TMkhOL8ybz8LG8lZ4i0U

 

心得体会

iCE40UP5K扩展性非常强大,可以实现多样的功能,在此感谢硬核团队的技术支持。使用比较器来实现ADC功能比较具有创意。

附件下载
ADC.zip
ADC_impl_1.rbt
团队介绍
团队成员
cjmf
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号