内容介绍
内容介绍
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。
故可以使用FPGA生成PWM波,监听C_OUT输入。如果C_OUT发生跳变,则当前电压就可以确定。
实现方式
- 顶层文件
顶层主要实现了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
- OLED模块
OLED通过状态机实现屏幕刷新、汉字显示等功能。代码位于附件中。
- 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的倍数进行计算,避免了小数的处理。
- 比较器模块
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模块的状态。
真机演示
同时,可以看到红色和绿色的LED等随着电压发生变化。
系统框图
资源使用量
心得体会
iCE40UP5K扩展性非常强大,可以实现多样的功能,在此感谢硬核团队的技术支持。使用比较器来实现ADC功能比较具有创意。
软硬件
附件下载
ADC.zip
ADC_impl_1.rbt
团队介绍
团队成员
cjmf
评论
0 / 100
查看更多
猜你喜欢
基于小脚丫FPGA_利用ADC制作一个数字电压表本项目使用小脚丫的FPGA平台,将模拟电压转换成数字电压,并在oled上进行显示,同时,可通过电位器实现电压0-3.3V可调
wangweiwei
1508
基于ICE40UP5K的FPGA学习平台 制作数字电压表利用ADC制作一个数字电压表,旋转电位计可以产生0-3.3V的电压,利用板上的串行ADC对电压进行转换,将电压值在板上的OLED屏幕上显示出来。
大风吹
1353
用iCE40UP5K的FPGA学习平台制作一个数字电压表用iCE40UP5K的FPGA学习平台板载的FPGA和高速比较器完成ADC的电路。扩展板上的旋转电位计提供0-3.3V的电压,通过ADC进行数字转换并在OLED上进行显示。
MMA
951