当前位置:   article > 正文

使用EGO1的FPGA开发板的基于蓝牙的点阵显示系统设计与实现_ego1蓝牙模块

ego1蓝牙模块

目录

一、项目目标

1.设计目标

2.技术指标

二、项目分析

1.需求分析

2.实验原理

三、项目设计

1.系统结构设计

1.1技术方案

1.2设计要点

1.3系统结构图

1.4硬件连接图

1.5系统硬件配置设计(硬件模块介绍)

1.5.1 8×8点阵块LG7088BH

1.5.2 四块点阵级联电路

1.6系统软件配置设计(软件模块介绍)

1.6.1软件原理图

1.6.2分模块介绍

1.6.2.1时钟生成模块

1.6.2.2复位生成模块

1.6.2.3七段数码管显示模块

1.6.2.4信号解析模块

1.6.2.5接收器模块

1.6.2.6字符缓存模块

1.6.2.7滚动显示控制模块

1.6.2.8点阵显示模块

1.6.2.9回环控制模块

1.6.2.10分频模块

 2.系统参数设计

3.系统设计流程

3.1每个模块的说明

3.2模块间的协同逻辑与设计流程

4.实验器材

4.1实验仪器:

4.2实验材料:

4.3实验软件:

5.实验步骤

四、项目实施

1.系统测试流程

1.1仿真testbench代码:

1.2仿真测试结果图 

2.系统实施与调试

2.1实施过程

2.2实施要点

2.3外围电路连接图

2.4点阵显示电路

 2.5软件参数配置

2.6故障排除方法

2.7系统运行操作

2.8实施效果

2.8.1四个点阵屏滚动显示

2.8.2两个点阵屏滚动显示

2.8.3滚动速度改变

2.8.4滚动方向改变

3.系统工程信息

3.1综合阶段分析:

3.2实现阶段分析

五、项目总结与心得体会

1.设计思路与要点:

2.特色与效果:

3.实验对学生的作用:

4.存在的问题与改进方向:


一、项目目标

1.设计目标

        (1)点阵驱动电路设计:使用8×8点阵块LG7088BH,设计外围电路,确保点阵能够被正确驱动。

        (2)FPGA接口设计:使用ego1-J5接口连接FPGA,提供必要的电源和IO驱动。

        (3)点阵显示模块设计:在FPGA内部设计逻辑,用于控制点阵显示汉字或其他图形。

        (4)点阵移动模块设计:通过FPGA内部逻辑控制数据序列,实现在点阵上滚动显示多汉字信息。

        (5)蓝牙模块设计:利用板卡上的蓝牙模块与支持蓝牙4.0的外部设备(本次采用智能手机),进行交互,使用UART串口通信协议处理数据。

        (6)点阵级联电路设计:设计级联4个8×8点阵模块,形成16×16的显示屏。

2.技术指标

        (1)FPGA 功能与接口:FPGA 具备足够的 I/O 端口以驱动 8×8 点阵,同时提供稳定的时钟源和电源管理。ego1-J5-35、36提供3.3V,ego1-J5-33、34提供GND,ego1-J5的其他GPIO提供点阵的驱动IO。

         (2)点阵显示分辨率:采用 8×8 LED 点阵,每个点阵包含 64 个 LED,能够清晰显示单个字符或图形。8×8点阵块LG7088BH,其引脚排列如下。其中L(列)低电平点亮,H(行)高电平点亮。

        (3)蓝牙模块性能:基于 TI CC2541 芯片,支持低功耗蓝牙(BLE)4.0 协议,有效通信距离至少 10 米。

        (4)数据传输与处理速度:蓝牙模块与 FPGA 之间的数据传输速率满足无延迟显示的要求,FPGA 处理数据的速度能够实时更新显示内容。

        (5)显示模式与控制:系统能够在 FPGA 的控制下实现静态显示、垂直滚动多种显示模式。

        (6)耗电量与电源管理:整个系统的功耗控制在合理范围内,电源管理部分能够保证长时间稳定工作。

        (7)实验环境:

           ①硬件环境:联想拯救者Y7000P2021、CPU i7-11800H、GPU RTX3050Ti

           ②软件环境:vivado 2017.4 matlab2023b 立创EDA网页版

二、项目分析

1.需求分析

        (1)项目任务分析:项目的核心任务是创建一个能够通过蓝牙接收信号,并在LED点阵屏上实时显示相应文字和图形的系统。这不仅需要精确的硬件设计,如高效能的FPGA和稳定的蓝牙模块,也需要考虑软件上的数据处理。此外,系统应具备多样化的显示功能,如动态滚动、静态展示等,以适应不同的应用场景。

        (2)综合社会与环境要素的全面考量:在设计过程中,应全面考虑对社会、健康、安全及环境的影响。例如,电磁辐射水平必须符合国际安全标准,以保护用户健康;在材料选择和制造过程中,应着眼于环境保护,减少废物和污染。此外,产品应符合可持续发展的原则,强调长期的可用性和维护的方便性。

        (3)软硬件设计的可行性与创新性分析:在软硬件设计方面,需精心评估各部件的集成与协同工作能力,确保整个系统的稳定性和效率。同时,探索创新的解决方案,以提高系统的性能和用户体验。例如,可以研究如何通过优化FPGA内部逻辑设计来提高数据处理速度,此外也需要设计更为完善稳定的外围硬件电路,使得整个系统的结构更为简单,逻辑更为清晰,使用更加方便。

        (4)优化策略的制定:包括硬件上的改进,如选择更高效能的FPGA芯片或更稳定的蓝牙模块;软件上的优化,如改进数据处理算法以减少延迟,或者开发更加人性化的用户界面;以及成本控制,通过精心的材料和组件选择,实现成本效益的最大化。

2.实验原理

        (1)点阵驱动电路原理:使用8×8点阵块LG7088BH,其工作原理基于行列控制,其中列低电平点亮,行高电平点亮。通过对行列电平的精确控制,可以实现复杂图案和文字的显示。

        (2)FPGA接口原理:FPGA提供必要的电源和IO驱动。通过利用ego1-J5接口的多个GPIO,FPGA可以有效驱动点阵显示。

        (3)点阵显示模块原理:基于FPGA内部逻辑,实现对LED点阵的控制。汉字和图形首先被转化为8×8的像素点阵图,然后通过FPGA编程实现这些图案的显示。

        (4)点阵移动模块原理:通过FPGA内部逻辑控制数据序列的释放,实现汉字信息在点阵上的滚动显示。控制数据序列的地址指针可以调节滚动速度和显示稳定性。

        (5)蓝牙模块原理:基于TI公司CC2541芯片的蓝牙4.0模块,通过串口协议与FPGA通信。用户无需深入研究蓝牙协议,只需处理发送和接收的数据。

        (6)点阵级联电路原理:将多个8×8点阵模块级联,形成更大的显示屏。通过适当的电路设计和编程,可以实现更大范围的图形和文字显示。

三、项目设计

1.系统结构设计

1.1技术方案

        本项目采用EGO1开发板作为控制核心,设计了一个基于蓝牙的点阵显示系统。系统主要包括点阵驱动电路、点阵级联电路、点阵显示模块、点阵移动模块以及蓝牙模块。使用的点阵块型号为LG7088BH,蓝牙模块基于TI公司CC2541芯片的蓝牙4.0模块。

1.2设计要点

        (1)点阵驱动电路:使用8×8点阵块LG7088BH,需要配置适当的驱动电路。

        (2)EGO1开发板:作为系统的控制核心,负责处理数据和控制信号。

        (3)点阵显示模块:实现在点阵屏上显示汉字或图形的功能。

        (4)点阵移动模块:能够实现点阵上内容的动态移动。

        (5)蓝牙模块的应用:使用基于CC2541芯片的蓝牙4.0模块进行数据通信。

        (6)级联电路设计:考虑多个点阵块的级联连接,实现更大的显示效果。

1.3系统结构图

        该实验系统分为四个模块,四块8×8点阵屏、外围电路(接口电路)、EGO1板、蓝牙设备。

 

1.4硬件连接图

        该实验由于EGO1板卡功能丰富,外围电路相对简单。包含:

        (1) 8×8点阵块LG7088BH的连接:根据LG7088BH的16个引脚分配正确连线,使其能够正常工作。

        (2)点阵级联PCB设计:根据四块点阵屏的级联关系,设计一块拼接好的PCB电路板方便与RGO1板卡连接。

        (3)与板卡连接:根据EG01板卡结构图,确定FPGA接口含义,正确提供VCC、GND、IO引脚分配。

 

 

1.5系统硬件配置设计(硬件模块介绍)

1.5.1 8×8点阵块LG7088BH

        8×8点阵块LG7088BH由64个LED灯组成,排列成8行8列的格式。它们可以用于显示简单的图形、字符或者动画,每个LED可以单独控制,通常通过行列扫描的方式来减少所需的控制引脚数量。

1.5.2 四块点阵级联电路

根据级联电路的设计指标与点阵屏幕的引脚分配可以绘制出下面这个PCB,优势在于可以简单地实现和EGO1的连接

由于时间限制,并未完成打板,此处仅展示EDA绘制的模型。

 

1.6系统软件配置设计(软件模块介绍)

1.6.1软件原理图

        下图是vivado软件,在代码写完整后所生成的原理图和程序分层。

         由于程序较为繁杂,所以形成的原理图也就很复杂,图片显示并不清晰,因此下面将详细分模块介绍。

1.6.2分模块介绍
1.6.2.1时钟生成模块

        clk_gen是一个Verilog时钟生成模块,用于从主时钟源(clk_pin)生成多个时钟信号。它包括对发送时钟(clk_tx)的分频控制,接收时钟(clk_rx)的生成,以及采样时钟(clk_samp)的管理。此模块还包括时钟稳定性指示(clock_locked),以及对这些时钟信号的使能控制。简而言之,clk_gen在数字系统中扮演着关键的时钟管理和分配角色。

1.6.2.2复位生成模块

        rst_gen是一个Verilog复位生成模块,用于根据不同的时钟域(clk_rx、clk_tx 和 clk_samp)产生相应的复位信号。该模块结合了外部复位输入(rst_i)和时钟稳定性指示(clock_locked)来生成内部复位信号。它包含多个 reset_bridge 实例,每个实例负责为一个特定的时钟域生成复位信号,以确保系统的稳定运行。

 

1.6.2.3七段数码管显示模块

        seg7decimal 是一个Verilog模块,用于驱动7段数码管显示。它接收一个16位的二进制输入 x,并将其转换为相应的数码管显示。模块使用时钟信号 clk 来周期性更新显示内容,并通过 clr 信号来清除或重置显示。内部逻辑包括数字的选择和7段数码显示的控制,使得每一位数字能够在数码管上正确显示。

 

 

1.6.2.4信号解析模块

        cmd_parse 模块是一个用于解析UART接收到的命令并生成相应响应的Verilog模块。它根据接收到的数据,通过内部状态机处理不同的命令(如读取、写入),并生成确认或错误响应。该模块还负责将接收到的字符数据转换为数字,并存储在相应的寄存器中。

1.6.2.5接收器模块

        uart_rx 模块是一个UART接收器模块,用于处理来自UART通信的数据。它包括波特率生成(控制数据接收的速率)和接收控制(管理数据的接收过程)。该模块接收串行数据,处理并转换为8位并行数据输出,同时提供数据接收就绪信号和可能的帧错误信号。

 

 

1.6.2.6字符缓存模块

        这个模块用于缓存字符数据,支持读写操作。它通过端口连接接收数据输入、输出数据,并根据读写时钟信号进行操作。此模块还包含空和满标志,用于指示其存储状态。

1.6.2.7滚动显示控制模块

        该gundon模块是一个用于点阵显示的滚动显示控制器。它使用时钟信号(clk)和复位信号(rst)来控制显示内容的滚动。模块内部定义了一些预设的显示数据(id1和id2),并根据输入信号rl选择显示哪一种数据。在每个时钟周期,数据会在内部寄存器press中移位,以实现滚动效果。输出out是截取的部分数据,用于驱动点阵显示器,显示滚动的图案或文字。

1.6.2.8点阵显示模块

        xianshi模块,用于控制一个16×16的LED点阵显示。模块接收一个时钟信号(clk)、一个复位信号(rst)和一个256位的输入数据(d_in)。它输出两个16位的寄存器:hang和lie,分别代表点阵的行和列。总体而言,xianshi模块通过快速地在行和列之间切换(由于时钟频率的速度,这种切换对人眼来说是不可见的),从而能够在点阵上显示复杂的图案或文字。这种方法通常称为动态扫描,在LED点阵显示技术中非常常见。

 

1.6.2.9回环控制模块

模块 lb_ctl 在Verilog中用于实现环回控制功能。它的主要作用是根据环回选择信号 lb_sel_i 决定是否将接收到的数据(rxd_clk_rx)直接传输到输出(txd_o),或者传输原始的待发送数据(txd_tx)。这种机制通常用于通信系统的测试和调试,确保接收和发送的数据处理逻辑正常工作。此外,模块还包含去抖动(debouncer)和信号稳定化(meta_harden)功能,以确保处理的信号稳定可靠。

 

1.6.2.10分频模块

        模块 fenpina 主要功能是生成两个不同频率的时钟信号(1Hz 和 1KHz)以及基于接收到的数据产生控制信号。它包含两个主要的计数器(couner_1Hz 和 couner_1KHz)用于产生这些时钟信号,并根据输入的 rx_data 以及读取标志 rd 来设置控制信号 rl。这种类型的模块通常用于需要精确时钟控制和基于条件的信号生成的应用场景。

 

 2.系统参数设计

        根据设计指标,我们需要对16*16点阵的显示字符进行取模操作,需要将想要现实的字符变为16进制代码输入给FPGA,至于如何设计这个16进制代码,我进行了如下仿真设计:

        仿真案例使用A B C G四个英文字母。

        首先是借助python进行字符的图像处理与取样,代码如下:

  1. import matplotlib.pyplot as plt
  2. import numpy as np
  3. from PIL import Image, ImageDraw, ImageFont
  4. def generate_bitmap_for_letter(character, image_size):
  5. image = Image.new('1', image_size, 1)
  6. draw = ImageDraw.Draw(image)
  7. font = ImageFont.load_default()
  8. text_bbox = draw.textbbox((0, 0), character, font=font)
  9. text_width = text_bbox[2] - text_bbox[0]
  10. text_height = text_bbox[3] - text_bbox[1]
  11. text_x = (image_size[0] - text_width) // 2
  12. text_y = (image_size[1] - text_height) // 2
  13. draw.text((text_x, text_y), character, font=font, fill=0)
  14. bitmap = np.array(image)
  15. return bitmap
  16. def generate_hex_bitmap(bitmap):
  17. hex_list = []
  18. for row in bitmap:
  19. binary_string = ''.join(['1' if bit else '0' for bit in row])
  20. hex_string = format(int(binary_string, 2), '0x').upper()
  21. hex_list.append(hex_string)
  22. return hex_list
  23. def format_hex_values_for_verilog(hex_list):
  24. formatted_hex = ','.join(['0x{:02X}'.format(int(h, 16)) for h in hex_list])
  25. return '{' + formatted_hex + '}'
  26. letters = ['A', 'B', 'C', 'G']
  27. hex_bitmaps = {}
  28. for letter in letters:
  29. bitmap = generate_bitmap_for_letter(letter, (16, 16))
  30. hex_bitmap = generate_hex_bitmap(bitmap)
  31. formatted_hex_bitmap = format_hex_values_for_verilog(hex_bitmap)
  32. hex_bitmaps[letter] = formatted_hex_bitmap
  33. print(f"Bitmap for '{letter}':")
  34. print(formatted_hex_bitmap)
  35. print()
  36. plt.imshow(bitmap, cmap='gray', interpolation='none')
  37. plt.title(f"Bitmap for '{letter}'")
  38. plt.axis('off')
  39. plt.show()

         下面是借助matlab进行最后的数据处理:

  1. A = [
  2. 0x10,0x94,0x53,0x32,0x1E,0x32,0x52,0x10,0x00,0x7E,0x42,0x42,0x42,0x7E,0x00,0x00
  3. ];
  4. B = [
  5. 0x08,0xCC,0x4A,0x49,0x48,0x4A,0xCC,0x18,0x00,0x7F,0x88,0x88,0x84,0x82,0xE0,0x00
  6. ];
  7. C = [
  8. 0x40,0x30,0x11,0x96,0x90,0x90,0x91,0x96,0x90,0x90,0x98,0x14,0x13,0x50,0x30,0x00
  9. ];
  10. G = [
  11. 0x00,0xFE,0x22,0x5A,0x86,0x10,0x0C,0x24,0x24,0x25,0x26,0x24,0x24,0x14,0x0C,0x00
  12. ];
  13. % 初始化输出字符串
  14. output_hex = '';
  15. % 处理每个字母的点阵
  16. hanzis = {A, B, C, G};
  17. for k = 1:length(hanzis)
  18. hanzi_matrix = hanzis{k};
  19. for i = 1:length(hanzi_matrix)
  20. % 将每个数值转换为十六进制字符串,并保持固定的字符长度
  21. output_hex = strcat(output_hex, sprintf('%04x', hanzi_matrix(i)));
  22. end
  23. % 在除了最后一个字母之外的每个字母后添加下划线分隔符
  24. if k < length(hanzis)
  25. output_hex = strcat(output_hex, '_');
  26. end
  27. end
  28. % 格式化输出,添加前缀和后缀
  29. output_for_verilog = strcat('1024''h', output_hex, ';');
  30. % 输出结果
  31. disp(output_for_verilog);

        下面是最终的输出结果:

        1024'h0010009400530032001e0032005200100000007e004200420042007e00000000_000800cc004a00490048004a00cc00180000007f008800880084008200e00000_0040003000110096009000900091009600900090009800140013005000300000_000000fe0022005a00860010000c0024002400250026002400240014000c0000; 

3.系统设计流程

3.1每个模块的说明

uart_rx(UART接收)模块:

这个模块负责接收UART通信中的数据。它通过一系列的子模块处理接收的数据,包括波特率检测、字符解码和错误检测。其核心功能是从串行数据中恢复出并行数据,供系统进一步处理。

uart_tx(UART发送)模块:

这个模块管理数据的串行发送。它将并行数据转换为串行格式,并按照设定的波特率进行发送。此模块确保了数据能够被正确地序列化并发送给外部设备或系统。

蓝牙控制模块 (bt_uart):

bt_uart模块是整个系统中的关键组成部分,它负责管理与蓝牙模块的交互。这个模块的核心功能包括:

数据传输:通过UART接收和发送数据,连接蓝牙模块和主控制器。

控制信号管理:包括电源控制(bt_pw_on)、主从模式切换(bt_master_slave)、软硬件选择(bt_sw_hw)等。

状态反馈:通过一系列输出信号,如seg7_0_7bit、seg7_1_7bit等,显示蓝牙模块的状态信息。

点阵显示控制:利用fenpina、gundong和xianshi子模块控制点阵显示。

点阵显示控制模块 (fenpina, gundong, xianshi):

fenpina模块:负责产生点阵显示所需的控制信号,如不同频率的时钟信号。它控制显示的更新频率,影响图案的滚动速度。

gundong模块:管理点阵显示的滚动行为。它根据输入的命令或数据调整显示的图案,实现字符或图形的滚动显示。

xianshi模块:直接驱动点阵显示,控制每个LED的亮灭。它将处理后的数据转换为视觉图案,展示在点阵屏上。

数码管显示模块 (seg7decimal):

数据转换:将输入的二进制数字转换为7段数码管可以显示的格式。

多位显示控制:可以控制多个数码管,显示较大的数值或更复杂的信息。

动态显示:通过快速切换显示的数字,创建动态显示效果。

seg7decimal模块使得数字和简单字符能够在数码管上直观地显示出来。

信号处理和稳定化模块 (meta_harden, debouncer):

meta_harden模块:这个模块用于减少高速数字信号传输中的亚稳态风险。通过两级触发器结构实现信号稳定化,保证信号在目标时钟域内稳定有效。

debouncer模块:负责处理物理开关或按钮输入的信号抖动。它确保输入信号的稳定。

环回控制 (lb_ctl) 模块:

这个模块用于在特定情况下,如测试或调试时,将接收到的UART数据直接反馈到发送端。它的主要功能是:

选择性环回:通过检测控制信号(lb_sel_i),决定是否激活环回模式。

数据路由:在环回模式下,接收到的数据(rxd_clk_rx)被直接路由到UART发送端(txd_o),否则使用正常的发送数据(txd_tx)。

波特率生成(uart_baud_gen)模块:

这个模块是UART通信的关键组成部分,负责生成适当的波特率时钟信号,确保数据以正确的速率进行传输。其功能包括:

波特率计算:根据预设的波特率和系统时钟频率计算出必要的时钟分频值。

时钟分频:生成一个比系统时钟慢的时钟信号,其频率与设定的波特率相匹配。

uart_baud_gen模块确保UART通信在预定波特率下稳定运行,对于保证数据传输的准确性和可靠性至关重要。

二进制到BCD转换(to_bcd)模块:

这个模块的作用是将二进制数字转换为二进制编码的十进制(BCD)格式,这在显示数字信息时非常重要。其主要功能包括:

数字分解:将较大的二进制数分解为更小的单元,方便在数码管或其他显示设备上显示。

BCD转换:通过一系列算法,将每个二进制数字单元转换为相应的BCD表示。

to_bcd模块使得数字信息能够被直观且准确地显示在数码管或类似的显示设备上。

环回控制 (lb_ctl):lb_ctl模块主要负责在特定场景下实现UART数据的环回功能。其关键功能包括:环回选择:通过检测环回选择信号(lb_sel_i),决定是否启用环回模式。数据路由:在环回模式下,接收到的数据(rxd_clk_rx)会直接发送到UART发送端(txd_o)。否则,使用常规的发送数据路径(txd_tx)。

信号硬化 (meta_harden) 模块:

meta_harden模块的主要功能是减少信号传输过程中的亚稳态风险,特别是在高速数字电路中。它通过下述方式确保信号的稳定性:

双级触发器:使用两级触发器结构来稳定化信号。首先,原始信号被捕获在一个中间寄存器(signal_meta),然后传递到最终输出(signal_dst)。

减少亚稳态:这种方法可以显著减少信号在高速操作中的亚稳态,提高系统的可靠性和稳定性。

字符FIFO (char_fifo)模块:

char_fifo(First-In-First-Out)模块在UART通信中用于暂存字符数据。其作用包括:

数据缓冲:存储即将通过UART发送的字符,或者暂存刚接收的字符。

流控制:通过控制字符的读取和写入,帮助管理数据流,避免发送或接收过程中的数据溢出或丢失。

时钟生成 (clk_gen) 和 复位生成 (rst_gen) 模块:

clk_gen模块:负责生成系统所需的各种时钟信号。它包含一个时钟分频器,用于从主时钟信号产生不同频率的子时钟信号。

rst_gen模块:生成系统的复位信号。当系统需要重新初始化或在检测到错误时,这个模块确保系统能够安全地重置到初始状态。

命令解析 (cmd_parse) 模块:

这个模块负责解析通过UART接收到的命令和数据。它的作用包括:命令识别:识别和处理不同的命令,如读取、写入或配置操作。参数提取:从接收到的数据中提取参数,用于执行相应的命令。响应生成:根据命令的执行结果,生成相应的响应数据发送回UART通信。

响应生成 (resp_gen) 模块:

resp_gen模块负责根据系统状态或命令处理结果生成响应。它的作用包括:响应格式化:将数据或状态信息格式化为标准的响应消息。FIFO管理:将格式化后的响应数据放入FIFO队列,准备通过UART发送。发送控制:控制响应数据的发送时机,确保数据在正确的时刻被发送。

去抖动 (debouncer) 模块:

信号稳定化过程:为了确保信号的准确读取,去抖动模块监测输入信号在一定时间内的状态。如果输入信号在这段时间内保持稳定(即没有改变),则认为是有效的输入动作。计时器功能:去抖动模块内通常包含一个计时器,用于监测输入信号在预定时间阈值内的状态。如果输入信号在这段时间内没有改变,计时器会重置。

输出信号的决定:如果输入信号在整个监测周期内保持不变,则去抖动模块的输出会更新为这个稳定的信号状态。反之,如果输入在监测期间变化,则输出不更新,等待下一个稳定周期。

这种机制有效地过滤了由于物理接触不良或其他原因造成的短暂信号波动,确保系统只响应真正的用户输入。信号同步与硬化:为了防止亚稳态,去抖动模块可能会包括信号硬化的步骤,特别是当信号跨越不同的时钟域时。通过在信号路径中添加一两级触发器实现。

消抖参数的配置:去抖动时间阈值(在debouncer模块中作为FILTER参数),决定了信号稳定所需的最小时间。这个值可以根据具体应用场景调整,以适应不同的物理输入特性。

3.2模块间的协同逻辑与设计流程

1.数据接收:通过 UART 接收模块(uart_rx),系统接收来自外部(如蓝牙模块)的数据。

2.命令解析:接收到的数据被传送到命令解析模块(cmd_parse),在这里进行解析和处理。

3.显示控制:解析后的数据根据需要被发送到点阵显示控制模块(fenpina, gundong, xianshi)或数码管显示模块(seg7decimal)进行可视化展示。

4.数据发送:通过 UART 发送模块(uart_tx),系统可以将数据发送到外部设备(如蓝牙模块)。

5.信号处理:所有进出的信号通过信号处理模块(meta_harden, debouncer)进行稳定化和消抖,以确保数据的准确性和稳定性。

6.时钟和复位管理:时钟生成模块(clk_gen)和复位生成模块(rst_gen)保证系统正常运行,提供必要的时钟和复位信号。

7.环回测试:环回控制模块(lb_ctl)在调试过程中用于检查和验证数据的完整性  。

4.实验器材

4.1实验仪器:

EGO1开发板,联想拯救者Y7000P2021

4.2实验材料:

面包板一个,8×8点阵块LG7088BH四个,杜邦线若干

4.3实验软件:

Windows10(x86),vivado 2017.4,MATLAB 2023b,pycharm2022,立创EDA网页版,蓝牙助手微信小程序

5.实验步骤

1.准备工作:首先,收集和组装所有必要的硬件,包括FPGA开发板、蓝牙模块、8×8点阵显示模块。检查所有的硬件连接是否正确,保证它们处于工作状态。

2.设计与编程:根据项目需求,使用Verilog语言编写程序。确保程序包含所有必要的模块,并正确实现预定的功能。

3.代码编译与仿真:在集成开发环境中编译所写程序,并执行仿真测试,以检查逻辑正确性和性能指标。

4.硬件调试:将编译好的程序烧录到FPGA开发板上,对硬件进行测试和调试,确保程序在真实硬件上的有效运行。

5.功能测试:启动蓝牙模块,测试其与其他设备的通信功能。同时,检查8×8点阵模块是否能够正确显示数据。

6.性能优化:根据功能测试的结果,对程序或硬件配置进行必要的调整和优化,以提高系统的整体性能和稳定性。

7.综合测试:在所有调整和优化完成后,进行全面的系统测试,确保所有模块协同工作无误,系统运行平稳。

8.文档记录:详细记录实验过程中的每一个步骤,包括遇到的问题和解决方案,以便未来参考和项目的进一步开发。

四、项目实施

1.系统测试流程

1.1仿真testbench代码

        定义了一个模块sim2,首先,声明了一系列输入和输出端口,包括时钟信号(clk_pin)、复位信号(rst_pin)、接收数据信号(rxd_pin)等。然后,在初始化块中,时钟被设置为1,复位被设置为0,接收数据信号经过一系列时间延迟后在不同的时刻被置为0或1。随后,通过时钟反转逻辑,每5个时间单位时钟信号取反一次。最后,该模块实例化了bt_uart的模块,连接了各个输入和输出信号。包含了与UART通信相关的逻辑。

  1. `timescale 1ns / 1ps
  2. module sim2;
  3. reg clk_pin;
  4. reg rst_pin;
  5. reg rxd_pin;
  6. wire txd_pin;
  7. wire lb_sel_pin;
  8. wire bt_pw_on;
  9. wire bt_master_slave;
  10. wire bt_sw_hw;
  11. wire bt_rst_n;
  12. wire bt_sw;
  13. wire [5:0] sw_pin;
  14. wire [6:0] seg7_0_7bit;
  15. wire [6:0] seg7_1_7bit;
  16. wire [3:0] seg7_0_an;
  17. wire [3:0] seg7_1_an;
  18. wire seg7_0_dp;
  19. wire seg7_1_dp;
  20. wire [15:0] led_pins;
  21. wire [15:0] hang;
  22. wire [15:0] lie;
  23. initial
  24. begin
  25. clk_pin = 1'b1;
  26. rst_pin = 1'b0;
  27. rxd_pin = 1'b1;
  28. #1000 rxd_pin = 1'b0;
  29. #8600 rxd_pin = 1'b1;
  30. #8600 rxd_pin = 1'b1;
  31. #8600 rxd_pin = 1'b1;
  32. #8600 rxd_pin = 1'b0;
  33. #8600 rxd_pin = 1'b1;
  34. #8600 rxd_pin = 1'b0;
  35. #8600 rxd_pin = 1'b0;
  36. #8600 rxd_pin = 1'b0;
  37. #8600 rxd_pin = 1'b1;
  38. end
  39. always@( clk_pin)
  40. #5 clk_pin <= ~clk_pin;
  41. bt_uart bt_uart_instance (
  42. clk_pin,
  43. rst_pin,
  44. rxd_pin,
  45. txd_pin,
  46. lb_sel_pin,
  47. bt_pw_on,
  48. bt_master_slave,
  49. bt_sw_hw,
  50. bt_rst_n,
  51. sw_pin,
  52. seg7_0_7bit,
  53. seg7_1_7bit,
  54. seg7_0_an,
  55. seg7_1_an,
  56. seg7_0_dp,
  57. seg7_1_dp,
  58. led_pins,
  59. hang,
  60. lie
  61. );
  62. endmodule

1.2仿真测试结果图 

仿真结果如上图所示。 

2.系统实施与调试

2.1实施过程

        该系统实施过程操作相对简单,首先连接好电路后,将所写代码的比特流文件写入EGO1当中,烧录完成之后,点阵屏上即可显示出预先设置好的字符,然后使用手机连接好EGO1的蓝牙之后,通过给蓝牙不同的信号,使得点阵屏上的内容发生改变。

2.2实施要点

(1)确保四个点阵屏均能够正常工作,EGO1内置蓝牙模块能正常工作;

(2)EGO1板完好无损,能正常工作;

(3)连接正确的蓝牙设备;

(4)确保电路图连接正确。

2.3外围电路连接图

        外围电路是由EGO1开发板,四个16*16点阵屏和面包板组成,面包板的作用是将EGO1的IO口引出来,这样才能实现点阵屏的共行和共列连接。 

2.4点阵显示电路

 

图23 点阵显示电路

        点阵显示电路是将四块点阵屏按照共行和共列的解法级联到一起,然后按照顺序拼好而成.

2.5软件参数配置

        char_fifo 模块作为字符缓冲区,用于处理系统中的字符流。能够临时存储数据,保证数据的有序传输和处理。在 UART(通用异步收发传输器)系统中, char_fifo 可用于暂存接收或发送的字符,确保在数据处理和传输中的稳定性和效率。

2.6故障排除方法

        故障排除时,需要逐个模块进行分析,观察该模块能否正常工作,首先检查点阵屏是否损坏;之后检查EGO1板子的IO口是否输出正常;点阵屏和EGO1的连接是否正确。如果上述模块均无问题,则考虑代码是否正确。

2.7系统运行操作

(1)正确连接好点阵屏和EGO1开发板;

(2)在Vivado上编写好程序,配置好调用的模块的软件部分;

(3)连接板卡,烧录程序;

(4)观察点阵屏显示内容;

(5)总结实验设计过程,撰写实验报告;

2.8实施效果

2.8.1四个点阵屏滚动显示

        程序烧录好即可显示成功

2.8.2两个点阵屏滚动显示

        通过修改如下代码可以实现只显示两个点阵屏

2.8.3滚动速度改变

        将下面分频模块代码的1Hz更改为10Hz即可改变字符滚动速度

2.8.4滚动方向改变

        通过修改如下代码可以实现字符滚动方向的改变

3.系统工程信息

3.1综合阶段分析:

        LUT (Look-Up Tables):图表显示LUT的使用率约为2%。这意味着当前设计只使用了可用LUT的很小一部分,表明逻辑复杂度较低且设计被高度优化。

        LUTRAM:本实验中使用的FPGA芯片允许其LUT资源被用作小容量的随机访问存储器(RAM)。LUTRAM的使用率为1%,这表明设计中使用了一些小的状态机或需要少量的内存资源。

        FF (Flip-Flops):这些是用于存储一位信息的基本存储单元。它们在时序逻辑中非常重要,用于实现寄存器、计数器等。FF的使用率为3%,这表明时序逻辑不是资源限制的瓶颈。

        IO (Input/Output Ports):这些端口用于FPGA与外部世界的通信。IO的使用率是所有资源中最高的,达到了41%。这指示该设计与外部设备有大量的数据交换,需要许多输入输出引脚来满足设计要求。

        BUFG (Global Buffer):BUFGs是用于分配全局时钟信号或其他高扇出信号的专用资源。BUFG的使用率为6%,这表明设计利用了一些全局信号,但仍有较多的全局缓冲资源可供使用。

3.2实现阶段分析

        LUT (Look-Up Tables):使用率为3%,比综合阶段略高。在实现阶段,LUT的使用率因为优化算法或物理布局的改变而略有增加。

        LUTRAM:依然保持1%的利用率,这说明在综合到实现阶段,对于LUTRAM的需求并没有显著变化。

        FF (Flip-Flops):使用率增加到了4%,这表明在考虑了时序和物理布局后,需要更多的触发器来满足设计要求。

        BRAM (Block RAM):这是一个新出现的资源类型,使用率为1%。BRAM是较大的存储块,用于存储大量数据。即使在综合阶段BRAM的使用不明显,但在实现阶段,具体的存储需求和布局会导致BRAM的使用。

        IO (Input/Output Ports):使用率维持在41%,这表明外部接口的需求从综合到实现阶段没有变化,设计对外部通信的需求依然很高。

        BUFG (Global Buffer):显著增加到19%的使用率,这是因为实现阶段更细致的时钟网络设计和优化所需。

        MMCM (Mixed-Mode Clock Manager):使用率为2%,MMCM是用于生成、分配和管理时钟在FPGA内部的复杂资源。这表明设计需要多个时钟域,或者需要对时钟信号进行特殊的处理,如频率合成或调整。

        从实现阶段资源占用率图可以看出,在实现阶段后,全局缓冲器(BUFG)和混合模式时钟管理器(MMCM)的使用率有显著增长,这是由于时钟网络的复杂性和优化需求导致的。此外,FF的轻微增加也指出了时序要求导致更多的存储元素被使用。LUT和BRAM的使用表明逻辑和存储需求在实现阶段得到了具体化。

五、项目总结与心得体会

1.设计思路与要点:

        本项目旨在设计一个基于蓝牙控制的点阵显示系统。

        重点包括点阵驱动电路的设计、FPGA接口的开发,以及蓝牙模块的集成。

        系统设计考虑了显示效果的多样性,支持文本和图形的显示。

2.特色与效果:

        该系统的特色在于其无线控制功能,用户可以通过蓝牙设备发送显示内容。

        实现了较高的显示灵活性和用户交互性。

3.实验对学生的作用:

        通过这个项目,学生在电子技术和系统整合方面得到了实际的锻炼。

        提高了学生在电路设计、编程以及问题解决方面的能力。

        增强了创新思维和团队合作能力。

4.存在的问题与改进方向:

        系统可能存在能耗和稳定性方面的问题,需要进一步优化。

        用户界面和交互设计方面还有提升空间,以提高用户体验。

        在技术上,可以探索更多显示效果和功能,如动态图形显示等。

        综上所述,这个项目不仅提升了学生在电子技术领域的实践经验,还激发了对未来技术创新的思考,同时也揭示了项目在实现更高级功能和更好用户体验方面的潜在改进空间。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/神奇cpp/article/detail/765908
推荐阅读
相关标签
  

闽ICP备14008679号