2011年9月1日
转载地址:http://www.cnblogs.com/kuwoyidai/archive/2010/10/15/1870455.html
常规内存(Conventional Memory):系统内存的第一个640 KB就是著名的常规内存。每一个PC机用户随着时间的推移都更加清楚的知道它,(也更加恨它:)),它是标准DOS程序、DOS驱动程序、常驻内存程序等可用的区域,它们统统都被放置在00000h~9FFFFh之间。
上位内存区(Upper Memory Area):系统内存的第一个1M内存顶端的384 KB(1024 KB - 640 KB)就是UMA,它紧随在常规内存之后。也就是说,第一个1M内存被分成640KB常规内存和384KB的UMA。这个区域是系统保留区域,用户程序不能使用它。它一部分被系统设备(CGA、VGA等)使用,另外一部分被用做ROM shadowing和Drivers。UMA使用内存区域A0000h~FFFFFh。
高端内存区(High Memory Area):系统内存第2个1M内存的第一个64 KB区域,被称做HMA。从技术上讲,它属于扩展内存的第一个64 KB,但它和其他扩展内存区域所不同的是,它可以在real mode下被直接访问,其它的则不然。所以在DOS时代,后期的DOS版本允许用户通过配置将DOS本身放置在HMA,从而让用户可以有更多的常规内存可以使用。HMA占据地址100000h~10FFEFh。
扩展内存(Extended Memory):从HMA结束的位置到系统物理内存的最大值之间的区域都属于扩展内存。当一个OS运行在Protected Mode时,它可以被访问,而在Real Mode下,则无法被访问(除非通过某些Hacker方法)。它的地址范围是10FFF0h~Last address of system momory(maximum of 4G-1M)。从技术上说,HMA也属于扩展内存,这依赖于你如何看待这个问题。
1.1.3 Upper Memory Area
PC机组织内存的方式有些让人感到困惑——欢迎来到最让人困惑的部分:)。在640 KB常规内存之上的384 KB部分被称为Upper Memory Area或者UMA,这是一个非常繁忙的地带。它非常重要,因为它是许多系统配置问题的根源。
UMA让人感到如此困惑的一个原因是它实际上是2个互相交叠的内存。这里存在一段占据物理地址A0000h~FFFFFh的RAM;然而,也有一段不同类型的ROM被影射到这段地址的大部分区间。其中,和ROM有相同地址的部分的RAM被系统隐藏了,它们被BIOS用做ROM shadowing。没有被隐藏的部分仍然可以被OS和Application使用。
为什么会造成这种情况?部分原因是为了实用:如果一台PC机有640 KB的常规内存,以及384 KB的UMA,那么你插在主板上的物理内存是连续的——没有一种实用的方法构造一个SIMM(Single In-line Memory Module,见本节末尾注解)为UMA留出一个384 KB的物理块(当然,从技术上可以做到,但成本比浪费这384 KB RAM的代价要高的多)。其它的主要原因是:RAM给你提供一种提高性能的选项,比如当你使用UMA存放drivers,或者UMA被用做ROM shadowing的时候。
RAM覆盖了整个384 KB区域,而ROM只覆盖了一部分。所以你可以这样考虑UMA中的RAM和ROM:RAM是放在桌子上的一条彩色的纸带,而ROM是一条同样尺寸的白色纸带,白色纸带被剪了一些洞,然后覆盖在彩带上面。那些有洞的部分露出的彩色部分就是可以供OS和应用程序使用的UMA RAM,剩余的部分就是ROM部分,OS和应用程序不能使用它们。
|
Address |
First 16K (x0000h-x3FFFh) |
Second 16K (x4000h-x7FFFh) |
Third 16K (x8000h-xBFFFh) |
Fourth 16K (xC000h-xFFFFh) |
|
A0000- AFFFFh |
VGA Graphics Mode Video RAM |
|
B0000- BFFFFh |
VGA Monochrome Text Mode Video RAM |
VGA Color Text Mode Video RAM |
|
C0000- CFFFFh |
VGA Video BIOS ROM |
IDE Hard Disk BIOS ROM |
Optional Adapter ROM BIOS or RAM UMBs |
|
D0000- DFFFFh |
Optional Adapter ROM BIOS or RAM UMBs |
|
E0000h- EFFFFh |
System BIOS Plug and Play Extended Information |
|
F0000- FFFFFh |
System BIOS ROM |
UMA的布局
下面是对上面表格中内容的概要介绍:
VGA Graphics Mode Video RAM: 内存A0000h~AFFFFh的64 KB块被系统保留作为VGA图形显示内存。最初的VGA是320x200,256色模式,这种模式需要64,000 bytes。当然现代显卡使用更多的内存。这个RAM区域被系统保留,应用程序被禁止使用它。
VGA Monochrome Text Mode Video RAM: 当显卡处于单色文本模式时,会使用这32 KB RAM。然而,在现代系统中,显卡已经几乎不使用黑白文本模式;即使当需要显示黑白文本的时候,也只会使用彩色文本模式黑白色彩来显示黑白文本而已。在某些环境下,这块内存可以被用做驱动程序,来节省常规内存的空间。
VGA Color Text Mode Video RAM: 当显卡处于彩色文本模式时,会使用这32 KB RAM。这个RAM区域被系统保留,应用程序被禁止使用它。
VGA Video BIOS ROM: C0000~C7FFFh是Video BIOS ROM的内存位置。Video BIOS ROM中包含着被Video Card使用的代码。注意这块ROM里存放的是BIOS INT 10H所使用的服务代码,而不是被Video Card显示的数据,如果是显示数据,就应该被放置在RAM中。
IDE Hard Disk BIOS ROM: C8000h 是存放控制IDE Hard Disk的BIOS的默认位置。在系统被启动的阶段,这块BIOS代码将会被调用。
Optional Adapter ROM BIOS or RAM UMBs: CC000h ~ DFFFFh 之间的内存块可以被PC厂商随意使用。这块内存可以被Hardware Adapters用来存放ROM代码(例如,一些网卡,或者SCSI host adapters)。 也可以被用做进行Loading Drivers的上位内存块RAM。这块内存通常是空的,除非你使用了那些刚才被提及的特殊硬件。
System BIOS Plug and Play Extended Information: E0000h ~ EFFFFh 之间的内存被Plug and Play BIOSes用来存放它的Extended System Configuration Data (ESCD)。
System BIOS ROM: UMA的最后64K区域被用来存放system BIOS代码。
以下表格中列出了除Video RAM之外的UMA内存布局:
Address Width Content Description
C000:0 - EGA/VGA BIOS ROM (thru C7FF)
C400:0 - Video adapter ROM space
C600:0 256bytes PGA communication area
C800:0 16K Hard disk adapter BIOS ROM
C800:5 - XT Hard disk ROM format, AH=Drive, AL=Interleave
D000:0 32K Cluster adapter BIOS ROM
D800:0 - PCjr conventional software cartridge address
E000:0 64K Expansion ROM space (hardwired on AT+)
- 128K PS/2 System ROM (thru F000)
F000:0 - System monitor ROM
- - PCjr: software cartridge override address
F400:0 - System expansion ROMs
F600:0 - IBM ROM BASIC (AT)
F800:0 - PCjr software cartridge override address
FC00:0 - BIOS ROM
FF00:0 - System ROM
FFA6:E - ROM graphics character table
FFFF:0 - ROM bootstrap code
FFFF:5 8 bytes ROM date (not applicable for all clones)
FFFF:E 1byte ROM machine id
在绝大多数PC中,UMA中包含一个384 KB的RAM内存。如果UMA区域中的任何地址被ROM使用,那么这个地址后面的RAM就被系统隐藏了。然而,这并不意味着这些被隐藏的RAM被浪费了。
对于这些被用做System ROM和Video ROM的ROM来说,它的一个问题就是它比RAM的访问速度要慢。ROM的访问时间一般为120到200纳秒,而RAM的访问时间一般为50到70纳秒;更何况,系统RAM一次访问32-bit,而ROM是16-bit。结果就是,相对于访问系统内存,访问BIOS代码是非常慢的。
所以,我肯定你已经知道我要说什么了:既然在ROM的后面隐藏着RAM,我们可以将ROM中的内容影射到RAM中以提高性能。事实上,绝大多数系统也是这么做的,这被叫做ROM Shadowing。你可以通过一组BIOS参数来控制哪些ROM区域被影射到RAM中。
当一个内存区域的shadowing被通过配置BIOS参数打开的话,如果PC机被加电,则在机器启动的过程中,BIOS会将ROM中的内容拷贝到相应的RAM中(应该是先copy到0-640k,然后在北桥芯片里调整PAM register使其地址线对应到相应的RAM,在解压到这段RAM),然后将这段RAM设为写保护,然后禁止使用ROM。这个时候,这些RAM就看起来象ROM一样了。只不过性能要高于真正的ROM。
2011年8月11日
摘要: 转载地址:http://blog.ednchina.com/windzjy/310477/Message.aspx# 转载请声明:http://space.ednchina.com/Blog/post.aspx?id=310477这是一个sv的验证平台的基本框架,自己画的,对错待证!1,关于clocking block举例如下:待证设计module COUNTER (input Clock, Reset, Enable, Load, UpDn, input [7:0] Data, output reg[7:0] Q);always @(posedge Clock or posedge Rese
阅读全文
版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://mathon.blogbus.com/logs/2050927.html
发现了一个不错的VERILOG学习网站,以后可以经常去看一下
http://www.fpgatech.net/onlineresource/systemverilog31a/systemverilog31a.html?frmname=topic&frmfile=00603.html
fork...join能够从它的每一个并行语句中产生并发进程。
fork...join块的声明语法如下:
par_block ::= // 引用自附录A.6.3
fork [: block_identifier] {block_item_declaration} {statement_or_null}
join_keyword [: block_identifier]
join_keyword ::= join | join_any | join_none
语法 9-1—Fork...join块语法(摘录自附录A)
fork...join块可以指定一条或多条语句,每一条语句都应该作为并发进程执行。Verilog fork...join块总是引起执行fork语句的进程阻塞直到所有分支进程中止。通过加入join_any和join_none关键字,SystemVerilog提供了三种选择来指定父进程何时恢复执行。
表 9-1: fork...join控制选项
|
选项 |
描述 |
|
join |
父进程会阻塞直到这个分支产生的所有进程结束。 |
|
join_any |
父进程会阻塞直到这个分支产生的任意一个进程结束。 |
|
join_none |
父进程会继续与这个分支产生的所有进程并发执行。在父线程执行一条阻塞语句之前,产生的进程不会启动执行。 |
在定义一个fork...join块的时候,将整个分叉封装在一个begin...end块中会引起整个块作为单个进程执行,其中每条语句顺序地执行。
fork
begin
statement1; // 一个带有2条语句的进程
statement2;
end
join
在下面的例子中,包含两个进程分支,第一个等待20ns,第二个等待命名事件eventA被触发。因为指定了join关键字,父进程应该阻塞直到这两个进程结束;也就是说,直到过了20ns并且eventA被触发。
fork
begin
$display("First Block\n");
#20ns;
end
begin
$display("Second Block\n");
@eventA;
end
join
在一个fork...join语句的关联文中使用return语句是非法的,并且会导致一个编译错误。例如:
task wait_20;
fork
#20;
return; // 非法的:不能返回;任务位于另外一个进程中
join_none
endtask
只要fork...join块作用范围内声明的自动变量进入它们的作用范围,在产生任何进程之前,这些自动变量应该被初始化成它们的初始值。这些变量对于循环结构产生的进程存储唯一的、每次都交互的数据非常有用。例如:
initial
for(int j = 1; j <= 3; ++j)
fork
automatic int k = j; // 对每一个j值的本地拷贝
#k $write("%0d", k);
begin
automatic int m = j; // m的值是不确定的
...
end
join_none
上面的例子的输出为:123。
另:http://verificationacademy.com/forum/main-ovm-forum/10089-practicle-application-fork-joinnone
Whenever you fork, you spawn off a set of new concurrent child processes from a parent process. The difference between the join, join_any, and join_none statements is in what the parent process does after the children are spawned off.
join - parent process blocks (waits) until all child processes complete and return, then it continues to the next statement after the join
join_any - parent process blocks (waits) until any child completes (i.e. the first to complete), then it continues to the next statement after the join_any
join_none - parent process does not block. Execution continues to the next statement after the join_none. Child processes are scheduled to start, but do not start until the parent encounters a blocking statement (#, @, wait)
join_none is useful when you want to start off a bunch of on-going processes, such as monitor processes that independently watch for interesting activity, or when you want to start up several independent stimulus generation processes. In both cases, you don't really care about when or even if the child processes finish.
join_any is useful when you want to start a child process, but you want to have a "timeout" so that execution in the parent can continue after either the child finished, or the timeout time has expired, whichever comes firs
2010年12月24日
地址链接:http://hi.baidu.com/pioneer0059/blog/item/69a308db1f06212610df9b31.html
各厂商综合工具,对HDL综合时都定义了一些综合属性这些属性可指定a declaration,a module item,a statement, or a port connection 不同的综合方式。
语法为:
/* synthesis, <any_company_specific_attribute = value_or_optional_value */
下面就是Altera的几个常用的Synthesis attributes
Noprune
A Verilog HDL synthesis attribute that prevents the Quartus II software from removing a register that does not directly or indirectly feed a top-level output or bidir pin.
For example:
reg reg1 /* synthesis noprune */;
keep
A Verilog HDL synthesis attribute that directs Analysis & Synthesis to not minimize or remove a particular net when optimizing combinational logic.
For example:
wire keep_wire /* synthesis keep */;
preserve
A Verilog HDL synthesis attribute that directs Analysis & Synthesis to not minimize or remove a particular register when eliminating redundant registers or registers with constant drivers.
For example:
reg reg1 /* synthesis preserve */;
ram_init_file
A Verilog HDL synthesis attribute that specifies initial contents of an inferred memory.
For example:
reg [7:0] mem[0:255] /* synthesis ram_init_file = " my_init_file.mif" */;
ramstyle
A Verilog HDL synthesis attribute that specifies the type of TriMatrix Memory block to use when implementing an inferred RAM.
M512", "M4K", "M9K", "M144K", "MLAB", "M-RAM”
For example:
reg [0:7] my_ram[0:63] /* synthesis ramstyle = "M512" */;
translate_off or translate_on
Verilog HDL synthesis directives that direct Analysis & Synthesis to ignore portions of the design code that are specific to simulation and not relevant to logic synthesis.
For example:
parameter tpd = 2; // Generic delays
// synthesis translate_off
#tpd;
// synthesis translate_on
关于状态机有下面三个综合属性:
full_case
A Verilog HDL synthesis attribute that directs Analysis & Synthesis to treat unspecified state values in a Verilog Design File Case Statement as don't care values, and therefore to treat the Case Statement as "full".
仅用于Verilog ,与case 语句一起使用表明所有可能的状态都已经给出不需要其他逻辑保持信号的值.
module full_case (a, sel, y);
input [3:0] a;
input [1:0] sel;
output y;
reg y;
always @(a or sel) case (sel) // synthesis full_case
2'b00: y="a"[0];
2'b01: y="a"[1];
2'b10: y="a"[2];
endcase
endmodule
parallel_case
A Verilog HDL synthesis attribute that directs Analysis & Synthesis to implement parallel logic rather than a priority scheme for all case item expressions in a Verilog Design File Case Statement.
仅用于Verilog ,与case 语句一起使用强制生成一个并行的多路选择结构而不是一个优
先译码结构.
module parallel_case (sel, a, b, c);
input [2:0] sel;
output a, b, c;
reg a, b, c;
always @(sel) begin
{a, b, c} = 3'b0;
casez (sel) // synthesis parallel_case
3'b1??: a = 1'b1;
3'b?1?: b = 1'b1;
3'b??1: c = 1'b1;
endcase
end
endmodule
syn_encoding
A Verilog HDL synthesis attribute that determines how the Quartus II software should encode the states of an inferred state machine.
强制重新状态机的状态编码方式.有default,one-hot,sequential,gray,johnson,compact,user几种编码方式
(* syn_encoding = "user" *) reg [1:0] state;
parameter init = 0, last = 3, next = 1, later = 2;
always @ (state) begin
case (state)
init:
out = 2'b01;
next:
out = 2'b10;
later:
out = 2'b11;
last:
out = 2'b00;
endcase
end
In the above example, the states will be encoded as follows:
init = "00"
last = "11"
next = "01"
later = "10"
2010年11月6日
2010年11月4日
转载地址:http://article.ednchina.com/Other/20090206075509.htm
EDN博客精华文章 作者:codeman
在edn上看到很多仁兄的文章 大受启发 也写写自己的理解 一同讨论
set_input_delay/ set_output_delay
在与时钟选项定义的时钟相关的输入port上定义data arrival TIme,可将输入延时定义与上升沿或下降沿相关。
如果输入延时与简单的生成时钟相关,到生成时钟的clock arrival time要加到data arrival time上。
输入延时可以定义与时钟网络中的port相关,到参考port的clock arrival time要加到data arrival time上。
输入延时可以包含时钟源延时,默认条件下,相关的时钟源延时加到输入延时上;但是,当定义-source_latency_included选项时,时钟源延时不要相加,因为它并没有用作为input delay value的时序因素。
max用在时钟建立时间或恢复(recovery)校验上,min用于时钟保持时钟或移除(removal)校验上。

以上内容摘自Quartus help,基本定义edn上很多仁兄已经讲的很清楚了。
看下面简单的例子,两级触发器,来自
http://www.altera.com.cn/support/examples/timequest/exm-timequest.html
设计图:
点击看原图
很简单的例子,仅仅加时钟周期约束的条件下,用TimeQuest分析仅会得到一路path的分析,reg1 to reg2,时序图如下:

这张图已经有人做过了仔细的分析,可以清楚地看到各个参数的大小。
下面三张图是加约束后的时序分析图,所加的条件是:
set_input_delay -clock { clk_in } -add_delay 1.200 [get_ports {data_in}]
set_output_delay -clock { clk_in } -add_delay 2.000 [get_ports data_out]
重新运行TimeQuest,可以看到3个path分析
1) data_in to reg1

2) reg1 to reg2

3) reg2 to data_out

可以看到,输入路径在data arrival time上加上了input delay;输出路径在data required time上减去了output delay;分别表现为对setup和hold时间的影响。
转载地址:http://article.ednchina.com/Other/20090206080207.htm
EDN博客精华文章 作者:ilove314
题记:时序分析摸索了很久,看了很多资料,也反反复复的对比总结,然后思考。现在总算有点大彻大悟的感觉了,但是还不够有些东西理解的可能还不是那么深入透彻,也喜欢把自己的思考过的东西拿出来和大家分享,更是希望大家能提出一些看法,在不断的讨论总结中才会有进步。
Quartus II TImeQuest Timing Analyzer综合设计约束支持设计管脚的约束。这些约束允许Quartus II TimeQuest Timing Analyzer执行系统静态时序分析,不仅包括FPGA的时序,而且包括了任何外部器件的时序以及板级时序参数。
输入输出延时 Input and Output Delay
使用输入输出延时约束来指定任何外部器件或者板级参数。当您应用这些约束,Quartus II TimeQuest Timing Analyzer将在整个系统执行静态时序分析。
设置输入延时 Set Input Delay
set_input_delay约束指定了某个管脚(器件I/O)关于给定时钟的数据到达时间。Figure 6–26 展示了一个输入延时的路径。

使用set_input_delay命令来指定设计管脚的输入延时。Example 6–18展示了set_input_delay命令及选项。

Table 6–14. set_input_delay Command Options
点击看原图
如果您仅仅为输入延时值指定一个-max或者-min值,将会出现警告信息。此时未设定的输入最小延时值或输入最大延时值的缺省值和另一方相同。同样地,如果你仅仅为延时值指定一个-rise或者-fall值,也会出现警告信息。该默认延时值也会以和输入最大和最小延时值一样的方式设置。
最大值被用于建立时间检测,而最小值被用于保持时间检测。
默认情况下,输入延时(min/max, rise/fall)设置仅仅允许为一个clock, -clock_fall, -reference_pin组合。为一个相同的管脚指定输入延时值,若不想移除这些不同的clock, -clock_fall, 或者-reference_pin原先的输入延时设置,你必须指定-add_delay选项。当你指定了-add_delay选项,最坏的情况值将被采用。
-rise和-fall选项是相互排斥的,-min和-max选项也是相互排斥的。
设置输出延时 Set Output Delay
set_output_delay命令指定一个给定时钟相关管脚(器件管脚)的数据需要时间。使用set_output_delay命令指定设计管脚的输出延时约束。Figure 6–27展示了一个输出延时路径。


各命令选项和set_input_delay类似,这里略过。
其它说明和set_input_delay类似,这里也略过。
下面对I/O约束中关键的输入(输出)最大(最小)延时的概念做一些阐述。
点击看原图
点击看原图
从上图可以看到,输入最大/最小延时是针对外部器件的一些特性而进行设置的。所谓输入最大延时(这里先假设系统处于一个理想状态,即外部器件和FPGA共用一个时钟源,并且不考虑时钟偏斜,就是说时钟同步到达外部器件和FPGA的锁存沿),就是从时钟的发射沿算起,数据经过外部器件的最大Tco延时+PCB走线延时;而输入最小延时,就是数据经过外部器件的最小Tco延时+PCB走线的延时。这个时间和FPGA内部的建立保持时间又有怎样的关系呢?
和一般的时序分析一样,外部器件输入到FPGA的数据也必须满足建立保持时间要求,输入最大延时通俗的理解就是外部器件的数据到达FPGA端口的最晚时间,这个最晚时间可不能太晚,必须考虑FPGA内部锁存这个数据的建立时间Tsu。如果数据晚到时钟的锁存沿前的Tsu时间还没有到达,那么时钟就无法锁存这个数据了。那么就会出现时序违规了,所以,这个输入最大延时需要满足的第一个条件就是Tsu+输入最大延时<时钟周期TCLK(即上图的第一个公式)。
同理,这个数据要到达FPGA最快的时间称之为输入最小延时。这个最快时间也不能太快,试想想,如果在时钟的发射沿外部器件里的数据在非常短的时间内通过了外部器件的Tco和PCB走线,到达FPGA端口时,假设此时FPGA正出于上一个从外部器件传递来的数据的保持时间Th内,那么新到达的数据势必会破坏了前一个数据的保持时间,这也会造成时序违规。这么说来,这个输入最小延时也不能太小,也必须满足一定的条件,这个条件就是:Th<输入最小延时(即上图的第二个公式)。
讨论了这么多,相信你该理解了。那么我们再加上PCB时钟偏斜,时钟偏斜的概念我也不多说,你可以理解为这个参数是源时钟在PCB布线传输信号到达相应的锁存端口时间是会有一定偏差的,那么这个偏差就是PCB时钟偏斜,那么为什么是减去这个值而不是加上这个值呢?你可以理解这个PCB时钟偏斜值=时钟源到达FPGA端口时间-时钟源到达外部器件端口时间,然后~~慢慢消化吧!
建议大家参看Wind330博友的文章《同步时序约束之INPUT_DELAY详解》:
http://blog.ednchina.com/wind330/194897/message.aspx
输入最大/最小延时的概念说的很明白了,至于输出最大/最小延时的理解也很类似。上图的第一个公式其实和输入最大/最小延时的第一个公式有异曲同工之妙,只是把减数的位置互换了一下,不难理解。
但是第二个公式,我个人理解和altera官方的教程里提出来的不太一样,我的理解是这样的:FPGA输出数据达到外部器件输入管脚最快的时间=Tco+PCB布线延时,而根据输入最大/最小延时中第二个公式的分析,外部器件的Th应该小于上面的值,即外部器件的Th< Tco+PCB布线延时(先不讨论PCB时钟偏斜),那么Tco>Th-PCB布线延时才对,而不是Tco>输出最小延时=Th+PCB布线延时。
上面是我对这个公式的理解,也许分析得不对,期待高手指点!
2010年10月31日
摘要: <前端>精通verilog(包括2001)的编程,仿真,测试充分掌握逻辑综合和时序分析理解前端经常使用的各种库的格式和内容,比如.v, .lib了解某个应用领域的知识学会使用FPGA测试代码具备DFT的基本概念<后端>熟悉后端流程,(IO plan, floorplan, power flan, place, CTS, route)熟练掌握一种后端工具的使用学会如何使用工具...
阅读全文
2010年10月19日
摘要: 原文地址:http://www.cnblogs.com/TsuiLei/archive/2008/10/29/1322504.html大端格式:在这种格式中,字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中。小端格式:与大端存储格式相反,在小端存储格式中,低地址中存放的是字数据的低字节,高地址存放的是字数据的高字节。请写一个C函数,若处理器是Big_endian的,则返回0;若是Li...
阅读全文
2010年9月29日
摘要: 转载地址:http://blog.ednchina.com/zenhuateng/203584/Message.aspxUSB总线接口层:物理连接、电气信号环境、信息包传输机制;主机一方由USB主控制器和根集线器组成,而USB方则由设备中的USB接口组成。USB设备层:由主机方的USB系统软件和设备方的USB设备逻辑视图组成。USB功能层:代表客户软件和一个给定的设备功能接口之间的关系。USB系统...
阅读全文