一、项目介绍
本项目基于Lattice MXO2的小脚丫FPGA核心版type-C接口开发板,在web IDE环境下进行verilog代码编程,主要使用中断进行按键消抖、创建计数器和寄存器的方法以驱动板载的七段显示数码管作为输出设备,设计实现了一个两位数秒表具有从0到9.9秒的计数功能,秒表开始后以每0.1秒一次递增,可用板载的四个按键对秒表开始、停止、增量和清零控制。
二、硬件介绍
STEP小脚丫FPGA学习平台是苏州思得普信息科技公司专门针对FPGA初学者(尤其是学习数字电路的在校同学)打造的一系列性价比最高、学习门槛最低的学习模块系列。本项目采用小脚丫FPGA核心板上板载资源的两位7段数码管及4路按键即可完成项目需求。以下是核心板的硬件组成:
核心器件:Lattice LCMXO2-4000HC-4MG132
- 板载资源:
- 两位7段数码管;
- 两个RGB三色LED;
- 8路用户LED;
- 4路拨码开关;
- 4路按键;
- 36个用户可扩展I/O(其中包括一路SPI硬核接口和一路I2C硬核接口)
- 支持的开发工具思德普开发的Web IDE以及Lattice官方提供的Diamond
- 支持MICO32/8软核处理器以及RISC-V软核
- 板上集成FPGA编程器,采用U盘的模式
- 一路USB Type C接口,可用于给核心板供电、给FPGA下载JED文件以及同上位机通过UART通信
- 板卡尺寸52mm x 18mm。
三、项目需求
基于Lattice MXO2的小脚丫FPGA核心板 -Type C接口开发板通过小脚丫FPGA核心板上的2个数码管和4路按键制作一个秒表,通过按键来控制秒表的功能,并在数码管上显示数值。
使用七段显示器作为输出设备,在小脚丫FPGA核心板上创建一个2位数秒表。 秒表应从 0.0 秒计数到 9.9秒,然后翻转,计数值每0.1秒精确更新一次。
秒表使用四个按钮输入:开始、停止、增量和清除(重置)。 开始输入使秒表开始以10Hz时钟速率递增(即每0.1秒计数一次); 停止输入使计数器停止递增,但使数码管显示当前计数器值; 每次按下按钮时,增量输入都会导致显示值增加一次,无论按住增量按钮多长时间; 复位/清除输入强制计数器值为零。
四、需求分析
本次具有启动、停止、递增和清除功能的秒表项目的设计硬件部分只需要用到开发上板载上两位7段数码管以及4路控制按键,基于小脚丫开发板利用WebIDE进行verilog代码编写,逻辑综合,管脚分配,再进行仿真验证,最后进行FPGA映射即可下载文件,移动到开发板中存储器里就可进行验证。
五、实现方式
基于 Lattice MXO2的小脚丫FPGA核心板 -Type C接口开发板,利用板载的两位7段数码管以及4路控制按键的硬件资源,利用WebIDE或Diamond进行秒表的Verilog代码编写,逻辑综合,管脚分配,FPGA映射及仿真,下载至开发板中即可实现。
秒表的功能实现主要依托于板载的时钟计时,利用晶振产生的周期性震荡信号进行时钟计时,创建计数器对时钟信号进行计数,同时利用寄存器存储数码管数据,并译码输出显示,对于四个按键的状态数据采集,采用了中断定时器进行消抖处理,一方面简化了代码,降低了FPGA资源占用,另一方面,提高了消抖处理的准确度。
六、功能框图
七、代码及说明
7.1输入输出定义
定义输入的参数,时钟,4路按键模块(K1开始、K2停止、K3递增、K4清零)
input wire CLK, // Clock input
input wire STA, // Start signal input
input wire PAU, // Pause signal input
input wire INC, // Increase counter value signal input
input wire REST, // Reset signal input
output reg [8:0] Digital_tube_1, // Digit tube 1 output
output reg [8:0] Digital_tube_2); // Digit tube 2 output
7.2启停标志位设定
设置启动停止的标志位,以便在检测到按键按下时启动或者停止模块的工作状态,递增和清零按键同理。
always @(negedge STA or negedge PAU) begin // Execute when STA or PAU falls
if (!STA) STA_flag <= 4'd1; // Set start flag to 1 if STA is low
else STA_flag <= 4'd0; // Otherwise, set to 0
end
7.3按键条件判定及中断消抖
下列代码显示了在时钟上升沿,当重置按钮按下或增量按钮按下时,会调用相应的模块(如计数器)执行相对应的任务,对数码管进行显示控制。
always @(posedge CLK or negedge REST or negedge INC) begin // Execute on clock rising edge or falling edge of REST/INC
if (!REST) begin // If reset signal is low
counter <= 4'd0; // Reset counter
Digital_tube_data_1 <= 4'd0; // Reset data for digit tube 1
Digital_tube_data_2 <= 4'd0; // Reset data for digit tube 2
end else if (!INC) begin // If increase signal is low
INC_flag <= 4'd1; // Set increase flag to 1
end else begin // Otherwise
if (STA_flag) begin // If start flag is true
if (counter == 24'd1200000) begin // If counter reaches 1200000
counter <= 4'd0; // Reset counter
increment_display(); // Call increment display task
end else begin // Otherwise
counter <= counter + 1; // Increment counter
end
end else if (INC_flag) begin // If increase flag is true
INC_flag <= 4'd0; // Reset increase flag
increment_display(); // Call increment display task
end
end
end
7.4数码管译码驱动
计数器上传计数,处理后生成数码管数据存储至寄存器中,通过译码输出驱动数码管显示对应数值。
always @(*) begin // Digit tube 1 display control
case (Digital_tube_data_1)
4'd0: Digital_tube_1 = 9'hbf; // Display mode for digit 0
………
4'd9: Digital_tube_1 = 9'hef; // Display mode for digit 9
endcase
end
always @(*) begin // Digit tube 2 display control
case (Digital_tube_data_2)
4'd0: Digital_tube_2 = 9'h3f; // Display mode for digit 0
………
4'd9: Digital_tube_2 = 9'h6f; // Display mode for digit 9
endcase
end
PS:展示视频在拍摄时有些仓促,在FPGA管脚分配时将23管脚颠倒了,导致在输出显示时部分数字不太正确,此bug在后期修改中已更正,大家可自行注意分配细节。另外,在后期的修改中对代码进行了部分标准化和美化,看起来更加直观,清晰。见附件。
八、仿真波形图
基于WebIDE对时钟部分进行仿真验证,波形如下:
由于其他部分在webIDE上仿真报错,需要用到Diamond软件进行仿真,因个人原因无法进行仿真处理,源文件在附件,感兴趣的小伙伴可下载进行仿真试试,也欢迎随时交流沟通。
九、GPT的使用
我们可以利用AI大模型帮助我们进行部分模块代码以及仿真代码的书写,还可以利用GPT帮助我们进行代码纠错和美化,提高工作效率。
十、FPGA资源利用说明
以下是本次设计的FPGA资源利用情况:
寄存器数量:4635个中的49个(1%)
PFU(可编程功能单元)寄存器:4320个中的49个(1%)
PIO(并行输入/输出)寄存器:315个中的0个(0%)
SLICE数量:2160个中的37个(2%)
作为逻辑/ROM的SLICE数量:2160个中的37个(2%)
作为RAM的SLICE数量:1620个中的0个(0%)
作为Carry的SLICE数量:2160个中的13个(1%)
LUT4数量:4320个中的73个(2%)
作为逻辑LUT的数量:47个
作为分布式RAM的数量:0个
作为串行逻辑的数量:26个
作为移位寄存器的数量:0个
使用的PIO站点数量:105个中的23个+4个(JTAG)(26%)
块RAM数量:10个中的0个(0%)
GSR数量:1个中的1个(100%)
十一、完成效果展示
以下是完成效果,下载后可以正常进行工作,按键也可以正常进行开始、停止、递增和清零操作。
十二、主要难题及解决方法
本次项目的难点在于4个实体按键的消抖处理以及代码逻辑的转换,在按键的消抖方面,采用了中断的方式进行消抖处理,这样既可以简化代码,也可以降低FPGA的利用资源占用。代码逻辑的转换是创建了一个寄存器,将生成的数码管数据存储到寄存器,再译码出来驱动数码管显示相应的数值,相较于单一的数码管驱动方案,此方案更加简洁高效。
十三、未来计划及建议
FPGA芯片是通过现场编程实现任意电路功能的通用集成电路芯片,芯片出厂时没有特定的功能,通过FPGA专用EDA软件现场对硬件进行编程就可以实现具体用户需要的功能。FPGA芯片因为其现场可编程的灵活性和不断提升的电路性能,应用领域非常丰富。
基于本次Lattice MXO2的小脚丫FPGA核心板的寒假训练,借助AI大模型的帮助对代码进行了优化和仿真书写,FPGA的代码以及逻辑相比于传统的C语言代码更加灵活,但确实对于人的思维转变有一定帮助。以后我将基于这块FPGA开发板,做做其他的项目,比如控制rgb灯,驱动屏幕以及电机控制。FPGA的前景非常广阔,相信在未来能掌握FPGA技术的青年工程师们一定大有可为!