FPGA数字钟设计:双模授时与多显示驱动的硬件实现

发布时间:2026/5/26 2:18:46

FPGA数字钟设计:双模授时与多显示驱动的硬件实现 1. 项目概述一个FPGA数字钟的设计哲学与实现选择在数字电路和嵌入式系统爱好者的世界里做一个时钟似乎是个“入门级”项目但当你把精度、自主性、多种显示驱动和无线时间同步这些需求叠加在一起时它立刻就变成了一个充满挑战和乐趣的综合性工程。我手头这个基于FPGA的数字钟项目正是这样一个从简单需求出发最终演变成功能丰富的系统设计案例。核心问题很直接是做一个依赖外部标准时间信号如DCF77的时钟还是做一个通过无线GPS模块自动校时的“智能”时钟或者我们能不能“全都要”这个项目记录了我用VHDL在Altera MAX系列FPGA上实现这两套时钟方案的设计思路、具体实现以及那些只有亲手焊接、调试过才能获得的经验。简单来说这是两个可以独立运行也可以考虑合并的FPGA数字钟核心。方案一是一个具备手动设置和DCF77长波授时同步功能的独立时钟方案二则更为激进它通过433MHz无线链路接收来自廉价GPS模块的NMEA数据实现自动、精准的无线授时并集成了高精度RTC芯片作为后备。这两个设计都不仅仅是在七段数码管上显示数字它们驱动了从经典的辉光管、荧光管到现代LCD屏等多种显示器件并考虑了诸如防止阴极中毒、定时开关高压等实际使用中的细节问题。如果你对FPGA开发、数字逻辑设计、时间同步协议或是复古显示技术感兴趣这个项目里的坑和技巧或许能帮你省下不少时间。2. 核心设计思路与方案选型解析2.1 为什么选择FPGA而非MCU在开始讨论具体时钟方案前一个根本性的选择是硬件平台。很多人可能会首选单片机因为它简单、成本低、生态丰富。但我选择了FPGA原因有几个方面。首先并行处理能力是核心。一个时钟系统里时间计数、显示扫描、串口解码、按键消抖、温度读取等任务本质上是并发的。用MCU需要靠中断和状态机来模拟并行在任务增多时实时性和代码复杂度会急剧上升。而FPGA的硬件并行特性让每个模块都可以独立、同步地运行例如GPS解码模块在解析字符串时完全不影响计时模块的精确累加这种架构带来的确定性和可靠性是MCU难以比拟的。其次精准的时序控制。对于驱动辉光管、荧光管这类需要高压、特定时序的器件FPGA可以生成极其精准和稳定的控制信号特别是PWM调光、多路复用扫描等用硬件逻辑实现比用软件循环要稳定和高效得多。最后是设计的灵活性与可移植性。整个系统用VHDL以模块化方式构建就像搭积木。DCF77解码器、GPS报文解析器、显示驱动器、时钟计数器等都是独立的实体。这意味着我可以轻松地在“方案一”和“方案二”之间切换或者将它们组合到一个更大的FPGA中而无需重写整个软件架构。这种硬件描述语言带来的设计复用性在迭代和升级时优势明显。2.2 方案一DCF77同步时钟的经典与稳健DCF77是德国发射的长波时间信号覆盖中欧提供高可靠性的官方时间源。这个方案的设计哲学是稳健与离线可用性。核心是一个自运行的时钟计数器以本地晶振为基准进行计时。DCF77接收模块作为校准源其输出是每秒一个的脉冲信号其中通过脉冲宽度调制编码了分钟、小时、日期等信息。在FPGA内部我设计了一个DCF77解码状态机。这个状态机持续监测输入脉冲的宽度。一个100ms的脉冲代表二进制“0”200ms的脉冲代表“1”而一个持续秒的脉冲标志着一分钟数据的开始。状态机需要精确地对脉冲进行计时和分类并将连续59个数据位加上校验位组装成完整的时间帧。这里的关键挑战是抗干扰。长波信号容易受到天气、电气噪声的影响。我的策略是“多数表决”和“连续验证”。例如对于关键的时间位我会要求连续多个同步周期内解码结果一致才更新内部时钟并且会校验帧内的奇偶校验位和固定位确保数据的有效性。只有当解码器高度确信收到了有效信号时才会触发一个同步事件将FPGA内部的时间计数器一次性校准到DCF77时间。这个方案的优点是几乎不受地理位置限制在信号覆盖区内且不依赖网络。缺点是依赖特定的硬件接收模块在信号极差区域可能无法同步且DCF77本身不包含夏令时信息需要手动或根据内置规则切换。2.3 方案二无线GPS授时钟的现代与智能方案二代表了更现代、更全球化的思路利用GPS卫星信号作为终极时间源。但直接在每个时钟里集成GPS模块成本高、功耗大且需要天线朝向天空限制了摆放位置。因此我采用了**“星地分离”**的设计一个廉价的GPS模块输出标准的NMEA 0183协议数据搭配一个433MHz的FSK无线发射模块构成一个独立的“时间发射器”可以放在窗台或信号好的地方。时钟本体则包含一个433MHz接收模块和FPGA解码核心。这个方案的核心在于NMEA 0183协议的解析特别是$GPRMC语句。这条语句包含了最精简的定位时间信息。FPGA内的UART模块以4800波特率接收来自无线模块的数据流然后一个专用的NMEA解析状态机开始工作。它需要从连续的字符流中识别出“$GPRMC”帧头然后按照逗号分隔符提取出时间、状态、日期等字段。字符串到二进制数值的转换例如将“123456”的ASCII码转换成十进制数需要仔细的时序设计。智能之处在于同步策略。你不可能、也不需要每秒都同步。我在设计中加入了一个可编程的同步时间窗口。例如可以设置为只在凌晨3点进行一次同步。在非同步时段时钟依靠内部的高精度DS3234 RTC芯片维持走时。DS3234通过SPI接口与FPGA通信它不仅精度极高±2ppm还自带温度补偿和电池备份即使完全断电时间也不会丢失。FPGA在需要时从RTC读取时间在成功进行GPS同步后再将准确时间写回RTC。这种设计既保证了长期精度又极大降低了无线模块的功耗和干扰。2.4 双模融合的可能性与架构考量原文中提到“可以将两个设计合并到一个更大的FPGA”这是一个非常自然的演进方向。融合后的系统将具备最高的可靠性和灵活性。架构上可以设计一个**“时间源仲裁器”**模块。这个仲裁器持续监测多个潜在的时间源手动设置输入、DCF77解码器状态、GPS/NMEA解码器状态、以及内部RTC。用户可以设定优先级。例如优先级的顺序可以是手动设置 有效GPS信号 有效DCF77信号 内部RTC。仲裁器根据信号有效性和优先级输出一个“权威时间”给核心的时钟计数器和显示模块。同时FPGA的逻辑资源也允许我们为两种无线协议DCF77脉冲解码和NMEA串口解码同时实现接收前端硬件上只需通过跳线或模拟开关选择将哪个接收器的信号送入FPGA的特定IO引脚即可。这种融合设计的好处是“因地制宜”。在城市公寓里可能GPS信号更好在郊区别墅DCF77可能更稳定在地下室或没有窗户的房间则依靠RTC保持运行。一个硬件平台通过配置适应不同环境这正是FPGA可重构能力的魅力所在。3. 硬件系统构建与关键模块详解3.1 FPGA核心板与电源设计我使用的核心是Altera MAX II系列的EPM1270T144C5。这是一款CPLD/FPGA混合型器件拥有1270个逻辑单元对于这个时钟项目绰绰有余。选择它的原因一是成本二是其非易失性——编程后配置信息直接保存在芯片内上电即运行无需外部配置芯片简化了设计。编程通过标准的JTAG接口使用Quartus II软件完成。注意MAX II器件的IO电压是3.3V而系统中很多模块如GPS模块、LCD、DS18B20是5V TTL电平。直接连接可能会损坏FPGA。稳妥的做法是使用电平转换芯片或者在设计允许的情况下将5V模块的TX信号通过一个简单的分压电阻例如1kΩ串联到FPGA IOFPGA IO对地接一个2kΩ电阻降到3.3V左右。对于FPGA输出驱动5V模块的RX引脚由于MAX II的3.3V输出高电平通常能被5V TTL系统识别为高所以很多时候可以直接连接但最好查阅双方的数据手册确认VIH/VIL电平是否兼容。电源是整个系统稳定的基石。我的时钟通常采用12V直流适配器供电驱动VFD荧光管的版本需要24V。首先使用LM2576-ADJ这款经典的开关降压稳压器将12V/24V降至稳定的5V。LM2576效率高、带载能力强能为数字电路和显示驱动提供主电源。然后再从5V通过一个低压差线性稳压器如AMS1117-3.3产生3.3V为FPGA核心供电。这种两级降压方案既保证了效率又确保了FPGA电源的纯净。3.2 显示驱动系统的多样性与实现这个项目最吸引人的部分可能就是其驱动多种复古显示器的能力。FPGA在这里扮演了显示控制器和驱动信号发生器的角色。辉光管驱动我驱动的是非多路复用的辉光管这意味着每个数字的每一段或者说每个数字管都需要独立的控制。我使用了经典的74141或苏联的K155ID1BCD到十进制解码驱动器。FPGA只需要输出4位BCD码给74141它就能产生高达60-80V的电压来点亮对应的一个阴极数字。FPGA的逻辑需要实现一个计数器依次输出个位、十位…的BCD值并控制74141的选通。为了防止阴极中毒某些数字长期不点亮导致性能下降我设计了一个“数字轮换”功能在每天凌晨6:00到6:10这十分钟里让所有辉光管依次快速显示0-9确保每个阴极都被激活。荧光管驱动荧光管需要灯丝电压和栅极/阳极电压。我使用了UNC5820这类专门的VFD驱动芯片。这类芯片通常是串行输入如SPI内置了多路复用扫描逻辑。FPGA的工作就变成了按照特定时序通过SPI接口向UNC5820发送要显示的数字段码数据。FPGA需要生成片选、时钟和数据信号并管理好刷新率避免闪烁。LCD显示驱动标准的1602字符LCD屏相对简单。FPGA实现一个HD44780兼容的并行接口控制器状态机。通过一组IO口模拟数据总线DB0-DB7再配合RS寄存器选择、RW读写、E使能三个控制信号按照严格的时序要求发送指令和数据就能显示时间、日期、温度等信息。LED数码管与IN-13辉光管秒指示对于多路复用的7段LEDFPGA需要实现扫描逻辑循环点亮每一位并同步输出该位的段码。IN-13是一种长条形的辉光管常用于显示秒数。我通过FPGA产生一个PWM信号来控制它的亮度PWM的占空比随着秒数从0到59线性增加形成一种模拟式的、平滑移动的秒指示效果视觉上非常独特。3.3 时间同步与传感器模块接口DCF77模块市面上常见的DCF77接收模块如文中提到的Conrad模块输出信号通常已经过放大和整形直接输出TTL电平的脉冲信号。只需将其连接到FPGA的一个通用IO引脚即可。FPGA内部解码逻辑的时钟基准必须非常准确通常使用系统主时钟如50MHz进行分频和计数来测量输入脉冲的宽度。GPS433MHz无线链路GPS模块输出4800波特率TTL NMEA的TX引脚连接到433MHz发射模块的数据输入。接收端则相反。这里的关键是确保波特率匹配。FPGA内的UART接收器需要精确匹配4800波特率时钟频率波特率16或8进行过采样。无线传输可能引入误码因此NMEA解析状态机必须足够健壮能够丢弃不完整的或校验错误的帧。DS3234高精度RTC这是方案二保持长期精度的关键。DS3234通过SPI接口通信。FPGA需要实现一个SPI主设备控制器。通信时序并不复杂但要注意DS3234的寄存器地址和读写规则。通常的操作是上电后FPGA从DS3234的时钟寄存器读取当前时间初始化内部计数器。在成功进行GPS同步后再将校准后的时间写入DS3234。DS3234的备用电池确保了即使主电源断开时间也在持续流逝。DS18B20温度传感器这款单总线数字温度传感器节省IO口但协议时序要求严格。FPGA需要实现精确的微秒级延时来控制单总线复位、读写位操作。读取的温度值可以显示在LCD上也可以作为环境参数记录下来。4. VHDL核心模块设计与仿真要点4.1 顶层架构与模块互联整个FPGA设计采用层次化、模块化的VHDL编码风格。顶层实体Top-Level Entity主要是一个“接线图”负责实例化所有子模块并将它们连接起来。entity top_clock is Port ( clk_50m : in std_logic; -- 主时钟输入 rst_n : in std_logic; -- 复位信号 -- 输入信号 dcf77_in : in std_logic; -- DCF77脉冲输入 gps_rx : in std_logic; -- GPS/UART数据接收 btn_set : in std_logic; -- 设置按钮 -- 输出信号 lcd_data : out std_logic_vector(7 downto 0); lcd_rs, lcd_rw, lcd_e : out std_logic; nixie_bcd : out std_logic_vector(23 downto 0); -- 6位BCD码给74141 spi_sclk : out std_logic; -- 给DS3234和VFD驱动 spi_mosi : out std_logic; spi_cs : out std_logic ); end entity top_clock; architecture rtl of top_clock is -- 内部信号声明 signal time_sec, time_min, time_hour : integer range 0 to 59; signal date_day, date_month : integer range 1 to 31; signal sync_pulse : std_logic; -- 时间同步脉冲 signal valid_gps_data : std_logic; signal gps_hour, gps_min, gps_sec : integer; -- 组件实例化 component clock_counter is ... end component; component dcf77_decoder is ... end component; component gps_uart_decoder is ... end component; component display_driver is ... end component; begin -- 实例化时钟计数器 u_clock: clock_counter port map (clkclk_50m, rstrst_n, syncsync_pulse, ...); -- 实例化DCF77解码器 u_dcf77: dcf77_decoder port map (clkclk_50m, dcf77_signaldcf77_in, validdcf77_valid, ...); -- 实例化GPS解码器 u_gps: gps_uart_decoder port map (clkclk_50m, rx_datagps_rx, validvalid_gps_data, ...); -- 仲裁与同步逻辑 process(clk_50m) begin if rising_edge(clk_50m) then sync_pulse 0; -- 默认不同步 if (manual_sync_btn 1) then -- 手动同步逻辑 elsif (valid_gps_data 1 and gps_sync_enabled 1) then -- 触发GPS同步 sync_pulse 1; -- 将gps_hour/min/sec传递给时钟计数器 elsif (dcf77_valid 1 and dcf77_sync_enabled 1) then -- 触发DCF77同步 sync_pulse 1; end if; end if; end process; -- 其他驱动模块实例化... end architecture;4.2 时钟计数器模块时间流逝的核心这是整个系统的心跳。它以一个稳定的高频时钟如50MHz为基准通过分频和计数产生秒、分、时、日、月、年的信号。entity clock_counter is Port ( clk_50m : in std_logic; rst : in std_logic; sync_pulse : in std_logic; -- 高有效同步脉冲 sync_hour : in integer range 0 to 23; sync_min : in integer range 0 to 59; sync_sec : in integer range 0 to 59; cur_hour : out integer range 0 to 23; cur_min : out integer range 0 to 59; cur_sec : out integer range 0 to 59 ); end entity; architecture behavioral of clock_counter is signal counter_1sec : integer range 0 to 49999999; -- 50MHz / 1Hz - 1 signal sec_int, min_int, hour_int : integer range 0 to 59; begin process(clk_50m, rst) begin if rst 1 then counter_1sec 0; sec_int 0; min_int 0; hour_int 0; elsif rising_edge(clk_50m) then -- 同步优先级最高 if sync_pulse 1 then hour_int sync_hour; min_int sync_min; sec_int sync_sec; counter_1sec 0; -- 重置秒计数器 else -- 正常计时 if counter_1sec 49999999 then counter_1sec 0; sec_int sec_int 1; if sec_int 59 then sec_int 0; min_int min_int 1; if min_int 59 then min_int 0; hour_int hour_int 1; if hour_int 23 then hour_int 0; -- 这里可以增加日期进位逻辑 end if; end if; end if; else counter_1sec counter_1sec 1; end if; end if; end if; end process; cur_sec sec_int; cur_min min_int; cur_hour hour_int; end architecture;实操心得在FPGA中实现计数器务必使用寄存器signal来存储计数值并在时钟边沿更新。counter_1sec这个信号是关键它把50MHz的高频时钟分频成1Hz。计算分频比是“时钟频率 / 目标频率 - 1”。确保使用足够宽的位宽来存储计数值避免溢出。同步信号sync_pulse的处理要干净利落在一个时钟周期内完成所有时间寄存器的更新并重置秒分频计数器这样可以立即让显示时间跳变到新值没有中间状态。4.3 NMEA解析器状态机设计解析$GPRMC字符串是方案二的技术难点之一。这本质上是一个串行数据流解析问题非常适合用有限状态机来实现。type state_type is (IDLE, RECV_CHAR, CHECK_HEADER, PARSE_FIELD, CALC_CHECKSUM, VALIDATE); signal state : state_type : IDLE; signal rx_buffer : std_logic_vector(7 downto 0); signal char_index : integer range 0 to 255; signal field_index : integer range 0 to 15; signal checksum_calc, checksum_received : std_logic_vector(7 downto 0); signal time_string : string(1 to 10); -- 存储时间字段如123456.789状态机的工作流程如下IDLE等待UART接收完成信号。收到后进入RECV_CHAR。RECV_CHAR读取UART送来的一个字符ASCII码。如果是$则进入CHECK_HEADER准备检查帧头否则回到IDLE。CHECK_HEADER连续接收后续字符与“GPRMC”进行比对。如果匹配成功进入PARSE_FIELD并重置字段索引和校验和计算器如果中途不匹配回到IDLE。PARSE_FIELD这是核心状态。根据当前field_index的值决定正在解析哪个字段。当遇到逗号,时表示一个字段结束field_index加1。特别关注field_index为1的字段UTC时间和9的字段UTC日期。需要将ASCII数字字符转换成二进制数值。例如时间字段“123456”需要被解析成小时12、分钟34、秒56。同时对$之后的所有字符直到*之前进行异或运算计算校验和。CALC_CHECKSUM当收到*字符后进入此状态接收后续两个字符十六进制表示的校验和并将其转换成数值存入checksum_received。VALIDATE比较checksum_calc和checksum_received。如果相等则产生一个valid_gps_data脉冲并将解析出的时间、日期等数据锁存到输出寄存器否则丢弃该帧。完成后回到IDLE。注意事项NMEA语句以回车换行符CRLF结束但校验和计算不包含它们。状态机需要正确处理所有分隔符逗号和结束符。字符串到数值的转换需要耐心通常采用“乘十累加”的方法value : value * 10 (character - 0)。由于FPGA中不支持动态字符串操作通常需要为每个感兴趣的字段如时间、日期预设一个足够大的字符缓冲区在解析时逐个填充字段结束时再统一转换。4.4 使用ModelSim进行关键仿真仿真对于FPGA设计至关重要尤其是对于时序逻辑复杂的状态机和与外设的接口。在ModelSim中我主要进行两类测试功能仿真为DCF77解码器和NMEA解析器编写测试平台。对于DCF77我创建一个模拟的DCF77信号发生器按照标准产生不同宽度的脉冲序列并验证解码状态机能否正确输出年、月、日、时、分。对于NMEA解析我编写一个任务通过UART模型发送一串完整的$GPRMC字符串观察状态机跳转和最终输出的时间数据是否正确。时序仿真在布局布线后导入包含实际延迟的SDF文件进行时序仿真。这可以检查在FPGA的实际布线条件下计数器是否还能在50MHz时钟下稳定工作显示扫描逻辑是否存在毛刺以及设置按钮的消抖逻辑是否可靠。特别要关注跨时钟域的信号如果存在如按键信号与系统时钟确保使用了同步器来避免亚稳态。5. 系统集成、调试与避坑实录5.1 手工焊接与布线的心得正如原文所说我的所有时钟都是手工焊接和布线的。这对于独一无二的原型机来说很灵活但也带来挑战。电源与地线是生命线尤其是驱动辉光管、荧光管需要高压180V和大电流灯丝。务必使用足够粗的导线如AWG20或更粗单独为高压部分布线并与低压数字电路FPGA 5V/3.3V的电源和地严格分开。最好在电源入口处使用磁珠或0欧电阻进行隔离并在关键芯片的电源引脚附近放置足够多的去耦电容如100nF陶瓷电容和10uF钽电容。信号完整性对于高速时钟线如50MHz晶振到FPGA和长距离的串行信号线如SPI到DS3234尽量走线短而直避免与高压或大电流线平行走线。如果条件允许使用双绞线传输差分信号或敏感信号。高压安全处理180V电压必须极其小心。确保所有高压连接点都有良好的绝缘热缩管、绝缘胶带。在通电调试前用万用表仔细检查高压和低压部分之间没有短路。强烈建议在高压部分串联一个限流电阻例如10kΩ/2W再进行初次上电测试即使短路也能将电流限制在安全范围内。5.2 上电调试流程与常见问题一个系统化的调试流程能极大提高效率电源先行不插任何芯片先上电测量所有电源节点的电压12V/5V/3.3V/180V是否准确、稳定。核心最小系统只焊接FPGA、JTAG接口、晶振和复位电路。通过JTAG尝试编程确保FPGA能被识别和配置。基础功能测试编写一个最简单的测试程序比如让一个LED以1Hz闪烁或者通过UART发送“Hello World”验证FPGA的基本IO和内部逻辑功能正常。模块逐个添加先添加显示驱动部分。写一个固定显示“123456”的程序测试辉光管、VFD或LCD是否都能正确点亮和显示。注意检查驱动芯片的使能信号和时序。传感器与输入接着测试DS18B20温度读取、按键输入。最后再接入DCF77或GPS无线接收模块。系统联调将所有模块整合进行整体功能测试。5.3 典型问题排查速查表现象可能原因排查步骤FPGA无法被JTAG识别电源不正常JTAG线连接错误TCK/TMS/TDI/TDO线接反或虚焊。1. 测量FPGA的VCCIO和VCCINT电压。2. 检查JTAG接头是否牢固线序是否正确。3. 用万用表蜂鸣档检查JTAG信号线从接头到FPGA引脚是否连通。辉光管不亮或显示错误数字高压未产生74141供电或输入错误阴极/阳极接反。1. 测量辉光管阳极对地是否有~180V直流电压。2. 测量74141的输入BCD码是否与FPGA输出一致。3. 检查辉光管管脚定义确认公共阳极接高压阴极通过限流电阻接驱动器。LCD无显示或乱码对比度电压不对初始化序列未正确执行时序不满足。1. 调节LCD对比度电位器通常接一个10k电位器到VCC和GND。2. 用逻辑分析仪或示波器抓取FPGA控制LCD的RS、E、数据线波形与HD44780时序图对比确保建立、保持时间满足要求。3. 确保上电后等待足够时间15ms再发送初始化指令。GPS时间不同步无线模块未配对波特率不匹配天线位置差NMEA解析错误。1. 确认433MHz发射和接收模块的地址、信道设置一致。2. 用USB转TTL工具直接连接GPS模块TX用串口助手查看是否能收到正确的NMEA语句。3. 将GPS模块放在开阔天空下静置几分钟等待其定位。4. 在FPGA设计中添加一个调试接口将解析过程中的关键状态如收到的字符、校验和结果输出到LED或串口辅助排查。时钟走时不准系统主晶振精度差DS3234电池没电或通信失败计数器分频比计算错误。1. 更换一个更高精度的有源温补晶振TCXO。2. 检查DS3234的电池电压应2.3V用逻辑分析仪抓取SPI时序看读写是否成功。3. 复核VHDL代码中counter_1sec的终值是否正确50,000,000 - 1。按键设置不响应按键硬件连接错误FPGA内部消抖逻辑未生效或参数不合理。1. 检查按键是低有效还是高有效上拉/下拉电阻是否正确。2. 在消抖模块中将消抖延时时间加大如20ms观察是否改善。用示波器直接看按键引脚的电平变化是否干净。5.4 关于无线方案的额外思考433MHz无线模块成本低、距离远但工作在开放频段容易受到同频段其他设备如遥控器、无线门铃的干扰。为了提高可靠性可以考虑以下措施协议加固不要在裸NMEA数据上直接发射。可以添加一个简单的帧头、帧尾和CRC校验。发射端将一帧完整的NMEA数据打包接收端校验通过后才交给解析器。这样即使有瞬间干扰也只会丢失一包数据不会导致解析器状态混乱。频道选择如果模块支持选择一个相对干净的频道。天线优化为发射和接收模块使用合适长度的天线对于433MHz1/4波长天线约17cm并尽量保持天线直立。这个项目从最初一个简单的数字钟想法逐步扩展成融合了传统无线电授时、现代卫星导航、多种显示技术和FPGA硬件设计的综合作品。它没有采用现成的PCB每一步搭建和调试都充满了动手的乐趣和解决问题的成就感。无论是选择稳健的DCF77还是追求全球覆盖和自动化的无线GPS抑或是构想一个融合两者的智能系统FPGA提供的硬件可编程能力都让这些想法有了坚实的实现基础。

相关新闻