IOB寄存器的使用:IOB= TRUE 属性
- 格式:docx
- 大小:14.52 KB
- 文档页数:4
数据寄存器(AX、BX、CX、DX)1.寄存器AX通常称为累加器(Accumulator),用累加器进行的操作可能需要更少时间。
累加器可用于乘、除、输入/输出等操作,它们的使用频率很高;2.寄存器BX称为基地址寄存器(Base Register)。
它可作为存储器指针来使用;3.寄存器CX称为计数寄存器(Count Register)。
在循环和字符串操作时,要用它来控制循环次数;在位操作中,当移多位时,要用CL来指明移位的位数;4.寄存器DX称为数据寄存器(Data Register)。
在进行乘、除运算时,它可作为默认的操作数参与运算,也可用于存放I/O的端口地址;变址寄存器(SI、DI)寄存器SI和DI称为变址寄存器(Index Register),它们主要用于存放存储单元在段内的偏移量,用它们可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便指针寄存器(BP、SP)寄存器BP和SP称为指针寄存器(Pointer Register),主要用于存放堆栈内存储单元的偏移量,用它们可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便。
指针寄存器不可分割成8位寄存器。
作为通用寄存器,也可存储算术逻辑运算的操作数和运算结果。
它们主要用于访问堆栈内的存储单元,并且规定:BP为基指针(Base Pointer)寄存器,用它可直接存取堆栈中的数据;SP为堆栈指针(Stack Pointer)寄存器,用它只可访问栈顶段寄存器(CS、DS、ES、SS、FS、GS)段寄存器是根据内存分段的管理模式而设置的。
内存单元的物理地址由段寄存器的值和一个偏移量组合而成的,这样可用两个较少位数的值组合成一个可访问较大物理空间的内存地址CS 代码段寄存器(Code Segment Register),其值为代码段的段值DS 数据段寄存器(Data Segment Register),其值为数据段的段值;ES 附加段寄存器(Extra Segment Register),其值为附加数据段的段值SS 堆栈段寄存器(Stack Segment Register),其值为堆栈段的段值;FS 附加段寄存器(Extra Segment Register),其值为附加数据段的段值GS 附加段寄存器(Extra Segment Register),其值为附加数据段的段值在16位CPU系统中,它只有4个段寄存器,所以,在此环境下开发的程序最多可同时访问4个段;在32位CPU系统中,它共有6个段寄存器,所以,在此环境下开发的程序最多可同时访问6个段.指令指针寄存器指令指针EIP、IP(Instruction Pointer)是存放下次将要执行的指令在代码段的偏移量。
常见问题解答µ’nSP问答集内容如下µ’nSP™单片机的组成原理及功能介绍寻址方式和指令系统SPCE061A片内外设部件中断系统汇编语言程序设计实验中遇到的问题µ’nSP™单片机的组成原理及功能Q: 系统工作电压对工作频率有无影响对于较低的工作电压系统能否工作于任意频率A: SPCE061A的工作电压为2.6~3.6V(cpu), V DDH IO参考电压为V DD~5.5V系统工作的频率范围是0.32MHz~49.152MHz当工作电压超出规定范围系统停止工作Q: 内核结构图中SB与SHIFTER是什么关系A: 内核结构图中SHIFTER是移位器在进行移位操作时需有移位缓存器SB (ShifterBuffer) 的配合操作可参见SPCE061A教材3.4.5对几种移位操作指令ASR-ALU等的叙述Q: CPU的休眠状态靠什么条件结束A: 系统靠外设的触发来结束CPU的休眠使其重新进入工作状态这里外设的触发泛指为唤醒源譬如键唤醒实时时钟定时唤醒等等寻址方式和指令系统Q: Rd Rs是否完全为目的源寄存器或存储器指针A: Rd Rs是完全为目的源寄存器或存储器指针Q: LOAD指令的Rd IM16Rd[16]的指令格式的第一字组中的Rs是什么因指令中并没有Rs编译成机器码Rs从何而来其它涉及到IM16A16的指令也都有此问题A: Rs为源寄存器 , 因为IM16指令支持Rd=Rs alu_op IM16A16指令支持Rd=Rs alu_op [A16]在单纯的LOAD中Rs是不存在的但是在一般指令中譬如ADD Rs 是有意义的alu_op指算术逻辑指令符号如ADD SUB AND OR TEST等Q: 指令Rd Rs是否有Rd Rd Rs的书写格式资料只给了Rd Rs一种格式类似有Rd&Rs等A: 有亦即Rd += Rs与Rd = Rd+Rs是相同的Q: 指令CMP Rs IM16和CMP Rs[A16]中为什么不用Rd Rs在这里为源还是目的寄存器与第一个问题对应指令格式第一字组中Rd又是什么与此类似的还有TESTRs IM16 TEST Rs[A16]A: 在这种只用到单一寄存器的情形时不论Rd或Rs都会是指向同一个寄存器因此称呼为Rd或Rs均可但因为CMP与TEST指令只影响状态标志位而不改变缓存器之内容所以我们一般用Rs表示Q: LSL-ALU只是逻辑左移如何满足算术左移例如1000000000001111B左移4位将变为正数如何满足算术左移A: LSL和算数左移功用是相同符号扩展在16-bit范围内都会存在而上列该数左移4 bits 时已经溢出超过16-bit数字范围所以已经无法正确呈现Q: ASR ALU和LSL-ALU指令带进位位操作时是先移位再对Carry加或减还是先对Carry加或减后再移位如Rd Rs ASR nn CarryA: ASR ALU和LSL-ALU指令带进位位操作时是先移位再对Carry加或减因为从µ’nSP™的内核结构图中可以看到移位器SHIFTER是串接在ALU前面Q: 循环指令 ROL 中移位寄存器SB参与运算那么SB中的值究竟是什么如何确定在何处得知SB的内容若SB内容不知循环后结果将无意义ROR也有此问题A: 移位缓存器SB参与算逻运算前的移位操作或乘法运算中的移位操作它只起中间缓存的作用其值在运算后是不确定的因而用户也就不能对其进行任何读操作若用户要进行循环指令时, 要先对移位缓存器SB进行初始化的动作(先透过移位或循环指令), 然后再进行移位操作或者可说它负责担负中间缓存的作用, 但在乘法或FIR指令后, 会对移位缓存器SB产生破坏动作, 因此其值在乘法或FIR指令运算后是不确定的因而用户不适宜在此时对其进行任何读操作Q: 在循环指令ROL ROR中若进位位参与运算如Rd Rs ROL nn Carry Carry位是如何参与循环的A: ROL ROR确切地讲是循环移位指令它们只对源寄存器Rs中的内容与SB一起进行循环移位因此循环移位操作与进位C无关Q: GOTO是在任何一页的页内转移页是当前默认页还是只在零页范围内转移A: 对ISA 1.0而言GOTO指令是在当前的页内转移指令对ISA 1.1而言GOTO将可在各页转移SPCE061A 片内外设部件Q: 并行I/O 结构图中读引脚和读Buffer 的三角形是否为三态门图中的大三角形是什么A: 读引脚和读Buffer 的三角形不是三态门为input buffer 用来regulate 外部的analog 信号为0或数字信号后进I/O 寄存器图1.1中的大三角形则为output buffer 用以放大输出信号为三态门图1.1并行I/O 结构图Q:并行I/O 设置为输出时写Data 实际上就是输出的数据为什么在设置时还写Data 不写是否可以因为写Data实际上就从管脚上输出了但例子都写了 A: 并行I/O 设置为输出时写Data 实际上就是输出的数据当设置完_Dir _Attr 口位时,实际便已完成输出口位的设置而此时再向_Data 口位写数据实际上便已向端口的数据寄存器写输出数据了Q: IOB2和IOB4设置为反馈是否从IOB2输出脉冲同时该脉冲从内部直接到中断系统作为外部中断源EXT1IOB3 与IOB5也类似A:如图1.2在IOB2和IOB4之间或者IOB3IOB5之间增加一个RC 振荡电路便可在EXT1或EXT2端得到振荡频率信号为使反馈电路正常工作必须将IOB2或IOB3设置成反相输出口且IOB4或IOB5须设成输入口EXT1EXT2(负跳沿)图1.2 IOB2IOB4或IOB3IOB5之间的反馈结构Q: 定时/计数器B 时钟源应为ClkC 否则定时/计数器A 和定时/计数器B 对ClkA 有不同的要求ClkA应如何设置A: 定时/计数器B 时钟源虽然为与定时/计数器A 的ClkA 相同但二者的选择设置却是在两个不同的单元中进行的可参见定时器/计数器的配置介绍和定时器/计数器的控制后面的注释Q: 请详细解释定时/计数器TA_TimeOut/2的确切含义是否相当于占空比为1/2的信号A:定时/计数器TA_TimeOut/2的确切含义是TimerA 计数溢出频率被2分频输出 Q: P_UART_Command1P_UART_Command2以及P_UART_Data 是否为8位若向P_UART_Data 写入16位数如何发送高8位低8位 A: P_UART_Command1P_UART_Command2以及P_UART_Data 的有效位均为8位低字节若向P_UART_Data 写入16位数则只发送低字节部分高字节部分需经移位处理到低位字节部分方可发送Q: UART数据格式只有一种A: UART 数据格式目前只规定了一种见图1.3 其中TX 端在发送数据时应与接收其数据的RX 端严格地按照协议好的数据格式进行数据传输见图 4.6否则会引起数据帧错误8位数据奇偶优先检查位结束位图1.3 UART 数据帧的格式Q: SIO 接口中数据接受/发送端口SDA是双向对应IOB1应设置为输入还是输出 A: SIO 接口中数据接受/发送端口SDA 可根据需要将其设置为输入或输出端口Q: 请给出SIO 接口较详细的解释说明请给出 SIO 设备地址的详细解释SPRS512的详细资料其容量多大地址如何确定A: SIO 设备地址的详细解释可参见061书的2..1.3 串行设备输入输出端口SIO 部分其中有SIO 接口较详细的解释说明SPRS512容量为512KB管脚的控制来实现连接图见图1.4图1.4 SPCE061A 与SPRS512C 的连接图Q: ADC的自动方式可以很方便的实现转换功能为什么还要手动方式A: 当ADC 自动转换方式的速度为多少与输入的模拟信号源形成的速度匹配时自然可以使用自动方式转换而当二者的速度不匹配尤其是后者的速度低于前者的速度时便可考虑使用手动方式即以软件编程方式进行控制Q: ADC的模拟量输入范围是什么A: A/D模拟量输入范围 1/2VDD+/-1/4VDDQ: 如何理解ADC 的硬件转换速率限制是Fosc/32/12 HZA: ADC 的硬件转换速率限制Fosc/32/12 Hz 是指控制ADC 进行模/数转换的最高速率它除了取决于系统时钟Fosc 外也取决于控制ADC 转换的中断服务子程序的周期如果超出了此最高转换速率便会出现转换数据不准确之情况Q: 音频输出有两种方式:Tone Mode 和Speech Mode 二者的区别是什么音频输出的两种方式下Timer 的作用分别是什么,A: 音频输出的两种方式Tone Mode 和Speech Mode 的区别在于其输出的控制机理不同前者是通过控制Timer 溢出所产生的不同频率来决定声波振动次数的多少从而决定发出的声音音调的高低譬如好听的乐音后者则是用与声音不论是音乐还是语音数据采样率相同的速率将声音数据通过数/模转换D/A 通道还原成音频电压或电流输出其中声音数据采样率可决定声音音质的好坏并决定了声音数据所需占据的存储空间Timer 对于前者是必须要有的组件之一其作用是控制Tone Mode 中发声频率DAC 或PWM 方式无非是D/A 转换的2种不同形式它们自己本身都可用来实现Speech Mode 的音频输出只是形式不同并且它们分别与Timer 结合使用可实现Tone Mode 的音频输出其中Timer 起音频调频的作用而DAC 或PWM 则起调幅值的作用两种方式的音频输出波形参见图1.5图1.5 µ’nSP™ 两种音频输出方式的波形Q: PWM 锁存方式所涉及的硬件是不是只有PWM 预锁存器和PWM 计数器给出图还涉及其它的硬件像加法器10位数据锁存器怎么理解A: user 将资料填入预锁存器等待PWM timer INT 发生将资料送入锁存器中加法器依据PWM 计数器的数值不断比较锁存器中的值以产生对应的周期方波这里的加法器名称让人觉得奇怪实际上做的是比较计数器与锁存器中的值只是在IC 硬件上是用半加法器来实现的中断系统Q: 凌阳单片机是否在执行每条指令的最后检测中断请求信号A: 是的所有中断请求信号都是在指令执行完后才检测Q: 在凌阳单片机的中断响应周期中是否自动保护断点地址与标志位关中断A: 是的当中断发生时会将断点位置PC及SR存入堆栈后才会开始执行中断服务程序详细的动作说明如下凌阳单片机CPU在响应中断请求过程中首先会做PC[SP]SR[SP+1][中断向量]PC0CS保护断点的举动待从中断服务子程序返回时RETI指令的执行便会做出[SP]SR[SP–1]PC的举动Q: 允许中断的中断源在中断请求被CPU响应并按照中断优先级执行完中断服务程序后是否会自动进入同级中断中下一级中断向量所指的中断服务程序直到所有的中断服务程序都被执行完才回到中断发生前程序指令处继续执行源程序A: 是的在凌阳单片机中有两种不同性质的中断FIQ IRQ FIQ的优先级最高可以中断IRQ中断服务程序而IRQ中断则只能中断使用者程序并按照中断优先级依序执行允许中断的中断源在中断请求被CPU响应并按照中断优先级执行中断服务程序过程中通常是由用户写的指令来引导同级中断服务程序的执行顺序待从中断服务程序返回时如果有下一级中断请求便会继续响应直到响应完毕所有的中断请求之后才会回到响应中断前的断点处继续执行下面的指令汇编语言程序设计Q: 定义段是否可嵌套A: 为了使程序在链接时具有更大的灵活性,用户可以用伪指令.SECTION来定义某些段定义的段名最多不可超过32个字符且最多可定义4096个段但不可嵌套使用Q: 伪指令END在什么情况下是必须使用的A: 在欲停止编译的地方写上END即停止编译若未撰写的话则在遇到档尾时会自动停止编译实验中遇到的问题Q在试验中.define TIMER_DATA_FOR_8KHZ 0xFA23R1=TIMER_DATA_FOR_8KHZ ;[P_TimerA_Data]=R1;为什么TIMER_DATA_FOR_8KHZ能定义以8KHZ采样A TIMER_DATA_FOR_8KHZ是指定时的初始值你也可以用任何符号代替当定时的时钟源选择为Fosc/2时如果我们需要8K采样率则需记数1500次即24M/2/1500=8K所以[P_TimerA_Data]寄存器初始值为0xffff - 1500=0xFA23而TIMER_DATA_FOR_8KHZ 就是指0xFA23Q: 在A/D转换的试验中R1=[P_ADC_MUX_CTRL]TEST R1 ,0x8000 此处比较R1 与0x8000 ,有何意义起何作用? A: 判断[P_ADC_MUX_CTRL]寄存器是否为0x8000是因为该寄存器的B15位是用来判断10位转换是否结束当B15=0时表示没有转换完毕继续返回进行转换否则转换完毕Q:作键唤醒实验时有下列三语句不解R1=[P-IOA-LATCH]R1=0X0007[P-SYSTEMCLOCK]=R1不知第一个语句的作用A: 键唤醒实验中的 r1=[P_IOA_RL] ,该指令语句只是通过读寄存器[P_IOA_RL]来激活A口的唤醒功能并锁存IOA0-IO7的键状态 所以R1的值是没有任何意义的Q: 做AD转换实验时我设置了LINE6-IN通道利用TimerA触发A/D转换同时利用TimerA开中断读[P-ADC-MUX-Ctrl]时发现其值为0X4000.A: [P-ADC-MUX-Ctrl]的值为0X4000是指MIC的A/D转换之所以会出现这种情况是因为061的A/D转换有直接方式也有定时器A或B方式但是电压模拟量输入只可以用直接方式即通过读取P_ADC_MUX_Data单元触发A/D转换而MIC输入则可以用直接和定时两种方式Q对P_IOA_DATA和P_IOA_BUFFER读写的区别A 向 P_IOA_DATA单元写入数据和向P_IOA_BUFFER单元写入数据的作用是相同的都是写入数据寄存器区别在于读也就是说读出 P_IOA_DATA的数据来自I/O管脚而P_IOA_BUFFER 则来自于数据寄存器例如当A口设置为输入时可以将任意端口接VCC或GND运行程序从寄存器窗口会看到P_IOA_DATA的值改变而P_IOA_BUFFER的值为初始化值Q: 在SACM-DVR实验中你们给的例子中的SRAM是采用16位地址线在此实验中调用的InitWriteSRAM(),WriteSRAM(),InitReadSRAM()等函数都是采用16位地址线编写的程序吗为什么我在单步运行的时候不能看到上面的函数的原程序如果我想改为17位地址线我该怎么更改程序A: 在SACM-DVR实验中所给的对SRAM操作的几个函数是采用16位地址线编写的,对于InitWriteSRAM(),WriteSRAM(),InitReadSRAM()等几个函数的内容及如何采用17位地址线编程则可参考第八章的8.2.5中语音录放部分内容Q: 在FIR滤波器算法例程中要实现N阶FIR低通滤波器采样频为10KHz我们理解这个采样率是通过定时/计数器溢出中断启动ADC来确保的那幺在中断服务程序中是否还需要[P_ADC_CTRL]=ADC_START来启动ADC呢A: 不用了当定时/计数器溢出中断触发ADC时你只需检查RDY是否为代表转换完成然后直接读取P_ADC之转换结果即可也就是说在ADC自动方式下通过定时/计数器溢出中断服务子程序F_IRQ1_Service_10kHz中读取P_ADC单元就足以启动ADC了因此[P_ADC_CTRL]=ADC_START是多余的举动已去掉。
IO寄存器数字I/O端口寄存器7.2.1 输入寄存器PxIN当I/O管脚被配置为普通IO口时,对应IO口的信号输入值表现为输入寄存器中的每一个位。
·位为零:输入为低·位为一:输入为高注意:写只读寄存器PxIN写这些只读寄存器会导致在写操作被激活的时候电流的增加。
7.2.2 输出寄存器PxOUT当I/O管脚被配置为普通IO口并且为输出方向时,对应IO 口的输出值表现为输出寄存器中的每一个位。
·位为零:输出为低·位为一:输出为高如果管脚被配置为普通I/O功能、输出方向并且置位寄存器使能时,PxOUT 寄存器的相应管脚被选择置高或者置低。
·位为零:该管脚置低·位为一:该管脚置高7.2.3 方向寄存器PxDIRPxDIR寄存器中的每一位选择相应管脚的输入输出方向,不管该管脚实现何功能。
当管脚被设置为其它功能时方向寄存器中对应的值应被设置为该管脚所实现功能要求的方向值。
·位为零:管脚转变为输入方向·位为一:管脚转变为输出方向7.2.4 置高/置低寄存器使能寄存器PxRENPxREN寄存器中的每一位可以使能相应I/O管脚的置高/置低寄存器。
PxOUT 寄存器中相应的位选择管脚是否置高或者置低。
·位为零:置高/置低寄存器关闭·位为一:置高/置低寄存器使能表7-1 总结I/O口配置时PxDIRx、PxRENx和PxOUTx寄存器的用法表7-1 I/O配置PxDIRx PxRENx PxOUTx I/O口配置0 0 x 输入0 1 0 置低0 1 1 置高1 x x 输出7.2.5 输出驱动能力寄存器PxDSPxDS寄存器中的每一位选择全力驱动或者减弱驱动能力。
默认的是减弱驱动能力。
·位为零:减弱驱动能力·位为一:全力驱动能力7.2.6 功能选择寄存器PxSEL接口管脚的功能因外围模块的功能不同而不同。
c语言给寄存器赋值原理摘要:I.引言- 介绍C语言和寄存器的基本概念II.寄存器的概念和作用- 定义寄存器- 寄存器的作用III.C语言给寄存器赋值的基本原理- 数据类型与内存分配- 寄存器的赋值操作IV.实际应用案例- 一个简单的C语言程序示例V.总结- 总结C语言给寄存器赋值的原理及应用正文:C语言是一种通用的、过程式的计算机程序设计语言,广泛应用于各种嵌入式系统、操作系统和应用程序的开发。
在C语言中,寄存器是用于暂存计算过程中的数据的一种硬件设备。
寄存器的速度非常快,可以显著提高程序的运行效率。
因此,了解C语言给寄存器赋值的原理对于程序设计者来说是非常重要的。
寄存器是计算机中的一种重要资源,用于存储计算过程中的数据和指令。
它具有高速、低功耗和可读写等特点。
在C语言中,寄存器可以分为通用寄存器、程序计数器、指令寄存器、状态寄存器等。
通用寄存器主要用于存储程序运行过程中的数据,包括整数、浮点数和指针等。
C语言给寄存器赋值的基本原理是通过数据类型和内存分配来实现的。
首先,程序设计者需要根据程序的需求定义数据类型,如整型、浮点型和指针型等。
然后,通过变量声明语句分配内存空间,将数据类型与内存地址关联起来。
最后,使用赋值操作将数据存储到寄存器中。
在C语言中,赋值操作通常使用“=”号表示。
例如,以下代码将整数10赋值给寄存器r0:```cint r0 = 10;```类似地,可以使用“=”号将其他数据类型(如浮点数、指针等)赋值给寄存器。
除了通用寄存器,C语言还支持对特殊功能寄存器(SFR)进行操作。
特殊功能寄存器是单片机内部的一种寄存器,用于存储一些特定的数据,如中断向量表、定时器/计数器等。
在C语言中,可以使用“sfr”关键字定义特殊功能寄存器,并通过“=”号对其进行赋值操作。
例如:```csfr P0 = 0x80;```该代码定义了一个名为P0的特殊功能寄存器,其地址为0x80。
总之,C语言给寄存器赋值的原理是通过数据类型、内存分配和赋值操作实现的。
本周总结一、FPGA中双向端口inout的设计1.1 双向端口的实现:芯片外部引脚很多都使用inout类型的,为的是节省管脚。
一般信号线用做总线等双向数据传输的时候就要用到INOUT类型了。
就是一个端口同时做输入和输出。
inout在具体实现上一般用三态门来实现。
三态门的第三个状态就是高阻'Z'。
当inout端口不输出时,将三态门置高阻。
双向端口inout 模式的设计也必须考虑到三态的使用,其实是高阻的使用。
这是因为,当双向端口在完成输入的时,必须使原来呈输出模式的端口呈高阻态,否则,待输入的外部数据势必会与端口处原有电平发生“线与”。
也就是说,在内部模块最好不要出现inout,如果确实需要,那么用两个port实现,到顶层的时候再用三态实现。
理由是:在非顶层模块用双向口的话,该双向口必然有它的上层跟它相连。
既然是双向口,则上层至少有一个输入口和一个输出口联到该双向口上,则发生两个内部输出单元连接到一起的情况出现,这样在综合时往往会出错。
双向端口inout 模式本身不难,难就难在其测试文件编写及仿真设置。
1.2 FPGA中实现双向端口的关键:FPGA内部线延时难以控制,如果不经过Register 将增加Input Delay和Output Delay。
对外部器件速度的要求更加苛刻时序容限缩小。
而FPGA的IOB中本身就有register,不用白不用。
所以,为了提高单板设计速度,提高IO工作的有效频率,所有的输入输出信号都经过寄存器处理。
从而放宽对外部电路或其它芯片的时序要求。
设计中需要注意以下方面分:(1)IOB中包含有输入寄存器(或锁存器)、输出寄存器和输出三态控制寄存器。
在设计中,应当将三态控制寄存器、输入输出寄存器、三态电路都移入IOB中(可在布局布线工具中进行设置)以减少CLB的使用量。
为实现这一目的,需采用同样的时钟触发和同样的复位电路,而且三态控制低电平有效,否则三态寄存器无法引进IOB,增加信号输出延时。
MCS-51单片机21个特殊功能寄存器(52系列是26个)不连续地分布在128个字节的SF R存储空间中,地址空间为80H-FFH,在这片SF R空间中,包含有128个位地址空间,地址也是80H-FFH,但只有83个有效位地址,可对11个特殊功能寄存器的某些位作位寻址操作(这里介绍一个技巧:其地址能被8整除的都可以位寻址)。
在51单片机内部有一个CPU用来运算、控制,有四个并行I/O口,分别是P0、P1、P2、P3,有R OM,用来存放程序,有R AM,用来存放中间结果,此外还有定时/计数器,串行I/O口,中断系统,以及一个内部的时钟电路。
在单片机中有一些独立的存储单元是用来控制这些器件的,被称之为特殊功能寄存器(SF R)。
这样的特殊功能寄存器51单片机共有21个并且都是可寻址的列表如下(其中带*号的为52系列所增加的特殊功能寄存器):分别说明如下:1、ACC---是累加器,通常用A表示这是个什么东西,可不能从名字上理解,它是一个寄存器,而不是一个做加法的东西,为什么给它这么一个名字呢?或许是因为在运算器做运算时其中一个数一定是在ACC中的缘故吧。
它的名字特殊,身份也特殊,稍后在中篇中我们将学到指令,可以发现,所有的运算类指令都离不开它。
自身带有全零标志Z,若A=0则Z=1;若A≠0则z=0。
该标志常用作程序分枝转移的判断条件。
2、B--一个寄存器在做乘、除法时放乘数或除数,不做乘除法时,随你怎么用。
3、PSW-----程序状态字。
这是一个很重要的东西,里面放了CPU工作时的很多状态,借此,我们可以了解CPU的当前状态,并作出相应的处理。
它的各位功能请看下表:下面我们逐一介绍各位的用途CY:进位标志。
8051中的运算器是一种8位的运算器,我们知道,8位运算器只能表示到0-255,如果做加法的话,两数相加可能会超过255,这样最高位就会丢失,造成运算的错误,怎么办?最高位就进到这里来。
这样就没事了。
汇编语⾔之寄存器使⽤(bx,si,di,bp)这⾥对这⼏个寄存器总结⼀下。
通⽤寄存器的主要⽤途寄存器的分类寄存器主 要 ⽤ 途通⽤寄存器数据寄存器AX乘、除运算,字的输⼊输出,中间结果的缓存AL字节的乘、除运算,字节的输⼊输出,⼗进制算术运算AH字节的乘、除运算,存放中断的功能号BX存储器指针CX串操作、循环控制的计数器CL移位操作的计数器DX字的乘、除运算,间接的输⼊输出变址寄存器SI存储器指针、串指令中的源操作数指针DI存储器指针、串指令中的⽬的操作数指针变址寄存器BP存储器指针、存取堆栈的指针SP堆栈的栈顶指针指令指针IP/EIP标志位寄存器Flag/EFlag32位CPU的段寄存器16位CPU的段寄存器ES附加段寄存器CS代码段寄存器SS堆栈段寄存器DS数据段寄存器新增加的段寄存器FS附加段寄存器GS附加段寄存器这张表⽤来参照。
(1)在8086CPU中只有这四个寄存器可以在[...]中进⾏内存单元的寻址。
⽐如,下⾯的指令都是正确的:mov ax,[bx]mov ax,[bx+si]mov ax,[bx+di]mov ax,[bp]mov ax,[bp+si]mov ax,[bp+di]⽽下⾯都是错误的:mov ax,[cx]mov ax,[ax]mov ax,[dx]mov ax,[ds](2).在[...]中,这四个寄存器可以单独出现,或者只能以四种组合出现:bx和si、bx和di、bp和si、bp和di。
⽐如下⾯都是正确的mov ax,[bx]mov ax,[si]mov ax,[di]mov ax,[bp]mov ax,[bx+si]mov ax,[bx+di]mov ax,[bp+si]mpv ax,[bp+di]mov ax,[bx+si+idata]mov ax,[bx+si+idata]mov ax,[bp+si+idata]mov ax,[bp+di+idata]下⾯就是错误的mov ax,[bx+bp]mov ax,[si+di](3)只要在[....]中使⽤寄存器bp,⽽指令汇总没有显⽰给出段地址,段地址就默认在ss中。
XilinxFPGA“打⼀拍”“打两拍”以及IOB含义本次总结主要是参考⽹上的说法,最近在接触到异步时钟同步的时候了解到利⽤“⾮阻塞赋值<=”进⾏时钟同步,碰到有⼈说“打⼀拍”“打两拍”可以降低亚稳态问题,听起来有点糊,所以总结⼀下:⼀、 “打⼀拍”“打两拍”的含义关于FPGA中“打⼀拍”的含义,我们可以理解为**把某个信号延迟了⼀个时钟周期,推⽽⼴之:“打两拍”就是延迟两个时钟周期,“打n拍”就是延迟n个时钟周期。
**通俗的讲,打⼀拍就是系统时钟对外部信号采样⼀次,把采样的结果数据做为下⼀步的控制状态!“打⼀拍”的⽬的很简单,就是为了FPGA中时序的正确性⼆、输⼊信号为什么要寄存⼀般来说,在全同步设计中,如果信号来⾃同⼀时钟域,各模块的输⼊不需要寄存。
只要满⾜建⽴时间,保持时间的约束,可以保证在时钟上升沿到来时,输⼊信号已经稳定,可以采样得到正确的值。
但是如果模块需要使⽤输⼊信号的跳变沿(⽐如帧同步信号),千万不要直接这样⽤哦。
三、所有信号都需要寄存两拍吗如果这个输⼊信号来⾃异步时钟域(⽐如FPGA芯⽚外部的输⼊),必须寄存两拍。
第⼀拍将输⼊信号同步化,同步化后的输出可能带来建⽴/保持时间的冲突,产⽣亚稳态。
需要再寄存⼀拍,减少(注意是减少)亚稳态带来的影响。
如果这个输⼊信号来⾃于同⼀时钟域且需要⽤到跳变沿,需要寄存⼀拍。
否则时序报告多半会报clock skew > data delay,造成建⽴/保持时间的冲突。
总⽽⾔之,五条原则:1.全局时钟的跳变沿最可靠。
2.来⾃异步时钟域的输⼊需要寄存⼀次以同步化,再寄存⼀次以减少亚稳态带来的影响。
3.不需要⽤到跳变沿的来⾃同⼀时钟域的输⼊,没有必要对信号进⾏寄存。
4.需要⽤到跳变沿的来⾃同⼀时钟域的输⼊,寄存⼀次即可。
5.需要⽤到跳变沿的来⾃不同时钟域的输⼊,需要⽤到3个触发器,前两个⽤以同步,第3个触发器的输出和第2个的输出经过逻辑门来判断跳变沿。
c语言给寄存器赋值原理摘要:I.引言- 介绍C 语言- 介绍寄存器II.C 语言与寄存器- 寄存器在C 语言中的作用- C 语言如何操作寄存器III.给寄存器赋值原理- 赋值操作的语法- 内存与寄存器的关系- 具体赋值过程IV.不同类型的寄存器- 整数寄存器- 浮点寄存器- 指针寄存器V.寄存器的应用- 实际编程中的寄存器使用- 寄存器在算法优化中的应用VI.总结- 总结寄存器在C 语言中的重要性- 概括寄存器赋值原理正文:C 语言是一种广泛应用于计算机编程的语言,其简洁、高效的特性深受程序员的喜爱。
在C 语言中,寄存器是起到存储数据作用的硬件设备。
了解C 语言与寄存器之间的关系以及寄存器赋值的原理,对于深入理解C 语言编程是非常有帮助的。
寄存器在C 语言中的作用主要体现在它能够存储变量和函数的返回地址等。
C 语言通过操作寄存器来实现变量的赋值、函数调用等操作。
在C 语言中,我们可以使用赋值操作将数据存储到寄存器中,从而实现对寄存器的操作。
在C 语言中,赋值操作的语法如下:```寄存器= 表达式;```其中,`寄存器` 是要赋值的寄存器,`表达式` 是要存储在寄存器中的值。
在执行赋值操作时,首先会计算表达式的值,然后将该值存储到寄存器中。
内存与寄存器的关系在C 语言中是非常紧密的。
内存可以看作是一个大容量的寄存器,而寄存器则是内存的缩影。
在实际编程过程中,我们通常会使用内存来存储数据,而寄存器则用于存储经常访问的数据,以提高程序的运行效率。
在具体赋值过程中,C 语言首先会将表达式的值计算出来,然后将该值存储到寄存器中。
这个过程包括了数据类型的转换、算术运算、内存访问等操作。
不同类型的寄存器在赋值过程中会有不同的处理方式。
除了整数寄存器和浮点寄存器之外,C 语言中还有一种特殊的寄存器——指针寄存器。
指针寄存器用于存储变量或函数的地址,可以实现对内存的直接访问。
指针寄存器的使用在C 语言中非常常见,也是C 语言灵活性和高效性的重要体现。
IOB寄存器的使用:IOB= TRUE 属性
IOB寄存器跟通信有关的设计中多会用到,今天查了相关资料,总结如下:
首先了解一下fpga的芯片内部结构:
一个fpga主要是由可编程输入输出单元(图中的IOB模块),可编程逻辑单元(CLB模块),块RAM(图中的BRAM,也属于内嵌硬件),数字时钟管理(DCM,也属于内嵌硬件),还有一些内嵌的专用的硬件模块(DSP),IOB寄存器就在图中的IOB模块中。
IOB 的内部结构如下:
IOB单元简称IO单元,是芯片与外部器件的接口部分,用于完成不同电气特性下对输入输出信号的的驱动和匹配要求。
目IO口的频率越来越高,一些高端的fpga通过DDR技术可使数据率达到Gb/s.
在这里多提一点:IOB多用在高速数据采样的时候,对一些很难采的信号要通过连接IOB寄存器(在UCF文件中约束)。
在赛灵思系列FPGA 的IOB 中分别有输入和输出寄存器。
如果将设计中的第一级寄存器或最后一级寄存器用IOB 内部寄存器实现,那么就可以缩短IO 引脚到寄存器之间的路径(理解这句话是关键,我的理解是:若输入输出不连IOB寄存器,则代码修改后(但逻辑功能相同)每次的布局布线后,输入输出信号会被连在不同的内部寄存器上,这样输入信号进入第一级寄存器的布线延迟就会每次都不同,这样有可能在高速信号采集的时候不能正确采样,因为布线延迟会导致建立或保持时间不满足;如果在UCF文件中使用IOB寄存器,则不管代码如何修改,输入信号进入fpga内部都是被第一级的IOB寄存器采样,更能满足采样条件),这通常可以缩短大约1~2ns 的传输时延。
但是在使用UCF文件约束IOB寄存器时,首先,有一些限制。
对于输入寄存器在从管脚到寄存器间不能有组合逻辑存在。
对于输出寄存器,在寄存器和管脚之间也不能有组合逻辑存在(也就是信号在输入输出之前在代码设计中都要干干净净打一拍)。
对于三态输出,在IOB中的所有的寄存器必须使用同一个时钟信号和复位信号,而且IOB三态寄存器必须低电平有效才能放到I OB中(三态缓冲器低电平有效,所以在寄存器和三态缓冲器之间不需要一个反相器)。
必须使软件能够选用IOB寄存器,可以设置全局实现选项:为输入、输出或输入输出选择IOB寄存器。
缺省值为关off。
你也可在综合工具或在用户约束文件UCF中设定,使得能够使用IOB寄存器。
句法为: INS T IOB = TRUE;
下边是一网友的的例子:我想大家都应该知道IOBpacking的概念吧,就是把寄存器放置到IO B内,这样寄存器数据可以直接从PAD输出,和FPGA内部SLICE实现相比,减少了布线延迟,提高了性能。
设置IOB的方法太多了,我列举几个:
1. 在UCF上为相应的管脚制定IOB= TRUE 属性。
2. 在Synplify 中指定define_global_attribute{syn_useioff} {1} 属性,你可以通过SCOPE 界面操作,类似。
3. 在XST中打开属性,设置xilinxspecific options 的-iob (Pack I/O registers into IOB)属性为yes
4. 在ISE的implementation的MAP属性中设置-pr(Pack I/O registers into IOB) 属性为“for inputs and outputs”
大概就是这些,欢迎补充。
今天我做的实验,非常简单。
就是要亲眼目睹一下采用IOB packing后有什么区别。
代码(主要部分)
always @(posedge i_clk or negedge i_rst_n)begin
if (!i_rst_n) o1 <= 1'b0;
else o1 <= i1;
end
非常简单的代码,就是一个寄存器而已。
然后再ISE11.1中建立工程,默认方式跑一遍,然后再设置IOB packing跑一遍。
每次跑完后都在p&r的下拉菜单里找到View/Edit Routed Design (FPGA Editor),打开,观看最终的实现结果。
发现了重大的差别。
- 默认方案
最终实现中用到一个Slice,点进去看到了寄存器的使用
- IOB Packing方案
最终实现中没有Slice,但是用到了一个ILOGIC,他是Input PAD中的一部分,在这个ILOGI C中点进去,就看到了我们的寄存器。
所以和我们预想的一样,一般方案中,寄存器是实现在FPGA内部,因此到PAD的延时相对比较长,尤其是设计较大较复杂的时候。
使用IOB Packing则将寄存器实现在FPGA边缘的IOB 中,大大缩短延迟时间,提高了时序性能。