基于安路SF102开发板的呼吸灯的设计与实现

一.SF102开发板简介

       SF102开发板主芯片为SF1S60CG121I器件,SF1系列FPSoC器件采用低功耗工艺,以单芯片实现FPGA和RISC-V芯片优势的融合,包含大容量存储资源(PSRAM)及其硬核控制器,6K逻辑资源,集成了MIPI硬核,支持单芯片加载、上电快速启动、非易失性存储等技术,同时RISC-V上集成AHB Slave、SPI、I2C、UART和GPIO等丰富的外设资源。

板载资源:

- 等效 LUT4 逻辑规模为 5824

- 支持分布式和嵌入式存储器

- 源同步输入/输出接口

- 支持 LVTTL33,LVCMOS(3.3/2.5/1.8/1.5/1.2V), LVDS(3.3/2.5/1.8)电平标准

- 2.2Gbps per line MIPI 硬核控制器

- 2x64Mb 200MHz 存储器+硬核控制器

- RISC-V MCU 硬核最大主频 160Mhz

- 丰富的片上时钟资源

- 支持多种配置模式

- 64 位 DNA

 还包括:蜂鸣器,TF卡 SPI接口,0.91寸OLED 128x32 分辨率,16个用户IO,USB转串口,3个DPHY接口,FPGA JTAG,25MHz时钟,MCU JTAG,1个DONE指示LED,RGB用户LED,3个用户按键。

二.开发板RGB用户LED灯的硬件电路图

RGB用户LED:

由原理图可知:LED为高电平点亮;

对应引脚:J4 H5 J5;        

三.呼吸灯的原理及Verilog代码实现

  呼吸灯在我们的生活中很常见,在手机上多作为消息提醒指示灯而被广泛使用,其效果是小灯在一段时间内从完全熄灭的状态逐渐变到最亮,再在同样的时间段内逐渐达到完全熄灭的状态,并循环往复。这种效果就像“呼吸”一样,有张有弛,而且给人一种很舒服的感觉。其工作原理是利用PWM来控制小灯在相同时间段内的不同占空比, 即在同样小时间段内,小灯亮的时间依次增加到最大后再依次减小,从而实现渐亮到渐灭的“呼吸”效果。

1.程序模块设计:breath_led

2.Verilog代码:          

module breath_led
(

	input 	wire 		sys_clk	,
    input 	wire		rst_n	,
    
    output 	reg [2:0]	led_out

);

reg [4:0]	cnt_1us	;
reg [9:0]	cnt_1ms	;
reg [9:0] 	cnt_1s	;
reg 		cnt_en	;

always@( posedge sys_clk or negedge rst_n )
	if( rst_n == 1'b0 )
    	cnt_1us <= 5'd0;
    else if( cnt_1us == 5'd24 )
    	cnt_1us <= 5'd0;
    else 
    	cnt_1us <= cnt_1us + 1'b1;

always@( posedge sys_clk or negedge rst_n )
	if( rst_n == 1'b0 )
    	cnt_1ms <= 10'd0 ;
    else if( cnt_1ms == 10'd999 && cnt_1us == 5'd24 )
    	cnt_1ms <= 10'd0;
    else if( cnt_1us == 5'd24 )
    	cnt_1ms <= cnt_1ms + 1'b1;
    else 
    	cnt_1ms <= cnt_1ms;
        
always@( posedge sys_clk or negedge rst_n )
	if( rst_n == 1'b0 )
    	cnt_1s <= 10'd0;
    else if( cnt_1s == 10'd999 && cnt_1ms == 10'd999 && cnt_1us == 5'd24 )
    	cnt_1s <= 10'd0;
    else if( cnt_1ms == 10'd999 && cnt_1us == 5'd24 )
    	cnt_1s <= cnt_1s + 1'b1;
    else
    	cnt_1s <= cnt_1s ;
        
always@( posedge sys_clk or negedge rst_n )
	if( rst_n == 1'b0 )
    	cnt_en <= 1'b0;
    else if( cnt_1s == 10'd999 && cnt_1ms == 10'd999 && cnt_1us == 5'd24 )
    	cnt_en <= ~ cnt_en;
    else 
    	cnt_en <= cnt_en;
        
always@(posedge sys_clk or negedge rst_n)
    if(rst_n == 1'b0)
        led_out <= 3'b111;
    else    if((cnt_en == 1'b1 && cnt_1ms < cnt_1s) || (cnt_en == 1'b0 && cnt_1ms > cnt_1s))
        led_out <= 3'b111;
    else
        led_out <= 3'b000;


endmodule

四.运行结果展示:

RGB用户LED灯呈现呼吸的效果。

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是既白呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值