




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、武汉理工大学EDA课程设计说明书课程设计任务书学生姓名: 专业班级:电子科学与技术0803班指导教师: 工作单位: 信息工程学院 题 目: 巴克码检测器课题要求: (1)学会在Quartus环境中运用VHDL语言设计方法构建具有一定逻辑功能的模块,并能运用图形设计方法完成顶层原理图的设计。 (2)掌握巴克码检测器的主要功能与在CPLD中的实现方法。 课题内容:(1)设计一个七位巴克码(X1110010)代码检测器,当识别到一组代码时,输出一个高电平脉冲。 (2)运用Quartus软件中的仿真功能对所设计的巴克码检测器的各个模块及顶层电路的功能进行仿真分析。时间安排:学习VHDL语言的概况 第1
2、天学习VHDL语言的基本知识 第2、3天学习VHDL语言的应用环境,调试命令 第4、5天课程设计 第6-9天答辩 第10天 指导教师签名: 年 月 日系主任(或责任教师)签名: 年 月 日目录 TOC o 1-3 h z u HYPERLINK l _Toc283367692 摘要 PAGEREF _Toc283367692 h I HYPERLINK l _Toc283367693 Abstract PAGEREF _Toc283367693 h II HYPERLINK l _Toc283367694 1绪论 PAGEREF _Toc283367694 h 1 HYPERLINK l _T
3、oc283367695 2 巴克码简介 PAGEREF _Toc283367695 h 2 HYPERLINK l _Toc283367696 3 Quarters 设计软件介绍 PAGEREF _Toc283367696 h 3 HYPERLINK l _Toc283367697 3.1 VHDL发展史及特点 PAGEREF _Toc283367697 h 3 HYPERLINK l _Toc283367698 3.2 Quarters 应用 PAGEREF _Toc283367698 h 4 HYPERLINK l _Toc283367699 4方案选择及论证 PAGEREF _Toc28
4、3367699 h 6 HYPERLINK l _Toc283367700 5 设计原理 PAGEREF _Toc283367700 h 7 HYPERLINK l _Toc283367701 5.1 巴克码发生器 PAGEREF _Toc283367701 h 7 HYPERLINK l _Toc283367702 5.2 巴克码检测器 PAGEREF _Toc283367702 h 9 HYPERLINK l _Toc283367703 6 编译与仿真 PAGEREF _Toc283367703 h 13 HYPERLINK l _Toc283367704 6.1 程序编译 PAGEREF
5、 _Toc283367704 h 13 HYPERLINK l _Toc283367705 6.2 实验仿真 PAGEREF _Toc283367705 h 18 HYPERLINK l _Toc283367706 7 小结 PAGEREF _Toc283367706 h 20 HYPERLINK l _Toc283367707 参考文献: PAGEREF _Toc283367707 h 21 PAGE 41摘要设计一个七位巴克码(X1110010)代码检测器,当识别到一组代码时,输出一个高电平脉冲。AbstractThis course is designed using QUARTERS
6、design a seven buck code (X1110010) code detector, when to recognize a set of code, and the output pulse a high level.Buck code is mainly used for communication system of frame synchronization, characterized by a sharp autocorrelation, facilitate and random digital information to distinguish, easy t
7、o identify, appear the possibility of pseudo synchronous small. Buck code is one kind has the special law of binary code group, it is a non-periodic sequence.Keywords: QUARTERS , buck yards, signal tester, sequence1绪论2 巴克码简介3 Quarters 设计软件介绍3.1 VHDL发展史及特点VHDL诞生于1982年。随后各EDA公司相继推出了自己的VHDL设计环境,或宣布自己的设
8、计工具可以和VHDL接口。此后VHDL在电子设计领域得到了广泛的接受,并逐步取代了原有的非标准的硬件描述语言。1993年,IEEE对VHDL进行了修订,从更高的抽象层次和系统描述能力上扩展VHDL的内容,公布了新版本的VHDL,即IEEE标准的1076-1993版本,(简称93版)。现在,VHDL和Verilog作为IEEE的工业标准硬件描述语言,又得到众多EDA公司的支持,在电子工程领域,已成为事实上的通用硬件描述语言。有专家认为,在新的世纪中,VHDL于Verilog语言将承担起大部分的数字系统设计任务。 VHDL的英文全写是:VHSIC(Very High Speed Integrate
9、d Circuit)Hardware Descriptiong Language.翻译成中文就是超高速集成电路硬件描述语言。因此它的应用主要是应用在数字电路的设计中。目前,它在中国的应用多数是用在FPGA/CPLD/EPLD的设计中。当然在一些实力较为雄厚的单位,它也被用来设计ASIC。VHDL主要用于描述数字系统的结构,行为,功能和接口。除了含有许多具有硬件特征的语句外,VHDL的语言形式和描述风格与句法是十分类似于一般的计算机高级语言。 VHDL语言特点(1)VHDL语言功能强大、设计灵活。VHDL具有功能强大的语言结构,可以用简洁明确的源代码来描述复杂的逻辑控制。它具有多层次的设计描述功
10、能,层层细化,最后可直接生成电路级描述。VHDL支持同步电路、异步电路和随机电路的设计,这是其他硬件描述语言虽不能比拟的。VHDL还支持各种设计方法,既支持自底向上的设计,又支持自顶向下的设计;既支持模块化设计,又支持层次化设计。(2)支持广泛、易于修改。由于VHDL已经成为IEEE标准所规范的硬件描述语言,目前大多数EDA工具几乎都支持VHDL,这为VHDL的进一步推广和广泛应用奠定了基础。在硬件电路设计过程中,主要的设计文件是用VHDL编写的源代码,因为VHDL易读和结构化,所以易于修改设计。(3)强大的系统硬件描述能力。VHDL具有多层次的设计描述功能,既可以描述系统级电路,又可以描述门
11、级电路。而描述既可以采用行为描述、寄存器传输描述或结构描述,也可以采用三者混合的混合级描述。另外,VHDL支持惯性延迟和传输延迟,还可以准确地建立硬件电路模型。VHDL支持预定义的和自定义的数据类型,给硬件描述带来较大的自由度,使设计人员能够方便地创建高层次的系统模型。(4)独立于器件的设计、与工艺无关。设计人员用VHDL进行设计时,不需要首先考虑选择完成设计的器件,就可以集中精力进行设计的优化。当设计描述完成后,可以用多种不同的器件结构来实现其功能。(5)很强的移植能力。VHDL是一种标准化的硬件描述语言,同一个设计描述可以被不同的工具所支持,使得设计描述的移植成为可能。(6)易于共享和复用
12、。VHDL采用基于库(Library)的设计方法,可以建立各种可再次利用的模块。这些模块可以预先设计或使用以前设计中的存档模块,将这些模块存放到库中,就可以在以后的设计中进行复用,可以使设计成果在设计人员之间进行交流和共享,减少硬件电路设计。(7)VHDL丰富的仿真语句和库函数,使得在任何大系统的设计早期就能查验设计系统的功能可行性,随时可对设计进行仿真模拟。(8)VHDL语句的行为描述能力和程序结构决定了他具有支持大规模设计的分解和已有设计的再利用功能。符合市场需求的大规模系统高效,高速的完成必须有多人甚至多个代发组共同并行工作才能实现。对于用VHDL完成的一个确定的设计,可以利用EDA工具
13、进行逻辑综合和优化,并自动的把VHDL描述设计转变成门级网表。(9)VHDL对设计的描述具有相对独立性,设计者可以不懂硬件的结构,也不必管理最终设计实现的目标器件是什么,而进行独立的设计。总之,由于VHDL语言有这么多优点和特点,因此它被广泛的应用在电路系统的设计和器件的设计仿真中。3.2 Quarters 应用Quarters 是Altera公司推出的新一代开发软件,适合于大规模逻辑电路设计,是Altera公司的第4代可编程逻辑器件集成开发环境,提供了从设计输入到器件编程的全部功能,与Max+plus 相比,Quarters 设计软件增加了网络编辑功能,提升了调试能力,解决了潜在的设计延迟,
14、同时其强大的设计能力和直观易用的接口,受到数字系统设计者的普遍欢迎。Quarters 开发系统具有以下主要特点:Quarters 可以产生并识别EDIF网表文件、VHDL网表文件和Verilog HDL网表文件,为第三方EDA工具提供了方便的接口。Quarters 支持一个工作组环境下的设计要求,包括支持基于Internet的协作设计,与Cadence,ExemplarLogic,MentorGraphics,Synopsys和Synplicity等EDA供应商的开发工具相兼容。Quarters 作为一种设计环境,除支持Altera的APEX 20KE,APEX 20KC,APEX,ARM的E
15、xcalibur嵌入式处理器方案,Mercury,FLEX10KE和ACEX1K之外,还支持MAX3000A和MAX7000系列乘积项器件。 Quarters 增加了一个新的快速适配编译选项,可缩短50%的编译时间。快速适配功能保留了最佳性能的设置,加快了编译过程,编译速度更快,对设计性能的影响最小3境,或宣布自己的设计工具可以和VHDL接口。此后VHDL在电子设计领域得到了广泛的接受,并逐步取代了原有的非标准的硬件描述语言。Quarters 设计软件界面如图3.1所示。图3.1 Quarters 设计软件界面4方案选择及论证方案一:在状态连续变化的数字系统设计中,采用状态机的设计思想有利于提
16、高设计效率,增加程序的可读性,减少错误的发生几率。同时,状态机的设计方法也是数字系统中一种常用的设计方法,其输出仅仅是当前状态值的函数,并且在时钟上升沿到来时才发生变化。米立机的输出则是当前状态值、当前输出值和当前输入值的函数。本实验要从一串二进制码中检测出一个已预置的7位二进制码,每增加一位二进制相当于增加一个状态,用7个状态可以实现。方案二:利用移位寄存器实现序列检测:上面检测的原理是:逐位检测,的那个检测到信号时则转入下一个状态。这种检测的原理清晰,但缺点是当检测到序列比较长时就非常麻烦,而且检测的灵活性差。利用移位寄存器能实现简便快速,可移植的序列检测器。通过比较可以看出方案一比较容易
17、实现,因此本次课程设计我选择的是方案一。 5 设计原理序列检测器可用于检测一组或多组由二进制码组成的脉冲序列信号,当序列检测器连续收到一组串行二进制码后,如果这组码与检测器中预先设置的码相同,则输出1,否则输出0。由于这种检测的关键在于正确码的收到必须是连续的,这就要求检测器必须记住前一次的正确码及正确序列,直到在连续的检测中所收到的每一位码都与预置数的对应码相同。在检测过程中,任何一位不相等都将回到初始状态重新开始检测。在本次设计中首先要设计一个巴克码发生器,然后再设计巴克码检测器。5.1 巴克码发生器发生器原理:N位触发器构成的计数器可产生M个代码。原理图:图5.1巴克码发生器原理图当计数
18、脉冲不断进入由Q3Q2Q1组成的三位二进制异步计数器时,3-8译码器的8个输出经反相器后顺序输出高电平。其中五路信号经“或非”后再和其中3路“或”,在Y端便可顺序产生11000100代码序列。代码序列发生:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity bak1 isport(clk,reset: in std_logic;dout:out std_logic);end bak1;architecture a of bak1 issignal count :std_logic_vec
19、tor(2 downto 0);signal tmp1:std_logic;begindout=tmp1;process(clk,reset)beginif reset=0 thencount0);elsif rising_edge(clk) thencounttmp1tmp1tmp1tmp1tmp1tmp1tmp1tmp1tmp1=0;end case;end if;end process;end a;5.2 巴克码检测器序列检测器可用于检测一组或多组由二进制码组成的脉冲序列信号,当序列检测器连续收到一组串行二进制码后,如果这组码与检测器中预先设置的码相同,则输出1,否则输出0。由于这种检测
20、的关键在于正确码的收到必须是连续的,这就要求检测器必须记住前一次的正确码及正确序列,直到在连续的检测中所收到的每一位码都与预置数的对应码相同。在检测过程中,任何一位不相等都将回到初始状态重新开始检测。 图5.2 巴克码检测器状态图用状态机设计的巴克码检测器总设计程序如下所示:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity create is port( CLR : in std_logic; CLK_1S : in std_l
21、ogic; SIG_OUT : out std_logic; CODE : in std_logic_vector(6 downto 0) );end entity;architecture behave of create istype states is(st0,st1,st2,st3,st4,st5,st6,st7);signal current_state : states;begin process(CLK_1S,CLR,CODE) begin if CLR = 0 then current_state = st0; SIG_OUT SIG_OUT = CODE(0); curren
22、t_state SIG_OUT = CODE(1); current_state SIG_OUT = CODE(2); current_state SIG_OUT = CODE(3); current_state SIG_OUT = CODE(4); current_state SIG_OUT = CODE(5); current_state SIG_OUT = CODE(6); current_state SIG_OUT = 0; current_state current_state = st0; end case; end if; end process;end behave;本次课程设
23、计所用的频率是由实验箱pin16提供20M的频率,但我们实际中不会用到那么高的频率,因此我们需要一个分频器将此20M的频率分频到我们所需的频率,分频器原程序如下所示:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity div is port( CLK_IN : in std_logic; CLK_OUT : buffer std_logic; DIV_TIME : in std_logic_vector(15 downto 0)
24、);end entity;architecture behave of div issignal data1: integer range 0 to 10000000;signal data2: integer range 0 to 10000000;begin process(CLK_IN,DIV_TIME) begin if rising_edge(CLK_IN) then if data1 = DIV_TIME then data1 = 0; if data2 = 1000 then data2 = 0; CLK_OUT = not CLK_OUT; else data2 = data2
25、 + 1; end if; else data1 = data1 + 1; end if; end if; end process;end behave; 6 编译与仿真6.1 程序编译按要求安装好Quarters ,打开已安装好的软件并新建一个工程图6.1 新建工程完成后选择芯片,由于本次设计要求用到EP1C3T144C8芯片,因此如图5.2中选择该芯片。图6.2 选择芯片 由于本次设计要用到多种模块,应此要考虑元件例化或画连接图,为了编程简单我们选择画连接图,如图所示在新建文档里选择“Block Diagram/Schematic File”进入画图界面,如图6.3所示: 图6. 3 画图
26、界面课程设计总程序如下所示:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity design is port( CLK : in std_logic; KEY_CLR : in std_logic; KEY_IN : in std_logic_vector(6 downto 0); BELL : out std_logic; LED : out std_logic; LED_7 : out std_logic_vector(6 d
27、ownto 0) );end entity;architecture behave of design iscomponent div is port( CLK_IN : in std_logic; CLK_OUT : buffer std_logic; DIV_TIME : in std_logic_vector(15 downto 0) );end component;component create is port( CLR : in std_logic; CLK_1S : in std_logic; SIG_OUT : out std_logic; CODE : in std_logi
28、c_vector(6 downto 0) );end component;type states is(st0,st1,st2,st3,st4,st5,st6,st7);signal current_state : states;signal clk_1s : std_logic;signal clk_1k : std_logic;signal code_in : std_logic;signal BELL1 : std_logic;beginprocess(clk_1s,KEY_CLR)begin if KEY_CLR = 0 then current_state = st0; LED =
29、0 ; LED_7 0); BELL1 = 0; else LED if code_in = 1 then current_state = st1; else current_state = st0; end if; LED_7(0)=code_in; BELL1 if code_in = 1 then current_state = st2; else current_state = st0; end if; LED_7(1) if code_in = 1 then current_state = st3; else current_state = st0; end if; LED_7(2)
30、 if code_in = 0 then current_state = st4; else current_state = st3; end if; LED_7(3) if code_in = 0 then current_state = st5; else current_state = st1; end if; LED_7(4) if code_in = 1 then current_state = st6; else current_state = st0; end if; LED_7(5) if code_in = 0 then current_state = st7; else c
31、urrent_state = st2; end if; LED_7(6) current_state = st0; BELL1 current_state = st0; end case; end if; end if;end process;process(BELL1) begin if BELL1 = 1 then BELL = clk_1k; else BELL CLK, CLK_OUT = clk_1s, DIV_TIME = 0010011100010000 );DIV2 : div port map(CLK_IN = CLK, CLK_OUT = clk_1k, DIV_TIME
32、= 0000000000001010 );CREATE1 : create port map(CLR = KEY_CLR, CLK_1S = clk_1s, SIG_OUT = code_in, CODE = KEY_IN ); end behave;6.2 实验仿真运行程序直至调试到无错误后生成实验总图如下所示 图6.4 总原理图在总体电路图界面中选择“new”中的 “vector waveform file”在processing中选择simulator tool,进行仿真图6.5 新建vector waveform file在编辑好波形输入文件后,在Process中的simulator
33、tool中选择仿真类型为功能仿真,并生成仿真网表。如图所示。 图 6.6 选择仿真工具巴克码发生器波形仿真器如下所示:图6.7 巴克码(01110010代码)发生器仿真波形图巴克码检测器仿真图如下所示图6.8 巴克码检测器仿真波形图用过波形仿真以及在实验箱上演示可以验证此次设计达到了预期的要求7 小结为期近一周的EDA课程设计已经接近尾声。通过这次课程设计首先对EDA课程的到了复习和应用。并且对所学的知识的到了应用。使得理论与实践相结合,对知识的掌握更佳的熟练。 拿到题目后我首先在网上收索了该题目的相关知识,并且对相关知识进行分析,发现网上的资料不是很全,于是又到图书馆里借了相关的资料。并且对
34、其进行了选择和筛选。之后利用QuartusII9.0进行程序的编辑,并且在自己的电脑上进行调试和相关的波形仿真。编写程序时我编写了两个程序,以便在试验箱调节时多一种选择的余地。然后到试验箱上调节。由于有一个程序的实验效果不是很明显,就将这个程序给舍去了。在进行试验调试之前需要对一些端口进行一些相关的设置和注意一些事项。并且对另外一个程序做了适当的修改时实验现象更加的明显。最初我没有接时钟输出端口。之后为了观察现象明显,最后我接了一个时钟输出端口以便观察。这次课程设计,在调试时还是比较的顺利的。通过这次课程设计对word也更佳的熟悉。这次课程设计业使我明白了在知识的领域里我还有很多很多的不足,并
35、且再一次的深深的体会到理论和实践之间还有很到的差别。在以后的学习中应该多多的注意实践知识的训练和积累。在以后的学习生活中要不断的开拓自己的动手能力,不断的训练自己的动手能力。这次课程设计让我深深的明白了自己以后该做什么,该怎么去做。参考文献:4张亦华,延明.北京邮电大学出版社,2003.5 夏路易.基于EDA的电子技术课程设计.电子工艺出版社,2009.6 王金明.数字系统设计Verilog HDL. 电子工艺出版社,2009.本科生课程设计成绩评定表姓 名性 别 男专业、班级电子科学与技术0803课程设计题目: 巴克码检测器课程设计答辩或质疑记录:成绩评定依据:最终评定成绩(以优、良、中、及
36、格、不及格评定)指导教师签字: 年 月 日附录资料:不需要的可以自行删除C语言编译器的设计与实现 我们设计的编译程序涉及到编译五个阶段中的三个,即词法分析器、语法分析器和中间代码生成器。编译程序的输出结果包括词法分析后的二元式序列、变量名表、状态栈分析过程显示及四元式序列程序,整个编译程序分为三部分:(1) 词法分析部分(2) 语法分析处理及四元式生成部分 (3) 输出显示部分一词法分析器设计 由于我们规定的程序语句中涉及单词较少,故在词法分析阶段忽略了单词输入错误的检查,而将编译程序的重点放在中间代码生成阶段。词法分析器的功能是输入源程序,输出单词符号。我们规定输出的单词符号格式为如下的二元
37、式: (单词种别,单词自身的值)#define ACC -2#define syl_if 0#define syl_else 1#define syl_while 2#define syl_begin 3#define syl_end 4#define a 5#define semicolon 6#define e 7#define jinghao 8#define s 9#define L 10#define tempsy 11#define EA 12#define EO 13#define plus 14#define times 15#define becomes 16#define
38、op_and 17#define op_or 18#define op_not 19#define rop 20#define lparent 21#define rparent 22#define ident 23#define intconst 24函数说明 读取函数 readline( )、readch( )词法分析包含从源文件读取字符的操作,但频繁的读文件操作会影响程序执行效率,故实际上是从源程序文件” source.dat ”中读取一行到输入缓冲区,而词法分析过程中每次读取一个字符时则是通过执行 readch( )从输入缓冲区获得的;若缓冲区已被读空,则再执行readline( )从
39、 source.dat 中读取下一行至输入缓冲区。扫描函数 scan( ) 扫描函数 scan( )的功能是滤除多余空格并对主要单词进行分析处理,将分析得到的二元式存入二元式结果缓冲区。变量处理 find( )变量处理中首先把以字母开头的字母数字串存到 spelling 数组中,然后进行识别。识别过程是先让它与保留关键字表中的所有关键字进行匹配,若获得成功则说明它为保留关键字,即将其内码值写入二元式结果缓冲区;否则说明其为变量,这时让它与变量名表中的变量进行匹配( 变量匹配函数 find( ) ),如果成功,则说明该变量已存在并在二元式结果缓冲区中标记为此变量( 值填为该变量在变量名表中的位置
40、),否则将该变量登记到变量名表中,再将这个新变量存入二元式缓存数组中。数字识别 number( ) 数字识别将识别出的数字填入二元式结果缓存数组。显示函数 显示函数的功能在屏幕上输出词法分析的结果( 即二元式序列程序),同时给出二元式个数及源程序行数统计。二语法分析器设计 语法分析器的核心是三张 SLR 分析表以及针对这三张 SLR 分析表进行语义加工的语义动作。编译程序中语法分析处理及四元式生成部分主要是以二元式作为输入,并通过 SLR 分析表对语法分析处理过程进行控制,使四元式翻译的工作有条不紊的进行,同时识别语法分析中的语法错误。在处理 if 和 while 语句时,需要进行真值或假值的
41、拉链和返填工作,以便转移目标的正确填入。1. 控制语句的 SLR 分析表1 设计过程如下: 将扩展文法GS S1)S if e S else S2)S while e S3)S L 4)S a;5)L S6)L SL用_CLOSURE方法构造LR(0)项目规范簇为:I0: S SS if e S else SS while e S S L S a ;I1: S SI2: S ife S else SI3: S while e SI4: S L L S L SL S if e S else SS while e S S L S a ; I5: S a; I6: S if e S else S S
42、 if e S else SS while e S S L S a ; I7: S while e S S if e S else SS while e S S L S a ; I8: S L I9: L S L SL L SL L S S if e S else SS while e S S L S a ; I10: S a ; I11: S if e S else SI12: S while e S I13: S L I14: S SL I15: S if e S else S S if e S else SS while e S S L S a ; I16: S if e S else
43、S 构造文法G中非终结符的FOLLOW集如下:FOLLOW(S) = # S if e S else S得FOLLOW(S) = else S L 得FOLLOW(L) = 3) S S 得FOLLOW(S) = else , # L S 因为FIRST(S) = ,所以FOLLOW(S) = else , #, 在()项目规范簇中,只有9有“移进归约”冲突,L SL SL因为FOLLOW(L) FIRST(L) = 所以可以用方法解决以上冲突,最后我们得到的分析表如下:ACTIONGOTO ifElsewhilea;e#SL0S2S3S4S511ACC2S63S74S2S3S4S5985S1
44、06S2S3S4S5117S2S3S4S5128S139S2S3S4R5S591410R4R4R4111512R2R2R213R3R3R314R615S2S3S4S51616R1R1R1static int action2011=/* 0 */ 2, -1, 3, 4, -1, 5, -1, -1, -1, 1, -1,/* 1 */ -1, -1, -1, -1, -1, -1, -1, -1,ACC, -1, -1,/* 2 */ -1, -1, -1, -1, -1, -1, -1, 6, -1, -1, -1,/* 3 */ -1, -1, -1, -1, -1, -1, -1, 7,
45、 -1, -1, -1,/* 4 */ 2, -1, 3, 4, -1, 5, -1, -1, -1, 9, 8,/* 5 */ -1, -1, -1, -1, -1, -1, 10, -1, -1, -1, -1,/* 6 */ 2, -1, 3, 4, -1, 5, -1, -1, -1, 11, -1,/* 7 */ 2, -1, 3, 4, -1, 5, -1, -1, -1, 12, -1,/* 8 */ -1, -1, -1, -1, 13, -1, -1, -1, -1, -1, -1,/* 9 */ 2, -1, 3, 4,105, 5, -1, -1, -1, 9, 14,/
46、* 10*/ -1,104, -1, -1,104, -1, -1, -1,104, -1, -1,/* 11*/ -1, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1,/* 12*/ -1,102, -1, -1,102, -1, -1, -1,102, -1, -1,/* 13*/ -1,103, -1, -1,103, -1, -1, -1,103, -1, -1,/* 14*/ -1, -1, -1, -1,106, -1, -1, -1, -1, -1, -1,/* 15*/ 2, -1, 3, 4, -1, 5, -1, -1, -1, 16, -1
47、,/* 16*/ -1,101, -1, -1,101, -1, -1, -1,101, -1, -1;其中,前 9 列为 action 值,后 2 列为 goto 值;016 表示 17 个移进状态( 即 Si);-1表示出错;ACC 表示分析成功;而 100106 对应 7 个归约产生式:S SS if e S else SS while e SS L S a;L SL SL2. 算术表达式的 LR 分析表 2 设计如下:S EE E+EE E*EE (E)E i (过程略)ACTIONGOTOI+*()#E0S3S211S4S5ACC2S3S263R4R4R4R44S3S275S3S28
48、6S4S5S97R1R5R1R18R2R2R2R29R3R3R3R3static int action1107=/* 0 */ 3, -1, -1, 2, -1, -1, 1,/* 1 */ -1, 4, 5, -1, -1,ACC, -1,/* 2 */ 3, -1, -1, 2, -1, -1, 6,/* 3 */ -1,104,104, -1,104,104, -1,/* 4 */ 3, -1, -1, 2, -1, -1, 7,/* 5 */ 3, -1, -1, 2, -1, -1, 8,/* 6 */ -1, 4, 5, -1, 9, -1, -1,/* 7 */ -1,101,
49、5, -1,101,101, -1,/* 8 */ -1,102,102, -1,102,102, -1,/* 9 */ -1,103,103, -1,103,103, -1;3.布尔表达式的 SLR 分析表3 设计如下:(过程略)S BB iB i rop iB ( B )B ! BA B &B ABO B |B OBACTIONGOTOiRop()!&|#BAO0S1S4S513781S2R1R1R1R12S33R2R2R2R24S1S4S511785S1S4S56786R4S9S10R47S1S4S514788S1S4S515789R5R5R510R7R7R711S12S9S1012R3
50、R3R3R313S9S10ACC14R6S9S10R615R8S9S10R8static int action21611=/* 0 */ 1, -1, 4, -1, 5, -1, -1, -1, 13, 7, 8,/* 1 */ 1, 2, -1,101, -1,101,101,101, -1, -1, -1,/* 2 */ 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,/* 3 */ -1, -1, -1,102, -1,102,102,102, -1, -1, -1,/* 4 */ 1, -1, 4, -1, 5, -1, -1, -1, 11, 7,
51、 8,/* 5 */ 1, -1, 4, -1, 5, -1, -1, -1, 6, 7, 8,/* 6 */ -1, -1, -1,104, -1, 9, 10,104, -1, -1, -1,/* 7 */ 1, -1, 4, -1, 5, -1, -1, -1, 14, 7, 8,/* 8 */ 1, -1, 4, -1, 5, -1, -1, -1, 15, 7, 8,/* 9 */ 105, -1,105, -1,105, -1, -1, -1, -1, -1, -1,/*10 */ 107, -1,107, -1,107, -1, -1, -1, -1, -1, -1,/*11 *
52、/ -1, -1, -1, 12, -1, 9, 10, -1, -1, -1, -1,/*12 */ -1, -1, -1,103, -1,103,103,103, -1, -1, -1,/*13 */ -1, -1, -1, -1, -1, 9, 10,ACC, -1, -1, -1,/*14 */ -1, -1, -1,106, -1, 9, 10,106, -1, -1, -1,/*15 */ -1, -1, -1,108, -1, 9, 10,108, -1, -1, -1;LR 分析表控制语义加工的实现:当扫描 LR 分析表的当前状态为归约状态时,则在调用与该状态对应的产生式进行归
53、约的同时,调用相应的语义子程序进行有关的翻译工作。现在对 LR 分析器的分析栈加以扩充,使得每个文法符号之后都跟着它的语义值。为了清晰起见,我们把这个栈的每一项看成由三部分组成:状态 state ,文法符号 syl 和语义值 val。编译程序实现算术表达式、布尔表达式及程序语句的语义加工时,都是按这种状态栈加工方式进行的。例如:( 5 + 3 ) * 6的分析过程序号STATEValsylinput10-#( 5 + 3 ) * 6 #202-#(5 + 3 ) * 6 #3023#(5+ 3 ) * 6 #4026-5#(E+ 3 ) * 6 #50264-5-#(E+3 ) * 6 #60
54、2643-5-#(E+3 ) * 6 #702647-5-3#(E+E) * 6 #8026-8#(E) * 6 #90269-8-#(E)* 6 #1001-8#E* 6 #11015-8-#E* 6 #120153-8-#E*6#130158-8-6#E*E#1401-48#E#15ACC在分析过程中,第(3)步操作后的状态栈为 023,根据栈顶状态“ 3”和现行输入符号“ +”( input 栏字符串的第一个字符)查分析表 ACTION3,+=R4,即按第(4)个产生式 En 来进行归约;由于产生式右部仅含一项,故去掉状态栈栈顶“3”;此时 2 变为新的栈顶状态,再查( 2,E)的下一状
55、态 s:GOTO2,E=6,即将状态 6 和文法符号 E 压栈,最后得到第( 4)步的状态。第( 7)步操作后也是如此,当前状态栈为 02647,根据栈顶状态 7 和现行输入符号“ )”查分析表 ACTION7,)=R1,即按第(1)个产生式 EE1+E2进行归约;由于产生式右部有三项,故去掉状态栈栈顶的 647 三项;此时 2 变为新的栈顶状态,再查( 2,E)的下一状态 s:GOTO2,E=6,即将状态 6 和文法符号 E 压栈,最后得到第(8)步的状态。三中间代码生成器设计:布尔表达式 布尔表达式在程序语言中有两个基本作用:一是用作控制语句( 如 if -else 或 while语句)的
56、条件式;二是用于逻辑演算,计算逻辑值。布尔表达式是由布尔算符( &、| 、!)作用于布尔变量( 或常数)或关系表达式而形成的。关系表达式的形式是 E1 rop E2,其中 rop 是关系符( 如或),E1和 E2是算术式。在这里,我们只考虑前面给定文法所产生的布尔表达式:BB &B | B | B | ! B | (B) | i rop i | i遵照我们的约定,布尔算符的优先顺序( 从高到低)为:!、&、|,并假定&和|都服从左结合规则。所有关系符的优先级都是相同的,而且高于任何布尔算符,低于任何算术算符,关系算符不得结合。表达式的真、假出口的确定:考虑表达式 B1 | B2 ,若 B1为真
57、,则立即知道 B 也为真;因此,B1的真出口也就是整个 B 的真出口。若 B1?为假,则 B2必须被计值,B2的第一个四元式就是 B1的假出口。当然,B2的真、假出口也就是整个 B的真、假出口。类似的考虑适用于对 B1 & B2的翻译,我们将 B1 | B2和 B1 & B2 的翻译用下图表示,在自下而上的分析过程中,一个布尔式的真假出口往往不能在产生四元式的同时就填上。我们只好把这种未完成的四元式的地址( 编号)作为 B 的语义值暂存起来,待到整个表达式的四元式产生完毕之后再来回填这个未填入的转移目标。条件语句对条件语句 if e S1 else S2 中的布尔表达式 e,其作用仅在于控制对
58、 S1和 S2的选择。因此,作为转移条件的布尔式e,我们可以赋予它两种“ 出口”:一是“ 真”出T口,出向 S1;一是“ 假”出口,出向 S2。于是,e的代码F条件语句可以翻译成如图的一般形式。非终结符 e 具有两项语义值 e _TC 和e_FC,它们分别指出了尚待回填真、S2的代码假出口的四元式串。e 的“ 真”出口只有在往回扫描到if时才能知道,而它图 3-2 条件语句的代码结构 的“ 假”出口则需到处理过 S1并且到达 else 才能明确。这就是说,必须把 e_FC 的值传下去,以便到达相应的 else时才进行回填。另外,当 S1语句执行完时意味着整个 if-else 语句也已执行完毕;
59、因此,在 S1的编码之后应产生一条无条件转移指令。这条转移指令将导致程序控制离开整个 if-else 语句。但是,在完成 S2的翻译之前,这条无条件转移指令的转移目标是不知道的。甚至,在翻译完 S2之后,这条转移指令的转移目标仍无法确定。这种情形是由于语句的嵌套性所引起的。例如下面的语句:if e1 if e2 S1 else S2 else S3 在 S1的代码之后的那条无条件转移指令不仅应跨越 S2而且应跨越 S3。这也就是说,转移目标的确定和语句所处的环境密切相关。条件循环语句条件循环语句 while e S 通常被翻译成图的代码结构。布尔式 e 的“ 真”出口出向 S 代码段的第一个四
60、元式。紧接 S 代码段之后应产生一条转向测试 e 的无条件转移指令。e 的“ 假”出口将导致程序控制离开整个 while 语句。e 的“ 假”出口目标即使在整个 while 语句翻译完之后也未必明确。例如: if e1 while e2 S1 else S2这种情况仍是由于语句的嵌套性引起的。所以,我们只好把它作为语句的语义值 SCHAIN 暂留下来,以便在处理外层语句时再伺机回填。语法翻译实现方法 将上述语法翻译付诸实现过程中,我们仅保留了算术表达式和布尔表达式翻译的文法和语义动作;面对程序语句的翻译,由于改造后含有较多的非终结符且语义动作又相对简单,故仍恢复为改造之前的程序语句文法。由于总
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025小学安全教育个人工作总结(33篇)
- 英语发言稿集合(4篇)
- 2025至2031年中国多级深井潜水电泵行业投资前景及策略咨询研究报告
- 动词的时态语态教学设计
- 企业级数据共享平台中的区块链技术及其合规问题研究
- 等差数列教案
- 教研组教师个人教学教研工作总结(4篇)
- 2025四川长虹技佳电镀装饰公司招聘安全管理等岗位2人笔试参考题库附带答案详解
- 文化艺术的融入装修合同
- 人教版四年级上册数学 第2单元 练习六 课件
- 传统园林技艺智慧树知到期末考试答案2024年
- 直播中的礼仪与形象塑造
- 2024年八年级数学下册期中检测卷【含答案】
- 老年人中医健康知识讲座总结
- 海南声茂羊和禽类半自动屠宰场项目环评报告
- 跳绳市场调研报告
- 《民法典》合同编通则及司法解释培训课件
- 《大学生的情绪》课件
- 交通事故法律处理与索赔案例分析与实践指导
- 2023年河北高中学业水平考试物理试卷真题及答案详解
- 大学生组织管理能力大赛题库第三届
评论
0/150
提交评论