课程设计——基于FPGA的交通红绿灯控制系统(源代码)

news2024/11/24 10:59:32

摘要:

        本课程设计旨在设计一个基于FPGA(现场可编程门阵列)的交通红绿灯控制系统。该系统模拟了实际道路交叉口的红绿灯工作场景,通过硬件描述语言(如Verilog或VHDL)编写源代码实现。系统包含三个主要部分:红绿灯显示模块、计时控制模块以及状态切换模块。红绿灯显示模块负责模拟红绿灯的亮灭状态;计时控制模块用于控制每个交通灯状态的持续时间;状态切换模块则根据计时信号和预设的交通规则切换红绿灯状态。通过FPGA的灵活编程能力,该系统能够实现对交通信号灯的精确控制,为智能交通系统提供硬件基础。

关键词FPGA,Verilog,数码管,led灯

1、引言

        Verilog HDL是现在世界上绝大多数数字IC工程师都在使用的一种硬件描述语言,它已经成为业界内数字电路设计的一种标准硬件描述语言。不同于原理图直接描述电路的结构和功能,它是以文本形式来描述数字电路的结构和功能的[1]Verilog HDL不但可以采用层次化的逻辑设计,而且还可以用于数字系统的仿真验证(用计算机仿真软件对数字逻辑电路的结构和行为进行分析预测,对HDL行为进行解释,一般的输出形式为波形图),逻辑综合(把硬件描述语言的数字电路逻辑模型转变成电路基本原件以及把这些基本元件进行连接生成电路模型)和时序分析等。Verilog HDL的应用场景有算法级别,寄存器传输级,逻辑级、门级和版图级等各个层级的设计和描述[2]

        FPGA(Field Programmable Gate Array,简称FPGA),翻译成中文就是现场可编程逻辑门阵列, FPGA器件属于专用集成电路中的一种半定制电路,它不像CPLD那样采用两级可编程的“与或”阵列来实现逻辑功能,而是基于查找表的原理来实现组合逻辑函数,能够有效的解决原有的器件门电路数较少的问题。FPGA 的基本结构包括可编程的I/O模块,可编程的逻辑块,数字时钟管理模块,嵌入式只读存储器,可编程连线资源,内部包含专用硬核,底层内嵌多种功能单元[3]FPGA逻辑功能编程简单,就好像向RAM中写数据一样。由于FPGA具有大量的布线资源,编程更加灵活,集成度更高,适合大规模,高性能的数字系统设计以及投资较低的特点,在数字电路设计领域得到了广泛的应用。

2、交通灯控制系统设计实现的软硬件

2.1、硬件

1)芯片:交通灯控制系统设计使用的 FPGA 芯片型号为 EP2C5T144C8,是属于ALTERA公司 CYCLONE 系列的产品。这款芯片主要的参数为,四千六百零八个逻辑单元LE,两个PLL13个嵌入式乘法器,RAM存储空间为276480bit,有一百五十八个I/O口,推荐的工作电压是一点一五伏特。

2JTAG接口:JIAG(联合测试工作组)接口可以把Quartus软件编译好的Verilog代码(.JIC文件)烧录进FPGA芯片中,因为FPGA是基于随机存储器的一种结构,它的内部没有固化的flash模块,无法存储数据,因此,通过JTAG下载的程序,关掉电源以后就会丢失,所以每次打开电源是都要重新下载才可以。目前,大多数高级部件都支持JTAG协议。

350MHz有源晶振:晶振在数字电路设计中的基本作用是提供一个时序控制的时钟信号。

图1图LED状态指示灯电路 

4LED状态指示灯电路 :由8个发光二极管L0~L7组成的状态指示灯显示电路,做输出实验 时可同时观察8个输出信号的电平变化。每只发光管的阳极接到3.3V电源,阴极分别串联一个电阻与FPGA芯片的IO脚相连。所接FPGA引脚输出为低电平时,该发光二极管被点亮。

图2 LED数码管电路

5LED数码管电路:数码管是一种非常直观而简单的输出显示形式,所以很多电子产品都选择用数码管作 为其显示部件。板载4 位共阳数码管,当位码信号为0 时,对应的数码管即操作;当段码信号为0 时,对应的段码点亮,位码由于电流较大,采用了三极管驱动。

6)按键低电平有效。

7JTAG下载线,USB电源连接线

图3 硬件实物图

2.2、软件

1Quartus II 13.0:本设计所使用的FPGA开发工具是Altera公司所推出的CPLD/FPGA开发软件Quartus II 13.0。这款软件的功能非常强大,支持原理图、VHDLVerilog HDL等多种设计输入形式[5]Quartus软件还具备综合和仿真的功能,可以完成完整的可编程逻辑器件的设计流程。由于其强大的功能和简洁的界面,Quartus II软件现在已经成为FPGA工程师开发项目工程的主流选择之一

2iverilogIcarus Verilog(简称iverilog )号称“全球第四大”数字芯片仿真器,也是一个完全开源的仿真器。iverilog以编译器的形式工作, 将以verilog编写的源代码编译为某种目标格式. 如果要进行仿真的话, 它可以生成一个叫做vvp的中间格式. 通过“iverilog + gtkwave”的方式,可以很方便地实现商用仿真器的功能。

3Notepad++Notepad++是一款简洁、高效的文本编辑器,支持多种常见的语言,具有很多强大的功能,比如自动保存,编辑只读文件,列编辑,格式编码,查找替换等等,可以为工程师开发工程节省大量的时间和精力。

3、交通灯控制系统主要功能和设计框图

3.1、主要功能

两组交通灯的红绿黄三种灯交替点亮,同时数码管显示各个灯的点亮时间。

3.2、系统总体设计思路

本设计采用自底向上的设计方法[7],有计时块、LED控制块、数码管显示块、时钟分频块四个always块。

3.3、具体模块分析

  1. 计时块(Timer Block)
    • 功能:负责产生计时信号,用于控制LED和其他模块的操作速度或周期。
    • 实现:使用一个计数器来追踪经过的时钟周期数。当达到预设的阈值时,可以产生一个中断或标志信号。
    • 接口:输入通常是时钟信号和可能的重置信号;输出是计时完成的标志或中断信号。
  2. LED控制块(LED Control Block)
    • 功能:根据当前状态或外部输入控制LED的亮灭模式。
    • 实现:使用状态机(如有限状态机FSM)来管理LED的不同模式或动画。状态机可以根据计时器的信号、用户输入或其他条件进行切换。
    • 接口:输入可能包括来自计时器的信号、用户输入或其他控制信号;输出是控制LED亮灭的信号。
  3. 数码管显示块(Digit Display Block)
    • 功能:显示时间、计数值或其他相关信息在数码管上。
    • 实现:根据输入的数字信号,将其转换为适合数码管显示的编码(如BCD或七段编码)。
    • 接口:输入是数字信号(可能来自计时器或其他数据源);输出是控制数码管段位的信号。
  4. 时钟分频块(Clock Divider Block)
    • 功能:将输入的时钟信号分频,产生不同频率的时钟信号,用于驱动不同速度的模块。
    • 实现:使用计数器来追踪输入的时钟周期数,并在达到某个预设值后产生一个新的时钟周期。
    • 接口:输入是高频的时钟信号;输出是不同频率的分频时钟信号。

4、代码实现

本设计采用自底向上的设计,是一种简单易实行的设计思路,尤其是对简单的系统控制设计方便快捷。首先确定需要的各个功能,通过不同的always块进行实现,最后通过对整体代码的编译即可实现功能。对于该红绿灯系统只需实现对LED灯与数码管的控制,利用多always块实现使程序易于更改,避免了多模块编程的繁琐。

以下是对给定代码的分段描述和解释:

模块定义

module led(clk,Led,rst,wei,shu);

定义了一个名为led的模块,该模块有五个端口:clk(时钟输入)、Led(LED控制输出)、rst(复位输入)、wei(数码管位选控制输出)和shu(数码管段选控制输出)。

输入输出定义

input wire clk,rst;
reg en=1;
output reg[7:0] Led=8'b01111101;
output reg[3:0] wei=4'b1100;
output reg[7:0] shu;

定义了输入clkrst,以及输出Ledweishu。其中Ledwei有初始值。

内部变量定义

reg [3:0]shuzi;
reg [1:0]cnt_state;
reg [15:0] cnt1;
reg [25:0] cnt=26'b0;
reg [15:0]  tim=24'b0;
reg cc=0,clk1=0;
reg [3:0]data_ew_0,data_ew_1;

定义了内部变量,如shuzi(用于存储数码管显示的数字)、cnt_state(用于状态切换)等。

数码管不同位显示内容

//数码管不同位显示内容
always @*
begin
 data_ew_0=tim%10;
 data_ew_1=tim/10;
 end

根据tim的值,计算数码管两位数的个位和十位,并存储在data_ew_0data_ew_1中。

对50MHz晶振分频

 //对50MHz晶振分频
always@(posedge clk)
begin
 if(cnt == 25000000)
  begin cnt <= 0; clk1 <= ~clk1;	end
  else  begin cnt <= cnt+1'b1;end
end

对输入的clk(假设为50MHz)进行分频,产生新的时钟信号clk1

数码管点亮时间控制

//数码管点亮时间控制
always@(posedge clk)
begin
 if(cnt1 < 250)
  begin cc<=1;cnt1 <= cnt1+1'b1 ;	end
  else if(cnt1<500) begin cnt1 <= cnt1+1'b1;cc<=0;end
  else cnt1 <= 0;
end

控制数码管的点亮时间,通过cc信号来控制。

LED闪烁控制

always @(posedge clk1)
begin 
if(!rst)           begin tim<=0; Led<=8'b111111111; end
     if(tim==3)       begin Led<=8'b01111110;tim<=tim+1;	end
     else if(tim==6)   begin Led<=8'b10111011;tim<=tim+1;	end
	 else if(tim==9)   begin Led<=8'b11011011;tim<=tim+1;	end
	 else if(tim==12)  begin Led<=8'b01111101;tim<=0;	end
     else            tim<=tim+1;
end

根据tim的值和复位信号rst,控制LED的闪烁。

切换数码管点亮的2个状态

//切换数码管点亮的2个状态
always @ (posedge clk)
begin
    if (!rst)
        cnt_state <= 2'b00;
    else  if (cc)
        cnt_state <= 2'b00;
    else
        cnt_state <= 2'b01;
end 

根据复位信号rstcc信号,切换数码管显示的状态(个位或十位)。

数码管显示内容控制

//数码管显示内容控制
always @ (posedge clk)
 begin
    if(!rst) begin
        wei  <= 4'b0000;
        shuzi  <= 4'b0000;
    end 
    else if(en) begin       
        case (cnt_state) 
            2'b00 : begin     
                wei <= 4'b0100;             
                shuzi <= data_ew_1;
            end       
            2'b01 : begin     
                wei <= 4'b1000;              
                shuzi <= data_ew_0;
            end 
				 default : begin     
                wei <= 4'b1100;                     
                shuzi <= 4'b0;end
        endcase
    end
    else  begin
          wei <= 4'b0000;
          shuzi <= 4'b0000;    
    end
end 

根据当前状态cnt_state和复位信号rst,控制数码管显示的位和段。

数码管段选显示

always@(posedge clk)
begin
    if(!rst)
        shu <= 8'hff;
    else begin   //数码管段选显示
        case(shuzi)
            4'd0		:	shu=8'h03;	
			4'd1		:	shu=8'h9f;
			4'd2		:	shu=8'h25;
			4'd3		:	shu=8'h0d;
			4'd4		:	shu=8'h99;
			4'd5		:	shu=8'h49;
			4'd6		:	shu=8'h41;
			4'd7		:	shu=8'h1f;
			4'd8		:	shu=8'h01;
			4'd9		:	shu=8'h19;
            Default  :   shu=8'hff;
        endcase
    end
end
endmodule

根据shuzi的值,控制数码管的段选显示。

代码总结(附源码)

该模块实现了一个基于FPGA的红绿灯和数码管显示系统。其中,数码管用于显示时间(可能是一个倒计时),而LED灯则根据时间进行闪烁。此外,还包括了对时钟的分频和数码管显示的精确控制。

module led(clk,Led,rst,wei,shu);
input wire clk,rst;
reg en=1;
output reg[7:0] Led=8'b01111101;
output reg[3:0] wei=4'b1100;
output reg[7:0] shu;
reg [3:0]shuzi;
reg [1:0]cnt_state;
reg [15:0] cnt1;
reg [25:0] cnt=26'b0;
reg [15:0]  tim=24'b0;
reg cc=0,clk1=0;
reg [3:0]data_ew_0,data_ew_1;
//数码管不同位显示内容
always @*
begin
 data_ew_0=tim%10;
 data_ew_1=tim/10;
 end
 //对50MHz晶振分频
always@(posedge clk)
begin
 if(cnt == 25000000)
  begin cnt <= 0; clk1 <= ~clk1;	end
  else  begin cnt <= cnt+1'b1;end
end
//数码管点亮时间控制
always@(posedge clk)
begin
 if(cnt1 < 250)
  begin cc<=1;cnt1 <= cnt1+1'b1 ;	end
  else if(cnt1<500) begin cnt1 <= cnt1+1'b1;cc<=0;end
  else cnt1 <= 0;
end

always @(posedge clk1)
begin 
if(!rst)           begin tim<=0; Led<=8'b111111111; end
     if(tim==3)       begin Led<=8'b01111110;tim<=tim+1;	end
     else if(tim==6)   begin Led<=8'b10111011;tim<=tim+1;	end
	 else if(tim==9)   begin Led<=8'b11011011;tim<=tim+1;	end
	 else if(tim==12)  begin Led<=8'b01111101;tim<=0;	end
     else            tim<=tim+1;
end
//切换数码管点亮的2个状态
always @ (posedge clk)
begin
    if (!rst)
        cnt_state <= 2'b00;
    else  if (cc)
        cnt_state <= 2'b00;
    else
        cnt_state <= 2'b01;
end 

//数码管显示内容控制
always @ (posedge clk)
 begin
    if(!rst) begin
        wei  <= 4'b0000;
        shuzi  <= 4'b0000;
    end 
    else if(en) begin       
        case (cnt_state) 
            2'b00 : begin     
                wei <= 4'b0100;             
                shuzi <= data_ew_1;
            end       
            2'b01 : begin     
                wei <= 4'b1000;              
                shuzi <= data_ew_0;
            end 
				 default : begin     
                wei <= 4'b1100;                     
                shuzi <= 4'b0;end
        endcase
    end
    else  begin
          wei <= 4'b0000;
          shuzi <= 4'b0000;    
    end
end 

always@(posedge clk)
begin
    if(!rst)
        shu <= 8'hff;
    else begin   //数码管段选显示
        case(shuzi)
            4'd0		:	shu=8'h03;	
			4'd1		:	shu=8'h9f;
			4'd2		:	shu=8'h25;
			4'd3		:	shu=8'h0d;
			4'd4		:	shu=8'h99;
			4'd5		:	shu=8'h49;
			4'd6		:	shu=8'h41;
			4'd7		:	shu=8'h1f;
			4'd8		:	shu=8'h01;
			4'd9		:	shu=8'h19;
            Default  :   shu=8'hff;
        endcase
    end
end
endmodule

5、仿真

在本次课程设计中,我们利用Iverilog软件对基于FPGA的红绿灯系统进行了功能仿真。通过Iverilog的仿真环境,我们能够模拟红绿灯系统的实际运行情况,验证其逻辑功能的正确性。

在仿真过程中,我们首先编写了红绿灯系统的Verilog源代码,包括红绿灯显示模块、计时控制模块以及状态切换模块的实现。随后,我们将这些代码加载到Iverilog仿真器中,并设置相应的输入信号和仿真时间。

通过运行仿真,我们能够观察到红绿灯系统在不同状态下的运行情况,包括红灯、黄灯、绿灯的亮灭以及它们之间的切换。仿真结果能够直观地展示系统的逻辑功能和时序关系,帮助我们快速定位和解决潜在的问题。

通过本次功能仿真,我们验证了红绿灯系统设计的正确性,为后续的FPGA硬件实现提供了有力的支持。

仿真波形

6、结论

交通灯控制系统设计采用 Verilog 硬件描述语言,按自底向上的设计方法,将设计的数字系统作为一个整体,通过对四个不同的always块设计 , 分别包括,计时块,时钟分频块,数码管段选块, 数码管位选块,led灯控制块。用iverilog对整体进行仿真得到波形,待到仿真通过后,将程序通过JTAG下载器下载到EP4CE6F17C8芯片中,并在FPGA开发板上验证其功能。经过FPGA开发板的验证实现,本设计完全符合所预期的设计需求。

参考文献

  1. 周景润.基于Quartus的FPGA数字系统设计[M].北京:电子工业出版社,2007:212-306.
  2. Mark Zwolinski.Verilog HDL数字系统设计[M].北京:电子工业出版社,2007.
  3. 黄智伟等.FPGA系统设计与实践[M].北京:电子工业出版社,2005.
  4. 蔡明生.电子设计[M].北京:高等教育出版社,2004.
  5. 周梦然.CPLD/FPGA的开发与应用[M].北京:中国矿业大学出版社,2007.
  6. 刘小俊.基于FPGA技术的IP核设计[J].武汉理工大学学报,2005:43-47.
  7. 冯维川.基于FPGA的多功能空调控制器设计[J].电子技术,2007:67-69.
  8. 阎石.数字电子技术基础:第五版[M]. 北京:高等教育出版社,2006.
  9. 金明.数字统设计与verilog HDL[M].电子工业出版社,2021.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1834470.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DAY6-力扣刷题

1.下一个排列 31. 下一个排列 - 力扣&#xff08;LeetCode&#xff09; 整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列。 例如&#xff0c;arr [1,2,3] &#xff0c;以下这些都可以视作 arr 的排列&#xff1a;[1,2,3]、[1,3,2]、[3,1,2]、[2,3,1] 。 整数数组…

2024年移动端技术探索

2024年移动端技术探索 引子 2023年号称AI元年&#xff0c;AI带来了一些不是很清晰的机会&#xff0c;没有看到有多好的落地&#xff0c;对于互联网&#xff0c;不止技术层面没有突破&#xff0c;业务层面的需求也断崖式下滑&#xff0c;没有创新就没有需求&#xff0c;老业务…

Folly,一个强大的C++库

目录 1.引言 2.Folly库的特点 3.Folly库的应用场景 4.示例代码 5.总结 1.引言 Folly 是Facebook开发的一个开源、无许可&#xff08;Apache 2.0&#xff09;的现代C库&#xff0c;旨在提升性能和简化编写复杂任务的工作流程。它包含了一系列用于系统级编程的工具&#xff…

联华集团:IT团队如何实现从成本中心提升至价值中心|OceanBase 《DB大咖说》(十)

OceanBase《DB大咖说》第 10 期&#xff0c;我们邀请到了联华集团的CTO楼杰&#xff0c;来分享他如何思考 IT 业务价值&#xff0c;以及联华华商数据库的升级实践。 楼杰从大学毕业后就进入了联华工作&#xff0c;并一直扎根在近 20 年的&#xff0c;从一名底层的技术员成长为…

Swift Combine — Future和Promise的使用

平时在开发的过程中&#xff0c;免不了进行异步编程&#xff0c;比如进行网络请求&#xff0c;以前异步编程的时候主要采用两种方法&#xff1a; 通过代理方法&#xff0c;设置代理&#xff0c;实现代理方法。通过闭包block块处理。 采用第一种方法代码分家&#xff0c;不利于…

eNSP学习——配置DHCP中继

目录 主要命令 原理概述 实验目的 实验内容 实验拓扑 实验编址 实验步骤 1、基本配置 2、搭建OSPF网络 3、配置DHCP服务器 4、配置DHCP中继 5、配置PC获取地址方式为DHCP 主要命令 //配置指定DHCP服务器的方法 //方法一&#xff1a;在面向PC的接口下直接配置DHCP服…

CentOS 7.9上创建的JBOD阵列恢复(二)

系列文章目录 CentOS 7.9上创建JBOD&#xff08;一&#xff09; CentOS 7.9检测硬盘坏区、实物定位&#xff08;三&#xff09; 文章目录 系列文章目录前言一、用命令查看是否认到盘二、直接组JBOD三、挂载到新目录四、查看原数据总结 前言 在CentOS 7.9上创建了一个软阵列JB…

游戏运营与发行:从入门到实践

&#x1f482; 个人网站:【 摸鱼游戏】【神级代码资源网站】【工具大全】&#x1f91f; 一站式轻松构建小程序、Web网站、移动应用&#xff1a;&#x1f449;注册地址&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交…

数据中心分类和类别综合指南

数据中心可根据其规模、功能、所有权、层级和部署方法进行分类。以下是一些典型的数据中心类别和分类。 数据中心的分类和分级 根据尺寸 1. 小型数据中心&#xff1a;通常是为了满足对IT基础设施需求较少的组织或小型企业的需求而创建的。与大型数据中心相比&#xff0c;小型…

Redis缓存设计之常见问题及解决方案

背景&#xff1a;缓存的常见问题及对应的解决方案进行了整理&#xff0c;给大家分享一下。 1.缓存穿透 缓存穿透是指查询一个根本不存在的数据&#xff0c; 缓存层和存储层都不会命中&#xff0c; 通常出于容错的考虑&#xff0c; 如果从存储 层查不到数据则不写入缓存层。 缓…

【深度学习】GPT-3,Language Models are Few-Shot Learners(一)

论文&#xff1a; https://arxiv.org/abs/2005.14165 摘要 最近的研究表明&#xff0c;通过在大规模文本语料库上进行预训练&#xff0c;然后在特定任务上进行微调&#xff0c;可以在许多NLP任务和基准上取得显著的进展。虽然这种方法在结构上通常是任务无关的&#xff0c;但…

国内外LabVIEW开发的区别

​分析国内外在LabVIEW开发中的差异需要从多个方面进行比较&#xff0c;包括界面设计、架构设计、注释与文档、调试方法、维护策略以及升级与迭代管理等。 界面设计&#xff1a; 国外的LabVIEW界面设计通常更加注重用户体验和视觉美观&#xff0c;使用现代化的控件和布局&…

基于ResNet-18的简单分类(新手,而且网络效果不咋滴,就是学个流程)

引言 先看问题&#xff1a; 我手边有一数据集&#xff0c;然后我想分分类&#xff01;~~ 咳咳&#xff0c;最近刚做了一个&#xff1a;训练集有1143张&#xff0c;分为5类&#xff0c;里面图片是打乱的。测试集有248张&#xff0c;想把它分分类看看咋样。 再看一下效果: …

mellanox HCA IB网卡固件更新

注意事项&#xff1a; 1.如果PSID以SGN开头&#xff0c;说明该产品是曙光的OEM产品&#xff0c;可以向HPC高速网络部获取固件。如果PSID以MT开头&#xff0c;说明该产品是Mellanox或nvidia的标准产品&#xff0c;可以通过官网下载固件。 2.通过官网获取固件&#xff0c;一定要…

Nginx缓存之web缓存配置

Web 缓存可节约网络带宽&#xff0c;有效提高用户打开网站的速度。由于应用服务器被请求次数的降低&#xff0c;也相对使它的稳定性得到了提升。Web 缓存从数据内容传输的方向分为前向位置缓存和反向位置缓存两类。如下图所示。 前向位置缓存既可以是用户的客户端浏览器&#x…

【免费API推荐】:轻松集成,为您的应用增添更多价值(9)

开发者喜爱的免费API是他们在开发过程中最宝贵的伙伴。这些API提供了丰富的功能和数据&#xff0c;帮助开发者构建出令人惊叹的应用。无论是地图服务、社交媒体集成、数据分析还是人工智能&#xff0c;这些免费API为开发者提供了强大的工具和资源&#xff0c;让他们能够更轻松地…

任务4.8.3 利用SparkSQL统计每日新增用户

实战概述&#xff1a;利用SparkSQL统计每日新增用户 任务背景 在大数据时代&#xff0c;快速准确地统计每日新增用户是数据分析和业务决策的重要部分。本任务旨在使用Apache SparkSQL处理用户访问历史数据&#xff0c;以统计每日新增用户数量。 任务目标 处理用户访问历史数…

兴业法拍网周报|在北京你是选择租房还是买房?(6.10-6.14)

西城区金融世家10号楼6单元801、803&#xff08;共两套&#xff09; 位置优越:金融世家所在区域位于国家政治中心和国家金融管理中心&#xff0c;是凝集国家“政经”的焦点。临近长安街、金融街、西二环交通动脉&#xff0c;道路通畅便捷&#xff0c;保值率高。 优质教资:附近…

Objective-C 学习笔记 | KVO(key-value obsereving)

Objective-C 学习笔记 | KVO&#xff08;key-value obsereving&#xff09; Objective-C 学习笔记 | KVO&#xff08;key-value obsereving&#xff09;使用 KVOKVO 的工作原理 Objective-C 学习笔记 | KVO&#xff08;key-value obsereving&#xff09; KVO 是指当指定的对象…

如何掌握 Java 中的国际化和本地化

随着全球化的发展&#xff0c;软件开发不仅要满足本地用户的需求&#xff0c;还要满足全球用户的需求。因此&#xff0c;软件的国际化&#xff08;Internationalization&#xff0c;I18N&#xff09;和本地化&#xff08;Localization&#xff0c;L10N&#xff09;显得尤为重要…