搜档网
当前位置:搜档网 › iOS Storyboard全解析

iOS Storyboard全解析

iOS Storyboard全解析
iOS Storyboard全解析

iOS Storyboard全解析

来源:https://www.sodocs.net/doc/213610738.html,/blog/1493956

Storyboard)是一个能够节省你很多设计手机App界面时间的新特性,下面,为了简明的说明Storyboard的效果,我贴上本教程所完成的Storyboard的截图:

现在,你就可以清楚的看到这个应用究竟是干些什么的,也可以清楚的看到其中的各种关系,这就是Storyboard的强大之处了。如果你要制作一个页面很多很复杂的App,Storyboard可以帮助你解决写很多重复的跳转方法的麻烦,节省很多时间,以便你能够完全的专注于核心功能的实现上。

开始

首先启动Xcode,新建一个工程,我们在这里使用Single View App Template,这个模板会提供一个类和一个Storyboard,免去我们自己创建的麻烦。

创建完成之后,Xcode的界面大概是这样的:

这个新的工程由两个类:AppDelegate和ViewController以及一个Storyboard组成(如果你选择了两个设备会有两个Storyboard),注意这个项目没有xib文件,让我们首先看看Storyboard 是什么样的,双击Storyboard打开他:

Storyboard 的样子和工作方式都和Interface Builder(以下简称为IB)像极了,你可以从左下方的控件库中拖动控件到你的View之中并且组织他们的排放顺序,唯一不同的地方就是,Storyboard 不止是包含一个视图控件,而是所有的视图控件以及他们之间的关系。

Storyboard对一个视图的官方术语是一个场景,但是一个场景其实就是一个ViewController,在iPhone中一次只能够展示一个场景,而在iPad中一次可以展示多个场景,比如Mail应用程序。

通过尝试添加一些控件,你可以感受一下Storyboard的工作方式。

这个是数据显示器,显示所有场景及其控件的结构。

在IB中,这个位置显示的是你的NIB文件中的文件,而在Storyboard中这里显示的是

ViewController,目前这里只有一个ViewController,我们接下来可能会增加一些。

这是一个文档管理器的缩小版,叫做dock。

Dock 展示场景中第一级的控件,每个场景至少有一个ViewController和一个FirstReponder,但是也可以有其他的控件,Dock还用来简单的连接控件,如果你需要向ViewController传递一个关系时,只需要将其按住Ctrl键拖到ViewController上就可以了。

Note:你大概不会太长使用FirstResponder,因为它只是一个代理控件,代表着当前你所使用的控件。

现在运行这个应用,他会向我们设计的界面一样。

如果你以前制作过NIB型的应用的话,你也许回去寻找MainWindow.xib ,这个文件包括所有的ViewController,Appdelegate等等,但是在Storyboard中这个特性已经被废止了。

那么,没有这个文件,应用从那里起始呢?

让我们打开AppDelegate文件,看看那上面是怎么说的:

1.#import

2.

3.@interface AppDelegate : UIResponder

4.

5.@property (strong, nonatomic) UIWindow *window;

6.

7.@end

如果要使用Storyboard特性,那么AppDelegate必须继承自UIResponder类,之前则是继承自NSObject类的,而且必须有一个不是UIOutlet类的Window属性声明才可以。

如果你再去看AppDelegate的执行文件,里面大概什么都没有,甚至连

application:didFinishLaunchingWithOptions: 也只是返回了一个YES,而之前,这里则需声明一个ViewController并且将他设置成起始页面,但是现在这些都没有了。

秘密就在info.plist文件中,打开Ratings-Info.plist (在Supporting Files group里) 你就会看到这些:

在NIB为UI的应用里,info.plist文件中有一个键兼做NSMainNibFile,或者叫做Main nib file base name,他用来指示UIApplication载入MainWindow.xib,并且将他与应用链接起来,而现在这个键值消失了。

而Storyboard应用则利用UIMainStoryboardFile,或者“Main storyboard file base name”

键值来表示当App初始化时的Storyboard名称,当程序运行时,UIApplication会使用

MainStoryboard.sotryboard作为第一加载项,并且将他的UIWindow展示在屏幕上,不需要任何编程工作。

在项目总结面板上,你也可以看到并且编辑这些信息:

如果你还想设置nib文件的话,另外有地方去设置的。

为了完成这个实验性的小程序,我们打开main.m,加入

1.#import

2.

3.#import"AppDelegate.h"

4.

5.int main(int argc, char *argv[])

6.{

7.@autoreleasepool {

8.return UIApplicationMain(argc, argv, nil,

9. NSStringFromClass([AppDelegate class]));

10. }

11.}

之前是UIApplicationMain()的函数现在是空的,变成了NSStringFromClass([AppDelegate class]).

与之前使用MainWindow.xib的一个最大的不同是:现在app delegate已经不是Storyboard 的一部分了,这是因为app delegate不再从nib文件中,而侍从Storyboard中加载了,我们必须告诉UIApplicationMain 我们的app delegate类的名字是什么,否则他将无法找到。

制作一个Tab类型的应用

本教程中的Rating App拥有两个Tab,在Storyboard中,很轻松就能够做出一个Tab视图。

回到MainStoryboard.storyboard中,直接从左边的Library拖进来一个TabViewController就可以了。

新的Tab Bar Controller附带了两个View controller,分别作为Tab的视图使用,UITabBarController被称为包含视图,因为他包含这其他一些View,其他常见的包含视图还有那vi嘎提鸥鸟Controller和SplitView Controller。

在iOS 5中,你还可以自己写一个自定义的Controller,这在以前是做不到的。

包含关系在Storyboard中用一下这种箭头表示。

拉一个Label控件到第一个子试图中,命名为“First Tab”,再在第二个子视图中添加一个Label,命名为“Second Tab”。

注意:当屏幕的缩放大于100%时,你无法在单个场景中添加控件。

选中Tab Bar Controller,进入属性检查器,选中“作为起始场景”,如下图:

现在那个没有头的虚虚的小箭头指向了Tab Bar Controller,说明他是起始场景。

这意味着,当你启动这个应用的时候,UIApplication将会将这个场景作为应用的主屏幕。Storyboard一定要有一个场景是起始场景才行。

现在运行试试吧

code专门为创造这种Tab Bar的应用准备了一个模板,我们也可以使用他,但是自己有能力不用模板自己做一个Tab Bar也是不错的事。

如果你添加了多于五个子视图到一个TabBarcontroller的话,并不会创造五个Tab,第四个tab会自动变成More标签,不错吧

制作一个表格视图

目前连接到Tab bar Controller的视图都是普通的View Controller,现在,我要用一个TableViewController来代替其中的一个ViewController。

单击第一个视图并删除,从Library中拖出一个TableViewController。

在选中这个TableViewController的前提下,从Library中拖出一个NavController,将会直接附着在上面。

当然也可以调换顺序,我完全没意见。

由于NavController和TabBarController一样也是一个包含控制器视图,所以他也必须包含另一个视图,你可以看到同样的箭头连接者这两个View。

请注意所有嵌套在NavController下的View都会有一个Navigation Bar,你无法移除它,因为他是一个虚拟的Bar。

如果你检视属性检测器,你就会发现所有bar的属性都在一起:

“Inferred”是Storyboard中的默认设置,他意味着继承的关系,但是你也可以改变他。但是请注意这些设置都是为了让你更好的进行设计和这样设置的,随意修改默认设置会带来不可遇见的后果,施主自重。

现在让我们把这个新的场景连接到Tab Bar Controller中,按住Ctrl拖动,或者右键。

当你放手的时候,一个提示框会出现。

当然是选第一个了,Relationship – viewControllers ,这将自动创建两个场景之间的关系。

直接拖动就可以改变Tab Item的顺序,同时也会改变显示Tab的顺序,放在最左边的Tab会第一个显示。

现在运行试试看吧

在我们在这个应用中加入任何实质性的功能之前,我们先来清理一下Storyboard,你不需要改变

TabBarController中的任何内容而只需要改变他的子视图就可以了。

每当你连接一个新的视图到TabBarController中的时候,他就会自动增加一个Tab Item,你可以使用他的子视图来修改该Item的图片和名称。

在NavController中选中Tab Item并且在属性编辑其中将其修改为Player。

将第二个Tab Item命名为“Gesture”

我们接下来把自定义的图片加入到这些item中,源码中包含一个名为“Image”的文件夹,在那里你可以找到我们用到的资源。

接下来,将NavController的title改为Player,也可以使用代码··

运行看一看,难以置信吧,你到现在也没写一条代码。

原型表格单元

你也许已经注意到了,自从我们加入了Table View Controller之后,Xcode便会现实下面这样一条警告。

这条警告是:“Unsupported Configuration: Prototype table cells must have reuse identifiers”意思是,原型表格单元必须有一个身份证(意译啦)

原型单元格是另一个Storyboard的好特性之一。在之前,如果你想要自定义一个Table Cell,那么你就不得不用代码来实现,要么就要单独创建一个Nib文件来表示单元格内容,现在你也可以这样做,不过原型单元格可以帮你把这一过程大大的简化,你现在可以直接在Storyboard设计器中完成这一过程。

Table View现在默认的会带有一个空白的原型单元格,选中他,在属性控制器中将他的Style改为subtitle,这样的话,每一格就会有两行字。

将附件设置为Disclosure Indicator并且将这个原型单元格的Reuse Identifier 设置喂

“PlayerCell”,这将会解决Xcode所警告的问题。

试着运行一个,发现什么都没变,这并不奇怪,因为我们还没有给这个表格设置一个数据来源

(DataSource),用以显示。

新建一个文件,使用UIViewContoller模板,命名为PlayersViewController ,设置喂

UITableViewController的子类,不要勾选建立XIB文件。

回到Storyboard编辑器,选择Table View Controller,在身份控制器中,把他的类设置为PlayerViewController,这对于把Storyboard中的场景和你自定义的子类挂钩是十分重要的。要是不这么做,你的子类根本没用。

现在起,当你运行这个应用时,table view controller其实是PlayersViewContoller的一个实例。

在PlayersViewController.h 中声明一个MutableArray(可变数组)

1.#import

2.

3.@interface PlayersViewController : UITableViewController

4.

5.@property (nonatomic, strong) NSMutableArray *players;

6.

7.@end

这个数组将会包含我们的应用的主要数据模型。我们现在加一些东西到这个数组之中,新建一个使用Obj-c模板的文件,命名为player,设置喂NSObject的子类,这将会作为数组的数据容器。

编写Player.h如下:

1.@interface Player : NSObject

2.

3.@property (nonatomic, copy) NSString *name;

4.@property (nonatomic, copy) NSString *game;

5.@property (nonatomic, assign) int rating;

6.

7.@end

编写Player.m如下:

1.#import"Player.h"

2.

3.@implementation Player

4.

5.@synthesize name;

6.@synthesize game;

7.@synthesize rating;

8.

9.@end

这里没有什么复杂的,Player类只是一个容器罢了,包含三个内容:选手的名字、项目和他的评级。

接下来我们在App Delegate中声明数组和一些Player对象,并把他们分配给

PlayerViewController的players属性。

在AppDelegate.m中,分别引入(import)Player和PlayerViewController这两个类,之后新增一个名叫players的可变数组。

1.#import"AppDelegate.h"

2.#import"Player.h"

3.#import"PlayersViewController.h"

4.

5.@implementation AppDelegate {

6. NSMutableArray *players;

7.}

8.

9.// Rest of file...

修改didFinishLaunchingWithOptions方法如下:

1.- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptio

ns:(NSDictionary *)launchOptions

2.{

3. players = [NSMutableArray arrayWithCapacity:20];

4. Player *player = [[Player alloc] init];

5. https://www.sodocs.net/doc/213610738.html, = @"Bill Evans";

6. player.game = @"Tic-Tac-Toe";

7. player.rating = 4;

8. [players addObject:player];

9. player = [[Player alloc] init];

10. https://www.sodocs.net/doc/213610738.html, = @"Oscar Peterson";

11. player.game = @"Spin the Bottle";

12. player.rating = 5;

13. [players addObject:player];

14. player = [[Player alloc] init];

15. https://www.sodocs.net/doc/213610738.html, = @"Dave Brubeck";

16. player.game = @"Texas Hold’em Poker";

17. player.rating = 2;

18. [players addObject:player];

19. UITabBarController *tabBarController =

20. (UITabBarController *)self.window.rootViewController;

21. UINavigationController *navigationController =

22. [[tabBarController viewControllers] objectAtIndex:0];

23. PlayersViewController *playersViewController =

24. [[navigationController viewControllers] objectAtIndex:0];

25. playersViewController.players = players;

26.return YES;

27.}

这将会创造一些Player对象并把他们加到数组中去。之后在加入:

1.UITabBarController *tabBarController = (UITabBarController *)

2. self.window.rootViewController;

3.UINavigationController *navigationController =

4. [[tabBarController viewControllers] objectAtIndex:0];

5.PlayersViewController *playersViewController =

6. [[navigationController viewControllers] objectAtIndex:0];

7.playersViewController.players = players;

咦,这是什么?目前的情况是:我们希望能够将players数组连接到PlayersViewController的players属性之中以便让这个VC能够用做数据来源。但是app delegate根本不了解

PlayerViewController究竟是什么,他将需要在storyboard中寻找它。

这是一个我不是很喜欢storyboard特性,在IB中,你在MainWindow.xib中总是会有一个指向App delegate的选项,在那里你可以在顶级的ViewController中向Appdelegate设置输出口,但是在Storyboard中目前这还不可能,目前只能通过代码来做这样的事情。

1.UITabBarController *tabBarController = (UITabBarController *)

2. self.window.rootViewController;

我们知道storyboard的起始场景是Tab Bar Controller,所以我们可以直接到这个场景的第一个子场景来设置数据源。

PlayersViewController 在一个NavController的框架之中,所以我们先看一看

UINavigationController类:

1.UINavigationController *navigationController = [[tabBarController

2. viewControllers] objectAtIndex:0];

然后询问它的根试图控制器,哪一个是我们要找的PlayersViewController:

1.PlayersViewController *playersViewController =

2. [[navigationController viewControllers] objectAtIndex:0];

但是,UIViewController根本就没有一个rootViewController属性,所以我们不能把数组加入进去,他又一个topViewController但是指向最上层的视图,与我们这里的意图没有关系。

现在我们有了一个装在了players物体合集的数组,我们继续为PlayersViewController设置数据源。

打开PlayersViewController.m,加入以下数据源方法:

1.- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

2.{

3.return1;

4.}

5.

6.- (NSInteger)tableView:(UITableView *)tableView

7. numberOfRowsInSection:(NSInteger)section

8.{

9.return [self.players count];

10.}

真正起作用的代码在cellForRowAtIndexPath方法里,默认的模板是如下这样的:

1.- (UITableViewCell *)tableView:(UITableView *)tableView

2. cellForRowAtIndexPath:(NSIndexPath *)indexPath

3.{

4.static NSString *CellIdentifier = @"Cell";

5.

6. UITableViewCell *cell = [tableView

7. dequeueReusableCellWithIdentifier:CellIdentifier];

8.if (cell == nil) {

9. cell = [[UITableViewCell alloc]

10. initWithStyle:UITableViewCellStyleDefault

11. reuseIdentifier:CellIdentifier];

12. }

13.

14.// Configure the cell...

15.return cell;

16.}

无疑这就是以前设置一个表格视图的方法,不过现在已经革新了,把这些代码修改如下:

1.- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPat

h:(NSIndexPath *)indexPath

2.{

3. UITableViewCell *cell = [tableView

4. dequeueReusableCellWithIdentifier:@"PlayerCell"];

5. Player *player = [self.players objectAtIndex:indexPath.row];

6. cell.textLabel.text = https://www.sodocs.net/doc/213610738.html,;

7. cell.detailTextLabel.text = player.game;

8.return cell;

9.}

这看上去简单多了,为了新建单元格,你只需使用如下代码:

1.UITableViewCell *cell = [tableView

2. dequeueReusableCellWithIdentifier:@"PlayerCell"];

如果没有现存的单元格可以回收,程序会自动创造一个原型单元格的复制品之后返回给你,你只需要提供你之前在Storyboard编辑视图中设置的身份证就可以的,在这里就是“PlayerCell”,如果不设置这个,这个程序就无法工作。

由于这个类对于Player容器目前一无所知,所以我们需要在文件的开头加入一个引入来源

1.#import"Player.h"

记得要创建synthesize语句哦亲

1.@synthesize players;

现在运行应用,会看到Table里有着players容器。

请注意:我们这里只使用一种单元格原型,如果你需要使用不同类型的单元格的话,只需要在

storyboard中另外加入一个单元格原型就可以了,不过不要忘记给他们指派不同的身份证。

设计自定义的原型单元格

对于很多应用来说,使用默认的单元格风格就OK了,但是我偏偏要在每一个单元格的右边加上一个一个图片来表示选手的评级,但是添加图片对于默认类型的单元格来说并不支持,我们需要自定义一个设计。

让我们转回MainStoryboard.storyboard,选中table view中的prototype cell,把它的Style attribute改为Custom,所有默认的标签都会消失。

首先把单元格变得更高一些,你可以直接拉它,也可以在大小控制器中修改数字,我在这里使用55点的高度。

从Objects Library中拖出两个标签物体,按照之前的样式安插到单元格里,记得设置label的Highlighted颜色为白色,那样的话当单元格被选中的时候会看起来更好看一些。

之后添加一个Image View对象,将它放置在单元格的右边,设置他的宽度为81点,高度并不重要,在属性检查器中设置模式为置中。

我把标签设置为210点长以确保他不会和ImageView重合,最后整体的设计会看起来象下面这样:

由于这是一个自定义的单元格,所以我们不能够使用UITableView默认的textLabel和detailLabel 来设置数据,这些属性也不再指向我们的单元格了,我们使用标签(tags)来指定标签。

将Name标签的tag设置为100,Game的设置喂101,image的设置喂102,在属性检查器里设置哦亲。

之后打开PlayersViewController.m ,在PlayersViewcontroller中将cellForRowatIndexPath 修改为:

1.- (UITableViewCell *)tableView:(UITableView *)tableView

2. cellForRowAtIndexPath:(NSIndexPath *)indexPath

3.{

4. UITableViewCell *cell = [tableView

5. dequeueReusableCellWithIdentifier:@"PlayerCell"];

6. Player *player = [self.players objectAtIndex:indexPath.row];

7. UILabel *nameLabel = (UILabel *)[cell viewWithTag:100];

8. nameLabel.text = https://www.sodocs.net/doc/213610738.html,;

9. UILabel *gameLabel = (UILabel *)[cell viewWithTag:101];

10. gameLabel.text = https://www.sodocs.net/doc/213610738.html,;

11. UIImageView * ratingImageView = (UIImageView *)

12. [cell viewWithTag:102];

13. ratingImageView.image = [self imageForRating:player.rating];

14.return cell;

15.}

这里是用了一个新的方法,叫做ImageRating,在cellForRowAtIndexPath方法之前加入这个方法:

1.- (UIImage *)imageForRating:(int)rating

2.{

3.switch (rating)

4. {

5.case1: return [UIImage imageNamed:@"1StarSmall.png"];

6.case2: return [UIImage imageNamed:@"2StarsSmall.png"];

7.case3: return [UIImage imageNamed:@"3StarsSmall.png"];

8.case4: return [UIImage imageNamed:@"4StarsSmall.png"];

9.case5: return [UIImage imageNamed:@"5StarsSmall.png"];

10. }

11.return nil;

12.}

这就完成了,运行看看:

这和我们想象的结果并不是很符合,我们修改了原型单元格的属性和高度,但是table view却没有考虑进去,有两种方法可以修复它,我们可以改变table view的行高或者加入

heightForRowAtIndexPath 方法来修改,地一种方法更简单,我们就用他。

注意:在一下两种情况下,你应该使用heightForRowAtIndexPath 方法:一是,你不能预先知道你的单元格的高度,二是不同的单元格会有不同的高度。

回到MainStoryboard.storyboard,在大小检查器中将高度设置为55:

通过这种方式的话,如果之前你是使用拖动而不是键入数值的方式改变高度的属性的话,则table view的数值也会自动改变。

现在运行看看,好多了吧

为原型单元格设置子类

我们的表格视图已经相当像模像样了,但是我并不是很喜欢使用tag来访问label,要是我们能够把这些lable连接到输出口,之后在回应属性中使用他们,该多好,而且不出所料,我们可以这样做。

使用Objective-C class模板新建一个文件,命名为PlayerCell,继承UITableViewCell。

修改PlayerCell.h

1.@interface PlayerCell : UITableViewCell

2.

3.@property (nonatomic, strong) IBOutlet UILabel *nameLabel;

4.@property (nonatomic, strong) IBOutlet UILabel *gameLabel;

5.@property (nonatomic, strong) IBOutlet UIImageView

6. *ratingImageView;

7.

8.@end

修改PlayerCell.m

1.#import"PlayerCell.h"

2.

3.@implementation PlayerCell

4.

5.@synthesize nameLabel;

6.@synthesize gameLabel;

7.@synthesize ratingImageView;

8.

9.@end

这个类本身并不其很大的作用,只是为nameLabel、gameLabel和ratingImageView声明了属性。

回到MainStoryboard.storyboard选中原型单元格,将他的class属性修改为“PlayerCell”,现在当你向table view请求dequeueReusableCellWithIdentifier,他会返回一个PlayerCell实例而不是一个普通的UITableViewCell实例。

请注意我将这个类和reuse Indetifier的名字命名的一样,只是营卫我喜欢这样哦亲,这两个之间其实没啥关系。

现在你可以将标签和image view连接到输出口去了,选中或者将他从链接检查器拖动到table view cell。

请注意:要把这个control连接到table view cell而不是view controller哦亲,别选错了。

现在我们把一切都链接好了,只需要加入数据源的代码就可以了。

1.- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPat

h:(NSIndexPath *)indexPath

2.{

3. PlayerCell *cell = (PlayerCell *)[tableView

4. dequeueReusableCellWithIdentifier:@"PlayerCell"];

5. Player *player = [self.players objectAtIndex:indexPath.row];

6. https://www.sodocs.net/doc/213610738.html,Label.text = https://www.sodocs.net/doc/213610738.html,;

7. cell.gameLabel.text = player.game;

8. cell.ratingImageView.image = [self

9. imageForRating:player.rating];

10.return cell;

11.}

我们现在将接收到dequeueReusableCellWithIdentifier 的控件指派到PlayerCell,只需要简单的使用已经链接labels和image view到设置好的属性上就可以了,这会让这个设计看上去更加好控制,更加简明。

当然,在PlayerCell前要引入资源:

1.#import"PlayerCell.h"

试着运行,你会发现其实什么都没有变化,可是我们都知道,内部已经有了变化。

在这相同的场景下面,我们可是在使用子类呢。

这里还有一些设计小窍门:第一点:一定要设置标签被选中时的颜色。

第二点,确保你加入单元格的字符大小是可以变化的,这样,当单元格大小变化时,他的内容的大小也会跟着变化,比如说:

在PlayersViewController.m中加入如下方法:

1.- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCe

llEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath

2.{

3.if (editingStyle == UITableViewCellEditingStyleDelete)

4. {

5. [self.players removeObjectAtIndex:indexPath.row];

6. [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath

] withRowAnimation:UITableViewRowAnimationFade];

7. }

8.}

这个方法加入好了之后,用手指轻扫一行单元格,会出现一个删除键,试试看

Delete按钮出现在右边,遮住了一部分评级图片,怎么解决呢?

打开MainStoryBoard.storyboard,选中table view cell中的image view,在大小检查器中修改Autosizing属性,是它能够跟随上级view的边缘。

为labels设置同样的属性。

加入了这些变动之后,删除按钮如我们意料的出现了:

其实,最好的做法是让这些星星在出现delete按钮的时候消失,不过这只是一个练习,不要太较真哦亲

如果你想了解更多Storyboard的特性,那么你就来对了地方,下面我们就来接着上次的内容详细讲解Storyboard的使用方法。

在上一篇《Storyboard全解析-第一部分》中,我们介绍了如何使用storyboard来制作多种场景和如何将这些场景链接起来,我们还学习了如何自定义一个表格视图。

接下来这部分,也是最后一部分,我们将讲解联线(segue),静态单元格等内容,我们还将加入一个选手详细内容页面,和一个游戏选择页面。

Segues的介绍

现在,让我们创建一个场景使用户可以自己增加新的选手进入列表。

在Players界面中拖入一个Bar Button,放置在导航栏的右侧,在属性监视器中将他的Identifier 改为“add”,这样他就会显示一个加号的按钮,当用户点击这个按钮时,他就会弹出一个新的场景让用户对新的内容进行编辑或添加。

在编辑器中拖入一个新的Table View Controller,放置在Players场景的右边,然后按住ctrl,拉动加号键到新的场景中,这样,这个场景就会自动和这个按钮建立联系,从而自动归入Navigation View Controller中。

放开鼠标之后,会出现如下选项:

选中Modal,你可以注意到出现了一种新的箭头形式:

这种链接形式被官方称为segue(pronounce: seg-way),我叫它联线,(其实是转换的意思)这种形式的联线是表示从一种场景转换到另外一种场景中,之前我们使用的连接都是描述一种场景包含另一种场景的。而对于联线来说,它会改变屏幕中显示的内容,而且必须由交互动作触发:如轻点,或其他手势。

联线真正了不起的地方在于:你不再需要写任何代码来转入一个新的场景,也不用在将你的按钮和IBAction连接到一起,我们刚才做的,直接将按钮和场景链接起来,就能够完成这项工作。

运行这个app,按下+ 键,会发现出现了一个新的列表。

这种叫做“modal” segue(模态转换),新的场景完全盖住了旧的那个。用户无法再与上一个场景交互,除非他们先关闭这个场景,过一会我们会讨论push segue,这种segue会把场景推入导航栈。

新的场景现在还没有什么用,你甚至不能把他关闭呢。

联线只能够把你送到新的场景,你要是想回来,就得使用delegate pattern,代理模式。我们必须首先给这个新的场景设置一个独有的类,新建一个继承UITableViewController的类,命为PlayerDetailsViewController。

为了把它和storyboard相连,回到MainStoryBoard,选择新建的那个Table View Contrller,将他的类设置喂PlayerDetailViewController,千万不要忘记这一步,这很重要。

做完这一步之后,把新场景的标题改为“Add Player”,分别加入“Done”和“Cancel”两个导航栏按钮。

修改PlayerDetailsViewController.h 如下:

1.@class PlayerDetailsViewController;

2.

3.@protocol PlayerDetailsViewControllerDelegate

4.- (void)playerDetailsViewControllerDidCancel:

5. (PlayerDetailsViewController *)controller;

6.- (void)playerDetailsViewControllerDidSave:

7. (PlayerDetailsViewController *)controller;

8.@end

9.

10.@interface PlayerDetailsViewController : UITableViewController

11.

12.@property (nonatomic, weak) id delegat

e;

13.

14.- (IBAction)cancel:(id)sender;

15.- (IBAction)done:(id)sender;

16.

17.@end

这会声明一个新的代理机制,当用户点击Cancel或者done按钮时,我们将用它来交互Add Player 场景和主场景通讯。

回到故事版编辑器,将Cancel和Done按钮分别与动作方法连接,一种方式是,按住Ctrl拖动到ViewController上,之后选择正确的动作。

在PlayerDetailsViewController.m,加入如下代码:

1.- (IBAction)cancel:(id)sender

2.{

3. [self.delegate playerDetailsViewControllerDidCancel:self];

4.}

5.- (IBAction)done:(id)sender

6.{

7. [self.delegate playerDetailsViewControllerDidSave:self];

8.}

这是两个导航栏按钮要使用的方法,现在只需要让代理知道我们刚才加入了代码,而真正关闭场景只是代理的事情。

一般来说一定要为代理制定一个对象参数,这样他才知道向那里发送信息。

不要忘记加入Synthesize语句。

1.@synthesize delegate;

现在我们已经为PlayerDetailsViewController设置了一个代理协议,我们需要将这个协议的实现方法(implement)写在什么地方,很明显应该写在PlayerViewController因为这个vc代表了Add Player场景。在PlayersViewController.h中加入如下代码:

1.#import"PlayerDetailsViewController.h"

2.

3.@interface PlayersViewController : UITableViewController

ontrollerDelegate>

并在PlayersViewController.m的结尾加入:

1.#pragma mark - PlayerDetailsViewControllerDelegate

2.

3.- (void)playerDetailsViewControllerDidCancel:

4. (PlayerDetailsViewController *)controller

5.{

6. [self dismissViewControllerAnimated:YES completion:nil];

7.}

8.

9.- (void)playerDetailsViewControllerDidSave:

10. (PlayerDetailsViewController *)controller

11.{

12. [self dismissViewControllerAnimated:YES completion:nil];

13.}

目前这个代理方法只能够跳转到这个新的场景中,接下来我们来让他做一些更为强大的事情。

iOS 5 SDK中新添加的dismissViewControllerAnimated:completion: 方法可以被用来关闭一个场景。

最后还有一件事情需要做,就是Players场景需要告诉PlayerDetailsVC他的代理在哪里,听上去这种工作在故事版编辑其中一拖就行了,实际上,你得使用代码才能完成。

将以下方法加入到PlayersViewController 中

1.- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

2.{

3.if ([segue.identifier isEqualToString:@"AddPlayer"])

4. {

5. UINavigationController *navigationController =

6. segue.destinationViewController;

7. PlayerDetailsViewController

8. *playerDetailsViewController =

9. [[navigationController viewControllers]

10. objectAtIndex:0];

11. playerDetailsViewController.delegate = self;

12. }

13.}

当使用Segue的时候,就必须加入这个名叫prepareForSegue 的方法,这个新的ViewController 在被加载的时候还是不可见的,我们可以利用这个机会来向他发送数据。

请注意,这个segue的最终目标是Navigation Controller,因为这个是我们链接在导航栏上的按钮,为了获取PlayerDetailsViewController实例,我们必须通过NavController的属性来获取。

试着运行一下这个应用,单击+ 键,然后试着关闭Add Player场景,仍然不管用。

这是因为我们没有给Segue指定一个identifier,而parepareForSegu需要检查AddPlayer的身份证,这是必须的,因为你有可能会同时使用多个联线。

为了解决这个问题,进入Storyboard的编辑器,点击Players场景和NavgationViewController 场景之间的联线,你会注意到与这个连线相关的按钮会自动亮起来。

在属性监视器中,将Identifier设置喂“AddPlayer”

如果这是你再次运行这个应用,点击“Cancel”或者“Done”按钮,这个场景就会自动关闭并且返回到上一级场景。

注意:从modal场景调用dismissViewControllerAnimated:completion方法是我们在这里使用的,但是这并不意味着你必须这样做。但是,如果你不是代理来完成这个关闭窗口的工作的话,唯一需要注意的是,如果你之前使用了[self.parentViewController

dismissModalViewControllerAnimated:YES] 语句来关闭窗口的话,那么这个语句就不会正常工作了。

顺便说一下,属性检查器中有一个Transition的选项,在这里你可以选择场景转换是的动画效果。

试着运行一下,看看那种动画你最喜欢吧,但事情不要改变Style这个选项,如果你改变了,这个app可能会crash哦。

我们接下来在这个教程中还会用到几次代理方法,下面我们来列一下为了完成一个连线,你需要做的几件事情。

?首先,从起始的控件做一条联线到目标场景。

?将这个联线制定一个独特的Identifier。

实验一 八位全加器的设计

电子科技大学电子工程学院标准实验报告(实验)课程名称EDA技术与应用 姓名:孙远 学号:2010021030002 指导教师:窦衡 电子科技大学教务处制表

实验一八位全加器的设计 一、预习内容 1.结合教材中的介绍熟悉QuartusⅡ软件的使用及设计流程; 2.八位全加器设计原理。 二、实验目的 1.掌握图形设计方法; 2.熟悉QuartusⅡ软件的使用及设计流程; 3.掌握全加器原理,能进行多位加法器的设计。 三、实验器材 PC机一台、EDA教学实验系统一台、下载电缆一根(已接好)、导线若干 四、实验要求 1、用VHDL设计一个四位并行全加器; 2、用图形方式构成一个八位全加器的顶层文件; 3、完成八位全加器的时序仿真。 五、实验原理与内容 1、原理: 加法器是数字系统中的基本逻辑器件。例如:为了节省资源,减法器和硬件乘法器都可由加法器来构成。但宽位加法器的设计是很耗费资源的,因此在实际的设计和相关系统的开发中需要注意资源的利用率和进位速度等两方面的问题。多位加法器的构成有两种方式:并行进位和串行进位方式。并行进位加法器设有并行进位产生逻辑,运算速度快;串行进位方式是将全加器级联构成多位加法器。通常,并行加法器比串行级联加法器占用更多的资源,并且随着位数的增加,相同位数的并行加法器比串行加法器的资源占用差距也会越来越大。 实验表明,4 位二进制并行加法器和串行级联加法器占用几乎相同的资源。这样,多位数加法器由4 位二进制并行加法器级联构成是较好的折中选择。因此本实验中的8 位加法器采用两个4位二进制并行加法器级联而成。

2、实现框图: 1)四位加法器 四位加法器可以采用四个一位全加器级连成串行进位加法器,实现框图如下图所示,其中CSA为一位全加器。显然,对于这种方式,因高位运算必须要等低位进位来到后才能进行,因此它的延迟非常可观,高速运算肯定无法胜任。 通过对串行进位加法器研究可得:运算的延迟是由于进位的延迟。因此,减小进位的延迟对提高运算速度非常有效。下图是减少了进位延迟的一种实现方法。可见,将迭代关系去掉,则各位彼此独立,进位传播不复存在。因此,总的延迟是两级门的延迟,其高速也就自不待言。 2)八位加法器 用两个并行四位加法器实现一个八位加法器的框图如下:

电子政务软件开发行业分析报告I65软件和信息技术服务业

电子政务软件开发行业分析报告 1、行业及发展概况 1.1行业概况 1.1.1 软件行业总体市场 软件行业作为国家基础性、战略性产业,在促进经济和社会发展具有重要作用。中国软件行业市场总量近年来保持快速增长的趋势,软件行业业务收入在国内生产总值中所占的比重不断攀升。根据工业和信息化部历年电子信息产业经济运行公报数据显示,2009、2010 年中国软件产业完成业务收入分别为9,513亿元和13,364 亿元,分别较上年增长25.62%和40.48%。2011 年中国软件业务收入达18,468 亿元,同比增长38.19%,超过“十一五”期间平均增速10个百分点,实现了“十二五”软件行业的良好开局。2012 年、2013 年和2014 年软件业务收入分别达到25,022 亿元、30,587 亿元和37,235 亿元,分别较上年增长35.49%、22.24%和21.73%。2008-2014 年中国软件行业业务收入规模及增长情况如下图: 1.1.2电子政务市场的发展状况 电子政务是指政府机构在其管理和服务职能中运用现代信息技术,实现政府组织结构和工作流程的重组优化,超越时间、空间和部门分隔的制约,建成一个精简、高效、廉洁、公平的政府运作模式。主要包括三个组成部分:一是政府部门内部的电子化和网络化办公;二是政府部门间通过计算机网络进行的信息共享和实时通信;三是政府部门通过网络与民众之间进行的双向信息交流。 20世纪80年代初以来,国务院有关部门相继建设了一批业务系统、办公自动化系统和政务自动化系统。比如“十五”期间,国家推进了金关、金税、金盾、金审等重点电子政务工程建设,取得了重要进展,这些应

word文档使用教程

WORD文档使用教程 文字处理的基本问题 1.内容的编辑 2.格式的设置 内容 可以用文字、表格、图形等表示 格式的设置 1.对文字格式的设置 2.对表格格式的设置 3.对图形格式的设置 对内容的要求 主题鲜明、内容充实、层次清晰、重点突出 对格式的要求 1.整体风格协调统一,并能充分反映主题特色 2.注重文字、表格、图片的各种排版细节 文字的编辑与格式设置 字符的格式设置 1)字符的格式 A.样式:已定义好的格式有章、节、正文、目录等。 B.字体:宋体、黑体、隶书等中文字体及数十种外文字体。 C.字号:中文八号~初号,英文4~127磅值。 D.字型:精体、斜体、粗斜体和带下划线。 E.美化:加边框、加底纹和缩放等

F.其他加底色、着重号、加删除线、排字符等 2)对字符进行格式设置的方式 3)复制某段文本中应用的全部格式 A.将已有的文本的格式复制到另一个个文本。 B. C.注意:单击格式刷,一次复制格式,双击格式刷,多次复制格式。段落的格式设置 1)段落的格式 A.段落标记符 B.文本的对齐 C.文本的缩进 D.行、段落间距 E.制表符 F.首字下沉 2)对段落进行格式设置的方式 A.段落标记符——标示了段落的结束,也存储了该段落的格式。 B.文本的对齐 对齐方式:两端对齐、左对齐、居中、右对齐、分散对齐。

C.文本的缩进 缩进方式:首行缩进、整段缩进、悬挂式缩进、右缩进。 D.行、段落间距 图表 1 段落的设置还可以调整段落的行距、段落间的距离等等。 这些也都可以在“段落对话框”中进行设置。 E.制表符 Tab键插入一个制表符,宽度由默认值或用户设置。 对齐方式:左对齐、居中、右对齐、小数点对齐。 设置制表符: F.首字下沉 使用“格式|首字下沉”命令,在对话框中选择下沉的方式等。

8位全加器的设计

课程设计报告 课程名称数字逻辑课程设计 课题8位全加器的设计 专业计算机科学与技术 班级1202 学号34 姓名贺义君 指导教师刘洞波陈淑红陈多 2013年12月13日

课程设计任务书 课程名称数字逻辑课程设计 课题8位全加器的设计 专业班级计算机科学与技术1202 学生姓名贺义君 学号34 指导老师刘洞波陈淑红陈多审批刘洞波 任务书下达日期:2013年12月13日 任务完成日期:2014年01月21日

一、设计内容与设计要求 1.设计内容: 本课程是一门专业实践课程,学生必修的课程。其目的和作用是使学生能将已学过的数字电子系统设计、VHDL程序设计等知识综合运用于电子系统的设计中,掌握运用VHDL或者Verilog HDL设计电子系统的流程和方法,采用Quartus II等工具独立应该完成1个设计题目的设计、仿真与测试。加强和培养学生对电子系统的设计能力,培养学生理论联系实际的设计思想,训练学生综合运用数字逻辑课程的理论知识的能力,训练学生应用Quartus II进行实际数字系统设计与验证工作的能力,同时训练学生进行芯片编程和硬件试验的能力。 题目一4线-16线译码器电路设计; 题目二16选1选择器电路设计; 题目三4位输入数据的一般数值比较器电路设计 题目四10线-4线优先编码器的设计 题目五8位全加器的设计 题目六RS触发器的设计; 题目七JK触发器的设计; 题目八D触发器的设计; 题目九十进制同步计数器的设计; 题目十T触发器的设计; 每位同学根据自己学号除以10所得的余数加一,选择相应题号的课题。 参考书目 1 EDA技术与VHDL程 序开发基础教程 雷伏容,李俊,尹 霞 清华大学出版 社 978-7-302-22 416-7 201 TP312VH/ 36 2 VHDL电路设计雷伏容清华大学出版 社 7-302-14226-2 2006 TN702/185 3 VHDL电路设计技术王道宪贺名臣? 刘伟 国防工业出版 社 7-118-03352-9 2004 TN702/62 4 VHDL 实用技术潘松,王国栋7-8106 5 7-81065-290-7 2000 TP312VH/1 5 VHDL语言100 例详解 北京理工大学A SIC研究所 7-900625 7-900625-02-X 19 99 TP312VH/3 6 VHDL编程与仿真王毅平等人民邮电出版 社 7-115-08641-9 20 00 7 3.9621/W38V 7 VHDL程序设计教程邢建平?曾繁泰清华大学出版 社 7-302-11652-0 200 5 TP312VH/27 /3

web前端开发行业前景分析

web前端开发行业前景分析 作为网页制作的一个细分行业,Web前端在国内乃至国际上真正开始受到重视的时间不超过10年,而大学课程的缺乏,让这一职业人才缺口很大。据统计2016年Web前端工程师职位最低月薪约为8000元,最高月薪达到1,5000+,市场人才需求一直呈现上涨状态,可谓“钱景”广阔。 那么Web前端为什么这么火,前景究竟如何呢? Web前端是做什么的? Web前端工程师,他是伴随着web兴起而细分进去的行业。Web前端的岗位职责是利用(X)HTML/CSS/JavaScript/DOM/Flash等各种Web技能结合产品的界面开发。制作标准化纯手工代码,并增加交互功能,开拓JavaScript和Flash 模块,同时结合后端开拓技能仿照全部效果,结束丰富互联网的Web开拓,致力于经过进程技能改进用户体验。 Web前端就业前景以及薪资待遇如何? 大前端不但薪资高,也是目前国内最紧缺的岗位。从招聘网站分析,其用人数量已经远远超过主流编程语言Java、ASP、和ios等的开拓人员的数量。随着谷歌、YouTube、Twitch等大型企业纷纷将视线转投向HTML5,更加确认了HTML5在互联网时代的发展远景。 据统计,我国对于HTML5前端工程师人员的缺口将达到12万左右。目前,北京、上海、广州、深圳等地HTML5前端工程师的薪资待遇更是一飙再飙。 Web前端基础技能知识都有哪些? Web前端基础知识: 1、html+css。 2、JavaScript。不是所有的网页都必须有js,但是要想实现一些超酷的功能和界面的时候,就需要涉及到js。如果没有别的编程语言的基础的话,学起来可以或者要费些力。

TestWorld V4.1.2使用说明书

1 概述 (1) 2 操作说明 (1) 2.1 软件的安装 (1) 2.1.1 配置与环境 (1) 2.1.1.1 运行环境 (1) 2.1.1.2 配置文件 (1) 2.1.2 安装及运行 (2) 2.2 主界面窗口 (2) 2.2.1 菜单和键盘操作 (2) 2.2.2 主界面介绍 (3) 2.3 系统功能窗口界面 (7) 2.3.1 文件 (7) 2.3.1.1 读取数据 (7) 2.3.1.2 存储数据 (8) 2.3.1.3 数据另存为 (8) 2.3.1.4 测试方法读取 (8) 2.3.1.5 测试方法存储 (9) 2.3.1.6 试验过程数据导出到Excel (10) 2.3.1.7 打印设置 (10) 2.3.1.8 试验退出 (11) 2.3.2 输出 (11) 2.3.2.1 数据打印 (11) 2.3.2.2 曲线打印 (12) 2.3.2.3 全部打印 (12) 2.3.3 图形 (12) 2.3.3.1 图形分析 (13) 2.3.3.2 图形存储 (15) 2.3.3.3 图形删除 (15) 2.3.4 条件 (16) 2.3.4.1 试样参数 (16) 2.3.4.2 报告数据 (19) 2.3.4.3 试验控制 (19) 2.3.4.4 设置选项 (23) 2.3.4.4.1 负荷传感器 (23) 2.3.4.4.2 单位选择 (24) 2.3.4.4.3 引伸计(或X轴)选择 (24) 2.3.4.4.4 试验类型选择 (25) 2.3.4.4.5 试验数据选择 (26) 2.3.4.4.6 参数输入:如图2-26所示界面。 (27) 2.3.4.5 系统复位 (27) 2.3.5 操作向导 (28) 3 报告编程 (29) 3.1使用Excel (29) 3.1.1 为单元格或单元格区域命名 (29) 3.1.2 删除选定单元格的名称 (29) 3.1.3 创建自定义页眉和页脚 (30) 3.2报告原理简介 (30) 3.2.1 报告模板的数据项 (30)

青岛软件开发就业前景

软件开发就业前景 有句话说得好:“用电脑就是用软件”。而软件产业的发展也在改变着人们的日常生活,甚至成为IT产业发展的重要推动力。环顾世界,微软、Adobe、Oracle 等公司无不是从软件起家,逐步发展到目前的庞大规模。因此,从某种意义上说,靠软件吃饭,是一辈子的事情。因此,YJBYS小编为大家整理了2017年软件开发专业就业前景,以供大家参考! 「职业定义」 软件工程师主要进行软件前期的项目需求的分析,然后对项目进行风险评估并试图解决这些风险,然后开始进行软件的开发,后期对软件的进度做相关的评估。 「职业分析」 软件工程师是从事软件开发相关工作的人员的统称。它是一个广义的概念,包括软件设计人员、软件架构人员、软件工程管理人员、程序员等一系列岗位。这些岗位的分工不同,职位和/或级别不同,但工作内容都是与软件开发生产相关的。软件工程师是IT行业需求量最大的职位,稳居IT行业职位需求TOP10 的第一位。 软件工程师的技术要求是比较全面的,除了最基础的编程语言(C语言 /C++/JAVA等)、数据库技术(SQL/ORACLE/DB2等)、.NET平台技术、C#、C/S B/S 程序开发,还有诸多如JAVA SCRIPT、AJAX、HIBERNATE、SPRING、J2EE、 WEB SERVICE、STRUCTS等前沿技术。除此之外,关于网络工程和软件测试的其他技术也要有所涉猎,以利于操控全局。 软件工程师发展空间大 软件工程师的发展空间非常的大,软件工程师可以做数据库工程师、软件安全工程师、软件管理员,随着经验的积累可以做高级网路工程师、项目主管、项目经理,如果你有魄力的话,还可以自己创业。总之,软件工程师的发展空间非常的大,只要你肯努力,有好的技术实力,很多好的职位都在等着你。 软件工程师发展前景

world操作方法

1. 问:WORD 里边怎样设置每页不同的页眉?如何使不同的章节显示的页眉不同? 答:分节,每节可以设置不同的页眉。文件――页面设置――版式――页眉和页脚――首页不同。 2. 问:请问word 中怎样让每一章用不同的页眉?怎么我现在只能用一个页眉,一改就全部改了? 答:在插入分隔符里,选插入分节符,可以选连续的那个,然后下一页改页眉前,按一下“同前”钮,再做的改动就不影响前面的了。简言之,分节符使得它们独立了。这个工具栏上的“同前”按钮就显示在工具栏上,不过是图标的形式,把光标移到上面就显示出”同前“两个字来。 3. 问:如何合并两个WORD 文档,不同的页眉需要先写两个文件,然后合并,如何做? 答:页眉设置中,选择奇偶页不同/与前不同等选项。 4. 问:WORD 编辑页眉设置,如何实现奇偶页不同? 比如:单页浙江大学学位论文,这一个容易设;双页:(每章标题),这一个有什么技巧啊?

答:插入节分隔符,与前节设置相同去掉,再设置奇偶页不同。 5. 问:怎样使WORD 文档只有第一页没有页眉,页脚? 答:页面设置-页眉和页脚,选首页不同,然后选中首页页眉中的小箭头,格式-边框和底纹,选择无,这个只要在“视图”――“页眉页脚”,其中的页面设置里,不要整个文档,就可以看到一个“同前”的标志,不选,前后的设置情况就不同了。 6. 问:如何从第三页起设置页眉? 答:在第二页末插入分节符,在第三页的页眉格式中去掉同前节,如果第一、二页还有页眉,把它设置成正文就可以了 ●在新建文档中,菜单―视图―页脚―插入页码―页码格式―起始页码为0,确定;●菜单―文件―页面设置―版式―首页不同,确定;●将光标放到第一页末,菜单―文件―页面设置―版式―首页不同―应用于插入点之后,确定。第2 步与第三步差别在于第2 步应用于整篇文档,第3 步应用于插入点之后。这样,做两次首页不同以后,页码从第三页开始从1 编号,完成。 7. 问:WORD 页眉自动出现一根直线,请问怎么处理?

用原理图输入方法设计8位全加器

实验一 用原理图输入方法设计8位全加器 1.实验目的和要求 本实验为综合性实验,综合了简单组合电路逻辑,MAX+plus 10.2的原理图输入方法, 层次化设计的方法等内容。其目的是通过一个8位全加器的设计熟悉EDA 软件进行电子线路设计的详细流程。学会对实验板上的FPGA/CPLD 进行编程下载,硬件验证自己的设计项目。 2.实验原理 1位全加器可以用两个半加器及一个或门连接而成,半加器原理图的设计方法很多,我们用一个与门、一个非门和同或门(xnor 为同或符合,相同为1,不同为0)来实现。先设计底层文件:半加器,再设计顶层文件全加器。 (1) 半加器的设计: 半加器表达式:进位:co=a and b 和:so=a xnor ( not b ) 半加器原理图如下: (2) 全加器的设计: 全加器原理图如下: 3.主要仪器设备(实验用的软硬件环境) 实验的硬件环境是: 微机 I113co a so b 1 0101 0110001 10 0co so b a not xnor2 and2 I113ain cout cout ain bin sum cin bin sum cin f_adder or2a f e d u3 u2 u1 b a c co so B co so B h_adder A h_adder A

EDA实验开发系统 ZY11EDA13BE 并口延长线,JTAG延长线 实验的软件环境是: MAX+plus 10.2 4.操作方法与实验步骤 ●按照4.1 节介绍的方法与流程,完成半加器和全加器的设计,包括原理图输入、编译、综合、适配、仿真、实验板上的硬件测试,并将此全加器电路设置成一个硬件符号入库。 ●建立一个更高的原理图设计层次,利用以上获得的1位全加器构成8位全加器,并完成编译、综合、适配、仿真、硬件测试。 5.实验内容及实验数据记录 1.设计半加器: 用原理图输入的方法输入一个半加器的逻辑图,如图所示: 然后在assign里头的device里头根据试验箱的芯片设置Decices,接着就设置输入输出荧脚的输入端和输出端,设置如表1所示: 表1.半加器引脚端口设置 引脚名称设置端口 ain input Pin=45 bin input Pin=46 co output Pin=19 so output Pin=24 然后Save,名称为h_add.gdf,再save & Compile。 结果如图所示:

软件开发专业前景分析

软件开发专业前景分析 随着社会的发展,软件行业已经成为一个象征高薪的职业,而且随着人们生活水平的提高,对于精神上的享受要求更高,所以掌握软件开发这门技术就代表着你已经握住了开启成功大门的金钥匙。 几种热门软件专业的就业前景分析 java就业前景分析 据有关数据显示,目前,我国对软件人才的需求已达20万,并且以每年20%左右的速度增长。在未来5年内,合格软件人才的需求将远大于供给。2010年,我国软件人才的缺口已达43.5万,其中尤以JA VA人才最为缺乏。当前世界各地持有Java Programmer证书的人员供需差距极大,迫使企业不得不用高薪聘请Java 程序员。因此,Java Programmer的含金量比一般的技术人员要高出很大一块。在美国、加拿大、澳大利亚、新加坡等发达国家和中等发达国家,持有Java Programmer认证证书的人年薪均在4-10万美金,而在国内持有Java Programmer认证的程序员也有极好的工作机会和很高的薪水。 嵌入式就业前景分析 根据业内发布的薪资报告,嵌入式行业初入门的开发人员平均月薪一般都能达到5000元左右,有3年以上经验的人员年薪都在10万元以上,中高级的嵌入式软件工程师月薪平均已超过万元,具有10年工作经验的高级嵌入式软件工程师年薪在30万元左右。 Android的就业前景分析 随着Android平台的扩张,引发了Android人才荒,2010年移动开发人才需求20万,未来人才需求缺口将达百万。但符合条件的Android工程师屈指可数,企业招聘难度可想而知。我们相信,在未来几年内,Android开发工程师将成为3G行业炙手可热的岗位之一。3G人才全球紧缺,实用人才培养已迫在眉睫!在国内三大运营商如火如荼的3G营销战持续升温,再加上3G的推出对整个行业的巨大推动作用,无疑将引爆3G手机开发工程师这个黄金职位。 软件工程(服务外包)专业就业前景分析 随着世界产业转移的加速,欧美、日本等发达国家将大量的软件开发业务转移到中国、印度等国家。

world使用技巧1

问:WORD里边怎样设置每页不同的页眉?如何使不同的章节显示的页眉不同? 答:分节,每节可以设置不同的页眉。文件——页面设置——版式——页眉和页脚——首页不同 问:请问word中怎样让每一章用不同的页眉?怎么我现在只能用一个页眉,一改就全部改了? 答:在插入分隔符里,选插入分节符,可以选连续的那个,然后下一页改页眉前,按一下“同前”钮,再做的改动就不影响前面的了。简言之,分节符使得它们独立了。这个工具栏上的“同前”按钮就显示在工具栏上,不过是图标的形式,把光标移到上面就显示出”同前“两个字来了 问:如何合并两个WORD文档,不同的页眉需要先写两个文件,然后合并,如何做? 答:页眉设置中,选择奇偶页不同/与前不同等选项 问:WORD编辑页眉设置,如何实现奇偶页不同? 比如:单页浙江大学学位论文,这一个容易设;双页:(每章标题),这一个有什么技巧啊? 答:插入节分隔符,与前节设置相同去掉,再设置奇偶页不同 问:怎样使WORD文档只有第一页没有页眉,页脚? 答:页面设置-页眉和页脚,选首页不同,然后选中首页页眉中的小箭头,格式-边框和底纹,选择无,这个只要在“视图”——“页眉页脚”,其中的页面设置里,不要整个文档,就可以看到一个“同前”的标志,不选,前后的设置情况就不同了。 问:如何从第三页起设置页眉? 答:在第二页末插入分节符,在第三页的页眉格式中去掉同前节,如果第一、二页还有页眉,把它设置成正文就可以了 ●在新建文档中,菜单—视图—页脚—插入页码—页码格式—起始页码为0,确定; ●菜单—文件—页面设置—版式—首页不同,确定; ●将光标放到第一页末,菜单—文件—页面设置—版式—首页不同—应用于插入点之后,确定。 第2步与第三步差别在于第2步应用于整篇文档,第3步应用于插入点之后。这样,做两次首页不同以后,页码从第三页开始从1编号,完成。 问:WORD页眉自动出现一根直线,请问怎么处理? 答:格式从“页眉”改为“清除格式”,就在“格式”快捷工具栏最左边;选中页眉文字和箭头,格式-边框和底纹-设置选无 问:页眉一般是---------,上面写上题目或者其它,想做的是把这根线变为双线,WORD中修改页眉的那根线怎么改成双线的? 答:按以下步骤操作去做: ●选中页眉的文字,包括最后面的箭头 ●格式-边框和底纹 ●选线性为双线的 ●在预览里,点击左下小方块,预览的图形会出现双线 ●确定 ▲上面和下面自己可以设置,点击在预览周围的四个小方块,页眉线就可以在不同的位置问:Word中的脚注如何删除?把正文相应的符号删除,内容可以删除,但最后那个格式还在,应该怎么办? 答:步骤如下: 1、切换到普通视图,菜单中“视图”——“脚注”,这时最下方出现了尾注的编辑栏。 2、在尾注的下拉菜单中选择“尾注分隔符”,这时那条短横线出现了,选中它,删除。

8位全加器设计

基于原理图的8位全加器设计 实验目的:熟悉利用Quartus II的原理图输入方法设计简单的组合电路,掌握层次化设 计的方法,并通过一个8位全加器的设计把握利用EDA软件进行原理图输入方式的电子线路设计的详细流程。 实验原理:一个8位全加器可以由8个1位全加器串行构成,即将低位加法器的进位输 出cout与相临的高位加法器的最低位输入信号cin相接。 试验任务:1.完成半加器和全加器的设计。 2.建立一个更高层次的原理图设计,利用以上获得的1位全加器构成8位全加器,完成编译、综合、适配、仿真和硬件测试。 实验步骤: 一、1位全加器设计 1.建立工程文件夹adder,路径d:\adder。 2.输入设计项目和存盘 原理图编辑输入流程如下: (1)打开Quartus II,选择file—>new命令,在弹出的窗口中选择block diagram/schematic file 选项,单击ok按钮后将打开原理图编辑窗口。 (2)在编辑窗口中的任何一个位置上右击,将弹出快捷菜单,选择inset—>symbol命令,将弹出元件输入对话框。 (3)单击“…”按钮,找到基本元件库路径d:/altera/90/quartus/libraries/primitives/logic项(假设软件安装在D盘),选中需要的元件,单击“打开”按钮,此元件即显示在窗口中,然后单击symbol窗口中的ok按钮,即可将元件调入原理图编辑窗口中。也可以在name栏输入需要的元件名。调入好元件和引脚后,连接好电路,再输入各引脚名。 (4)选择file—>save as命令,选择刚才为自己的工程建立的目录d:\adder,将已设计好的原理图取名为h_adder.bdf,并存盘此文件夹内。 3.将设计好的项目设置成可调用的元件 为了构成全加器的顶层设计,必须将以上设计的半加器h_adder.bdf设置成可调用的元件。在打开半加器原理图文件的情况下,选择file—>create/update—>create symbol file for current file命令,即可将当前文件h_adder.bdf变成一个元件符号存盘,以待高层次设计中调用。4.设计全加器顶层文件 打开一个原理图编辑窗口,方法同前。在新打开的原理图窗口中双击,在弹出的窗口中选择project选项,选择h_adder.bdf,并调入其他元件,连接好电路。以f_adder.bdf名存在同一路径d:\adder中。 二、8位全加器设计 1.将刚设计好的1位全加器设置成可调用的元件,方法同上。 2.调入元件,连接电路图,以8f_adder.bdf保存于同一路径d:\adder中的文件夹中。 3.将顶层文件8f_adder.bdf设置为工程。 4.编译与仿真 原理图与仿真波形分析:

FPGA 8位全加器的原理图设计

3-8. 在QuartusII中用原理图输入法设计8位全加器 1、实验目的:熟悉利用QuartusⅡ的原理图输入方法设计简单组合电路,掌握层次化设计的方法,并通过一个8位全加器的设计把握利用EDA软件进行原理图输入方式的电子线路设计的详细流程。 2、实验原理:先由一个半加器构成一个全加器,8位全加器可以由8个1位全加器构成,加法器间的进位可以串行方式实现,即将低位加法器的进位输出cout与相临的高位加法器的最低进位输入信号cin 相接。 3、实验内容及过程: 在D盘下建立一个新的文件夹为ADDER8。 本设计的思路是先设计1个1位半加器,因此建立新建文件夹D:/ ADDER8/h_adder;要利用1位的半加器构造1位的全加器,因此建立新建文件夹D:/ADDER8/f_adder;要利用1位的全加器构造8位的全加器,因此建立新建文件夹D:/ADDER8/adder8; (1)、用原理图输入法构造1位半加器 打开QuartusII软件,选择菜单File-New,在弹出的New对话框中选择原理图文件编辑输入项Block Diagram/Schematic File(如图4-1所示),按ok按钮后将打开原理图编辑窗口。 (2)建立一个初始原理图。在编辑窗口中的任何一个位置上右击鼠标,选择输入原件项Insert-Symbol,或者直接双击原理图编辑窗口,于是将弹出如图4-2所示原件对话框。在坐下的Name栏键入输入引脚符号input。然后单击ok按钮。即可将元件调入原理图编辑窗口。 图4-1 图4-2 (3)原理图文件存盘。选择菜单File-Save As,将此原理图文件存于刚才建立的目录D:/ ADDER8/h_adder 中,取文件名为:h_adder.bdf。然后将h_adder.bdf设定为工程,创建工程。 (4)绘制半加器原理图。在工程管理窗口,双击工程名,再次进入原理图编辑窗。双击原理图任何位置,再次弹出4-2的对话框。分别在Name栏键入原件名and2、not、xnor和输出引脚output,并用单击拖动的方法连接电路。然后分别在input和output引脚的PIN NAME上双击使其变为黑色,再用键盘输入各引脚名:a、b、co和so。最后作为本工程的顶层原理设计图如4-3。 图4-3 (5)仿真测试半加器。全程编译后,对此半加器工程进行方针测试,仿真波形如下图所示4-4。

软件开发工程师的就业前景分析

软件开发工程师的就业前景分析 软件开发工程师的就业前景分析?软件开发工程师的就业前景好吗?软件开发工程师的就业前景难吗?以下的相关信息是4G梦工场的相关人员为大家整理的。 4G梦工场以自己的实力优势在武汉占据7年之久。教学质量、教学环境、教学设备、就业几率都得到了广大人们的认可。目前Android课程班、IOS课程班、Java课程班、C/C++课程班都在火热进行中。 软件测试工程师就业前景分析 目前,国内软件测试人才缺口高达20万,已成为我国软件产业发展的稀缺人才之一。“软件测试人才需求量的不断扩张,是由于近年来我国软件行业的快速发展所决定的。”业内专业人士介绍说:“由于我国的软件行业目前突破了作坊时代,由以前软件开发的个人作坊升级为工业化、流水线式的生产模式,作为工业化的产品,软件测试也就成为软件开发企业必不可少的质量监控部门,而目前我国的软件测试人才的培养数量较产业升级相对滞后,这就形成了软件测试人才的供给远小于需求现状。” Java软件工程师就业前景分析 目前,虽然Java人才的薪水普遍偏高,但是对该类人才需求旺盛的IT企业却很难招到合格的Java软件工程师。其中,最根本的原因就是许多高校计算机专业的学生在读期间没有掌握实用的技能与经验,距离企业的实际用人要求有较大的差别。因此,计算机专业的大学生想要成为Java软件工程师,就是有必要参加以实战项目为主要教学方法的课程,从而有效地缩短企业需求人才之间的差距。 Android软件工程师就业前景分析 目前,Android作为3G行业发展速度最快的智能手机操作系统,人才严重缺乏,导致Android软件工程师薪水每月平均水平在4000-6000元,工作两年以上者,平均薪水在8000-10000元以上,Android软件工程师迅速成为IT行业的佼佼者。

一位全加器的设计

课程设计任务书 学生:袁海专业班级:电子1303班 指导教师:封小钰工作单位:信息工程学院 题目: 一位全加器的设计 初始条件: 计算机、ORCAD软件,L-EDIT软件 要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求) 1、课程设计工作量:1周 2、技术要求: (1)学习ORCAD软件,L-EDIT软件。 (2)设计一个一位全加器电路。 (3)利用ORCAD软件对该电路进行系统设计、电路设计,利用L-EDIT软件进行版图设计,并进行相应的设计、模拟和仿真工作。 3、查阅至少5篇参考文献。按《理工大学课程设计工作规》要求撰写设计报告书。全文用A4纸打印,图纸应符合绘图规。 时间安排: 2016.12.30布置课程设计任务、选题;讲解课程设计具体实施计划与课程设计报告格式的要求;课程设计答疑事项。 2016.12.31-2017.1.2学习ORCAD软件和L-EDIT软件,查阅相关资料,复习所设计容的基本理论知识。 2017.1.3-2017.1.4对一位全加器电路进行设计仿真工作,完成课设报告的撰写。 2017.1.5 提交课程设计报告,进行答辩。

指导教师签名:年月日 系主任(或责任教师)签名:年月日 目录 摘要 .................................................................................................................................. I ABSTRACT ........................................................................................................................ I 1绪论 (1) 1.1集成电路发展现状 (1) 1.2集成电路版图工具L-edit简介 (1) 2全加器原理及一位全加器原理图设计 (1) 2.1一位全加器原理简介 (1) 2.2实现一位全加器功能的原理图设计 (1) 2.2.1一位全加器原理图 (1) 2.2.2基于ORCAD的一位全加器设计 (1) 2.2.3 一位全加器的电路图仿真 (1) 3一位全加器的版图设计 (1) 3.1确定一位全加器版图结构 (1) 3.2源漏共享缩小版图面积 (1) 3.3 版图所需基础器件绘制编辑 (1) 3.3.1 PMOS、NMOS等基础器件编辑 (1) 3.3.2 两输入与非门与异或门的绘制编辑 (1) 3.3.3源漏共享得到版图 (1) 3.4 绘制最终一位全加器版图 (1) 4心得体会 (1) 5参考文献 (1)

WorldWide Telescope 使用方法

WorldWide Telescope 使用方法 其他2008-08-19 03:17:43 阅读624 评论6 字号:大中小订阅 恩,前段时间刚装了这个玩样,也没怎么空弄,今天初步试用了下感觉不错,分享一下这个好东西。 [注:本说明为本人原创首发163博客,商业用途转载请联系获得本人同意] 安装好后刚进入界面有点眼花, 先拖动鼠标左右看看,哈,爽。 再滚轮缩放,哈,还是爽。 不过满世界的看很晕,开始找设置,很快找到了View菜单,可以开始设置啦。 如图(貌似传到163太小了,点这个看大图:大图) 进入View菜单后可以看见从左到右有4部分设置区域。 1.最左面Constellation设置: Figures打钩就显示星座的连接线;Boundaries打钩就显示星座的边界;Focused Only打钩就只显示画面正中星座的边界。单 击旁边彩色的线条可以调节颜色。 2.第二部分Overlays设置: Equatorial Grid打钩显示经纬系统网格;Ecliptic打钩显示黄道线;Reticle打钩显示中间的十字型鼠标;Field View Indicator.. 这个就是正中央的那个长方形侦测筐。 3.第三部分Observing Location(观测位置): 不用介绍,就是设置观察位置,默认是全方位的。我们点setup后可以选自己的所在地,这里我当然选Suzhou, China 啦。选中后还可以细调经纬度和海拔高度(Elevation)。点ok后记得在View from this location前打钩,然后我们只能看见半球型的天空 了,底下会显示东南西北的方向的。 4.最右边的Observing Time(观测时间): 配合前面的观测位置,点下拉箭头,默认是格林尼的时间,去掉钩则和电脑时间同步。和北京时间有时差的地方就手动调节时间吧,然后ok。(注意,开始当前时间和位置后整个天空会实时转动,可以按暂停按钮暂停转动。)

8位全加器实验报告

实验1 原理图输入设计8位全加器 一、实验目的: 熟悉利用QuartusⅡ的原理图输入方法设计简单组合电路,掌握层次化设计的方法,并通过一个8位全加器的设计把握利用EDA软件进行电子线路设计的详细流程。 二、原理说明: 一个8位全加器可以由8个1位全加器构成,加法器间的进位可以串行方式实现。即将低位加法器的进位输出cout与其相邻的高位加法器的最低进位输入信号cin相接。而一个1位全加器可以按照本章第一节介绍的方法来完成。 三、实验内容: 1:完全按照本章第1节介绍的方法与流程,完成半加器和全加器的设计,包括原理图输入、编译、综合、适配、仿真。 2:建立一个更高的原理图设计层次,利用以上获得的1位全加器构成8位全加器,并完成编译、综合、适配、仿真和硬件测试。 四、实验环境: 计算机、QuartusII软件。 五、实验流程: 实验流程: 根据半加器工作原 理,建立电路并仿 真,并将元件封装。 ↓ 利用半加器构成一位 全加器,建立电路并 仿真,并将元件封 装。 ↓ 利用全加器构成8位全 加器,并完成编译、综 合、适配、仿真。 图1.1 实验流程图

六、实验步骤: 1.根据半加器工作原理建立电路并仿真,并将元件打包。(1)半加器原理图: 图1.2 半加器原理图(2)综合报告: 图1.3 综合报告: (3)功能仿真波形图4: 图1.4 功能仿真波形图

时序仿真波形图: 图1.5 时序仿真波形图 仿真结果分析:sout为和信号,当a=1,b=0或a=0,b=1时,和信号sout为1,否则为0.当a=b=1时,产生进位信号,及cout=1。 (4)时序仿真的延时情况: 图1.6 时序仿真的延时情况 (5)封装元件: 图1.7 元件封装图 2. 利用半加器构成一位全加器,建立电路并仿真,并将元件封装。 (1)全加器原理图如图: 图2.1 全加器原理图

用原理图方法设计8位全加器

实验报告一 一、实验目的 熟悉利用QuartusII的原理图输入方法设计简单电路,掌握层次化设计的方法,并通过一个8位全加器的设计把握利用EDA软件进行电子线路设计的详细流程。 二、实验内容 1.根据工作原理,完成1位半加器和全加器的设计; 2.建立一个更高的原理图设计层次,利用以上获得的1位全加器构成8位全加器,并完成 编译、综合、适配、仿真。 三、实验环境 计算机、QuartusII软件 四、实验步骤 1.根据半加器工作原理,建立电路并仿真,并将元件打包。 (1)电路 (2)仿真: 仿真结果分析:S为和信号,当A=1,B=0或A=0,B=1时,和信号S为1,否则为0.当A=B=1时,产生进位信号,及CO=1。 (3)打包后的文件:

2.利用半加器构成一位全加器,并打包。 (1)电路 (2)仿真 仿真结果分析:CI为来自低位的进位,S=A xor B xor CI,即:当A,B,CI中有一位为高电平‘1’或者三位同时高电平为‘1’,则S=1,否则S=0;当A,B,CI有两位或者三位同为高电平‘1’时,产生进位信号CO=‘1’。 (3)打包后的文件 3.利用全加器构成8位全加器,并完成编译、综合、适配、仿真。 (1)电路

(2)仿真 仿真结果分析:八位全加器,和S分别与A,B 对应。当来自第七位的进位信号为‘1’、A 的最高位和B的最高位三者有两个位高电平‘1’时,则产生进位信号CO=‘1’。 五、实验结果与讨论 实验的仿真结果与预计的结果一致,所以所设计的电路是正确的。不足的地方有: 1、对软件还不够熟悉,所以操作的有点慢;

2、设计电路时,由于数字电路的知识有些开始淡忘了,所以应当及时去补 缺补弱。 六、总结 思考题:为了提高加法器工作速度,如何改进以设计的进位方式? 答:采用超前进位。串行加法器的第i位进位是由0~(i-1)决定的,而超前进位是事先得出每一位全加器的进位输出信号,而无需再从低位开始向高位逐位传递进位信号了,这就有效地提高了工作速度了。

GIS软件市场现状与行业发展

GIS软件市场现状与行业发展 GIS软件市场现状 地理信息系统(GIS,Geographic Information System)是以采集、存储、管理、分析、描述和应用整个或部分地球表面(包括大气层在内)与空间和地理分布有关的数据的计算机系统。它由硬件、软件、数据和用户有机结合而构成。它的主要功能是实现地理空间数据的采集、编辑、管理、分析、统计、制图的工具已逐步发展起来。GIS技术依托的主要工具和平台是计算机及其相关设备。 进入90年代以来,随着计算机技术的发展, 计算机其微处理器的处理速度愈来愈快性能价格比更高; 其存储器能实现将大型文件映射至内存的能力,并且能存储海量数据。此外, 随着多媒体技术、空间技术、虚拟实景、数字测绘技术、数据仓库技术、计算机图形技术三维图形芯片、大容量光盘技术及宽频光纤通讯技术的突破性进展,特别是消除数据通讯瓶颈的卫星互联网的建立,以及能够提供接近实时对地观测图象的高分辨、高光谱、短周期遥感卫星的大量发射,这些为GIS技术的广泛、深入应用展示了更加光明的前景。 经过多年的发展,中国GIS 软件产业逐步走向成熟,企业数量持续增长,应用领域范围拓展迅速。根据赛迪顾问的研究:中国GIS软件市场2008 年实现销售额52.46 亿元,同比增长20.8%,高于软件整体市场16%的增长率,成为软件市场中一个值得期待的细分领域。中国GIS 软件3 年来继续保持快速增长,今年,市场规模预期将达到91.7 亿元,成为我国软件产业领域中不可忽视的一支重要力量。本文由天搜科技整理分享; 1. 国内GIS 软件行业发展主要表现 1)用户需求逐步释放 政府和企业用户近年来对GIS 认识的不断深入,逐渐由被动要求转为主动需求,拉动着GIS 软件市场的快速增长。 政府应用领域:在国家对地理信息产业的长期政策和专项建设支持下,国土信息化项目投入持续增加、国家60-80 个数字城市的建设与应用项目、自然资源和地理空间基础信息库建设逐步实施;农业、林业、环保及灾难预警等资源与环境应用领域的GIS 应用日趋深入;同时,在政府职能逐步向服务型转移的过程

EDA课程设计----八位二进制全加器

EDA设计说明书 课程名称:EDA技术实用教程 设计题目:八位二进制全加器 院系:电子信息与电气工程学院学生姓名: 学号: 专业班级: 指导教师:李响 2011 年6 月1

1. 设计目的 熟悉利用QuartusⅡ的原理图输入法设计简单的组合电路,掌握层次化设计的方法,并通过一个八位全加器的设计把握利用EDA软件进行原理图输入方式的电子线路设计的详细流程。 2. 设计原理 2.1 一位全加器的原理 一位全加器可以用两个半加器及一个或门连接而成,因此需要首先完成半加器的设计。在本设计中,将采用原理图输入法来完成设计。 一位全加器的设计步骤: ①为本项工程设计建立文件夹; ②输入设计项目和存盘; ③将设计项目设计成可调用的元件; ④设计全加器顶层文件; ⑤将设计项日设置成工程和时序仿真。 2.2 八位全加器的原理 一个八位全加器可以由八个一位全加器构成,加法器之间的进位可以用串行方式实现,即将低位加法器的进位输出cout 与相邻的高位加法器的最低进位输入信号cin 相接。 3. 设计方案与仿真 3.1 一位全加器的设计与仿真 全加器的实现是以半加器的实现为基础的,因此,要设计全加器应首先设计一个一位的半加器。半加器的实现方案为: ①为此项工程建立文件夹; ②在基本元件库中,选中需要的元件,将元件(包含元件and2、not 、xnor 和输 入输出引脚input、output)调入原理图编辑窗口中;

③将己设计好的原理图文件存盘; ④将所设计的半加器设置成可调用的元件。 用原理图输入法所设计的半加器原理图如图3-1所示,利用QuartusⅡ软件平台,根据图3-1所示电路,可生成一个半加器元件符号,如图3-2所示。在半加器的基础上,为了建立全加器的顶层文件,必须再打开一个原理图编辑窗口,方法同上。其中,所选择的元件包含半加器、或门和输入输出引脚,由此可得到如图3-3所示的全加器原理图;进而可生成个全加器元件符号,如图3-4所示。 图3-1 半加器原理图图3-2 半加器元件符号 图3-3 全加器原理图图3-4 全加器元件符号按照一位全加器原理图连接电路,通过编译、仿真所得的波形图如图3-5所示: 图3-5 一位全加器时序仿真波形 根据图3-5可知,当输入信号ain 、bin 、cin 全是低电平时,输出信号sum 和cout 全是低电平;当输入信号ain 、bin 、cin 中有且只有一个为高电平时,输出信号sum 为高电平,输出信号cout 为低电平;当输入信号ain 、bin 、cin 中有两个为

相关主题