当前位置:文档之家› 俄罗斯方块游戏设计原理

俄罗斯方块游戏设计原理

俄罗斯方块游戏设计原理
俄罗斯方块游戏设计原理

俄罗斯方块游戏是VHDL 应用于复杂数字系统的一个经典设计,本章将详细介绍该游戏的设计原理和设计方法。其中包括系统构成、系统设计原理和系统各个模块的实现方法。

8.1 系统结构原理

8.1.1 系统端口

图8.1给出了系统的顶层设计符号,其端口包括:

1)kc :PS/2键盘时钟输入; 2)kd :PS/2键盘数据输入; 3)mclk :系统主时钟输入;

4)blue :蓝色信号输出到VGA 显示器接口; 5)grn :绿色信号输出到VGA 显示器接口; 6)red :红色信号输出到VGA 显示器接口; 7)hs :行扫描信号到VGA 显示器接口;

8)vs :列扫描信号到VGA 显示器接口

要开始一个游戏按F2键,但是当游戏正在运行时,不允许按键F2,如果要开始一个新的游戏必须停止它或者按键F1。该游戏有5个不同的目标,可以对它进行旋转和左移或右移。

该游戏有4种不同的速度,当分数增加的时候,速度也随之增加,按键S 将增加速度,直到目标到达最底部。速度和分数的关系是: 1)当分数<100,速度等级为1;

2)当分数在(100,200)之间时,速度等级为2; 3)当分数在(200,300)之间时,速度等级为3; 4)当分数在>300时,速度等级为4;

如图8.2所示,有两种不同的目标:右边是文本框,左边是俄罗斯方块。使用两个BRAM 存储数据。文本框中包含了32x16=512个字符,每个字符包含8比特,所以需要使用BRAM 。在俄罗斯方块部分也使用了一个BRAM ,但其实这不是必须的,因为这增加了gamecontrol 模块的设计复杂度(只能在一个时钟周期访问一个BRAM )。俄罗斯方块有10x20个块组成,每个块保存了4位(第1位用于说明是否有其它东西,其它3位保持着颜色)。

在屏幕上画像素需要25MHz 时钟,在设计中使用3线来传送颜色。这也就是说,只能画出8种颜色(红,绿,蓝,黄,黑,白,浅绿和紫红)。但其实更仔细的观察可以发现国产生了更多的颜色。为了产生更多的颜色使用了50MHz 时钟,然后分频产生25MHz ,12.5MHz ,6.25MHz 。并且使用这些时钟产生不同的PWM 信号(也可以产生50MHz 时钟,使用这些PWM ,可以绘制出4913种不同的颜色。

图8.1 顶层设计图

8.1.2 系统模块组成

图8.3给出了该设计的模块结构图。该设计由下面模块组成:键盘输入模块,游戏控制模块,图像显示模块,文字显示模块,存储单元,复用单元和VGA控制模块组成。其中图像显示模块和文字显示模块复用VGA控制模块。游戏控制模块,图像显示模块和文字显示模块通过存储单元交换数据。

图8.3 系统结构组成

图8.4给出了系统的模块连接关系,其各个模块的主要功能有:

1)keyboardVhdl:键盘接收模块,读取键盘发送的扫描码;

2)kbfilter:键盘识别模块,识别扫描码是否为指定按键;

3)gamecontrol:游戏控制模块,程序主控单元,通过状态机控制;

4)score:得分统计模块,得分统计和速度控制;

5)RAMB4_S4_S4:双口RAM模块,包含游戏界面图像块的色彩和位置信息;

6)RAMB4_S8_S8:双口RAM模块,包含游戏文字界面;

7)text_display:文字显示模块,读双口RAM只能显示的文本信息信息生成像素;

8)mux:复用选择单元,选择平面图像显示还是文本显示;

9)VGA:VGA模块,生成VGA接口显示控制信号;

图8.4 系统模块详细结构

8.2 系统各模块设计

8.2.1 键盘接口模块设计

这个模块读取键盘发送的扫描码. 该模块实现键盘到主设备的单向通信,并由启动位和停止位控制。图8.5给出了PS/2键盘和主设备通信的时序图。图8.6给出了键盘接口符号描述。表8.1给出键盘接口模块的信号定义。

表8.1 键盘接口信号定义

该模块的设计使用了shiftCounter 寄存器,用于对来自键盘的时钟计数处理,当计数器计满11个时钟时,就可以读取键盘的扫描码。

当读取扫描码时,“an ”信号的输出将由‘0’变到‘1’,或者从‘1’变到‘0’,与这个模块连接的元件将知道扫描码已经被读取。”an ”信号很象写使能信号,中断或警告信号。

8.2.2 键盘识别模块设计

该模块为键盘扫描码识别模块。确定是否为程序指定的控制键,并进行前向控制。表8.2给出了键盘识别模块接口信号定义。图8.7给出了键盘识别模块的符号。该模块用于选择所需要的扫描码,过滤掉无效的扫描码。该模块包含了3种不同类型的过滤器: 1)只读break 键;

2)只读第一个make 键,在该键释放前,不读取其它键; 3)读取按键的make 键,在该键释放前,不读取其它键;

在这个设计中,第一个过滤器被激活。有一个内部的信号和“an ”信号相比较,当比较结果不同时,表示一个扫描码被读取,然后将内部信号量,修改成和输入一样的值。

if (an /= ann) then ann <= not ann;

信号 模式 功能描述 clk 输入 主时钟输入

kc 输入 PS/2键盘时钟 kd 输入 PS/2键盘数据 rst 输入 异步复位 sseg(7:0) 输出 扫描码 an

输出

报警

图8.5 键盘接口时序

如果扫描码送给下一个模块时,ssegout 将得到”segin ”的值,”send ”输出将该改变其值,

从‘0’到‘1’,或者从‘1’到‘0’。

表8.2 键盘识别模块接口信号定义

8.2.3 VGA 接口模块设计

该模块为VGA 显示模块,该模块提供VGA 接口控制信号。将文字和图像信息显示在VGA 显示器上。图8.8给出了VGA 接口模块符号。表8.3给出了VGA 接口模块信号定义。

表8.3 VGA 接口模块信号定义

如图8.9,当两

个计数器在矩形区域内,”text ”和”vid ”信号将被激活。这个模块也用于产

信号 模式 功能描述 mclk 输入 主时钟输入 an 输入 报警输入 ssegin(7:0) 输入 扫描码 ssegout(7:0)

输出 扫描码过滤 send

输出

报警输出

信号 模式 功能描述 mclk 输入 主时钟输入 pix(2:0) 输入 像素颜色 clkd 输出 时钟– 25MHz blu 输出 VGA 蓝色信号 grn 输出 VGA 绿色信号 hs 输出 VGA 行同步信号 red 输出 VGA 红色信号 vs 输出 VGA 同步信号 vid 输出 激活tetrix 显示元件 text

输出 激活文本显示元件

图8.8 VGA 接口模块符号

0,0

hc

800,0

vc

0,521

800,521

图8.9 显示窗口坐标

生俄罗斯方块的蓝色边界。

8.2.4 图像显示模块设计

该模块是显示控制模块。表8.4给出了图像显示模块的信号定义,图8.10给出了图像显示模块的符号。

表8.4 图像显示模块信号定义

该模块产生俄罗斯方块的像素颜色,这些像素颜色将送到VGA 显示模块。该模块被输入的”vid ”输入信号激活,该模块的主时钟为25MHz 。如图8.11,”crx ”和”cry ”输出与BRAM 连接作为BRAM 的地址输入,”rect ”和BRAM 数据输出连接。

使用了2个计数器(cx0->9和cy0->19)与”crx ”和”cry ”输出连接。使用这些计数器将从BRAM 中读取关于俄罗斯方块的数据。每个地址将返回那个块的4位数据(rect(3:0)),俄罗斯方块的每个块需要16x16像素来画屏幕。为了确定所需要送出的像素,”nrpix ”(0>15)是列数,”line ”(0>15)是行数。

每个像素使用”rect ”,”nrpix ”和”linie ”信号值进行计算。图8.12给出了计算的过程。

信号 模式 功能描述

clkdiv 输入 主时钟输入

rect(3:0) 输入 BRAM 数据输出

mclk 输入 时钟– 50MHz, 用于绘制更多颜色

Vid 输入 使能输出 –使能元件

pixel(2:0) 输出 像素颜色 crx(4:0) 输出 BRAM 地址输入 cry(4:0)

输出

BlockRAM 地址输入

图8.11 方块边界计算

8.2.5 文本显示模块设计

该模块生成文本像素信息。表8.5给出了文本显示模块设计,图8.13给出了文本显示模块的符号。

表8.5 文本显示模块信号定义

该模块用来产生必要的像素来画文本框内的字符。使用”text ”信号来激活该元件。该模块的主时钟clkd 是25MHz 。”crx ”和”cry ”输出和BRAM 相连,作为其地址输入,”car ”与BRAM

相连作为其数据输出。文本框的BRAM 包含了512x8比特的数据,这些数据将显示在屏幕上作为一个32x16的字符点阵。该模块与俄罗斯方块显示模块非常类似。不同的是,该模块使用了2种颜色(黑和白),每个字符的表格被保存。

如图8.14,为了画一个字符,需要8x8的像素。使用”nrpix ”和”line ”来访问正确的存储器地址。如果地址中有’1’存在,则发送白色(pix=”111”)到VGA 模块,否则

发送黑色(pix=”000”)。

这里使用了两种不同的字符产生器。

信号 模式 功能描述

clkd 输入 主时钟输入

(25MHz) car(7:0) 输入 BRAM 数据输出 text 输入 使能输入- 使能元件

pix(2:0) 输出 像素颜色 crx(4:0) 输出 BRAM 地址输入 cry(3:0)

输出

BRAM 地址输入

图8.12 像素的计算

图8.14 字符的点阵

1)在寄存器中存储字符表格;

2)在BRAM中存储字符表格;

该模块可以重复使用,推荐使用第2种方法来保存字符表。

8.2.5.1 使用寄存器的文本显示

图8.15给出使用寄存器保存文本字符A的描述方式。

图8.15 使用寄存器的文字A描述方式

这种方法容易实现,但是会消耗大量的逻辑资源而产生其它问题。

8.2.5.2 使用BRAM的文本显示

该模块使用了512x8的BRAM来保存字符表。一个BRAM能保存64个不同的字符,资源的使用率不取决于字符的数量。在该设计中使用了2个BRAM,只需要”car”输入信号的其中7位。下面给出了ram的一段初始化值。

generic map (

-- 1 0 INIT_00 => X"0000000000000000000000000000000000000000000000000000000000000000", -- 3 2 INIT_01 => X"0000000000000000000000000000000000000000000000000000000000000000", -- 5 4 INIT_02 => X"0000000000000000000000000000000000000000000000000000000000000000", -- 7 6 INIT_03 => X"00000000000000000000000000EEEC00000000000000000000000000000CCCCC", -- 9 8 INIT_04 => X"0000000000000000000000000AEEEC0000000000000000000000000AAAAAEC00", -- 11 10 INIT_05 => X"0000000000000000000000000AEEE0DD0000000000000000000000000A00EC00",

-- 13 12 INIT_06 => X"0000000000000000000000F0000F00DD0000000000000000000000000A000D0D", -- 15 14 INIT_07 => X"00000000000000000000000F0F09D00D0000000000000000000000F000F90D0D", -- 17 16 INIT_08 => X"00000000000000000000000F0F090000000000000000000000000000F0090000", -- 19 18 INIT_09 => X"0000000000000000000000F0000F00000000000000000000000000F000F90000", INIT_0A => X"0000000000000000000000000000000000000000000000000000000000000000", INIT_0B => X"0000000000000000000000000000000000000000000000000000000000000000", INIT_0C => X"0000000000000000000000000000000000000000000000000000000000000000", INIT_0D => X"0000000000000000000000000000000000000000000000000000000000000000", INIT_0E => X"0000000000000000000000000000000000000000000000000000000000000000", INIT_0F => X"0000000000000000000000000000000000000000000000000000000000000000") 为了更好的理解以上的描述,图8.16给出了描述步骤:

8.2.6 得分统计模块设计

该模块为得分统计模块,生成的文本信息存入双口的SRAM ,交由后端显示模块调用。 表8.6给出了得分统计模块的信号定义。图8.17给出了得分统计模块的符号。

该模块有8个寄存器,用于保存最高的分数和当前游戏的分数。”cl ”信号表示需要给当前的游戏将加一个点。”ng ”信号表明新的游戏已经开始,在这种情况下,要测试当前的分

图8.16 字符的描述过程

是否超过最高分,如果超过的话,将当前游戏的分数复制给最高分。

表8.6得分统计模块信号定义

8.2.7 游戏控制模块设计

该模块是整个程序的核心模块,通过状态机的形式对程序的运行状态进行切换和控制。表8.7给出游戏控制模块信号定义。图8.18给出游戏控制模块符号。

表8.7 游戏控制模块信号定义

通过与kbfilter 模块连接的”sseg ”和”an ”输入,该模块使用”sseg ”控制游戏的所有步骤。使用”

cl ”和”ng ”输出信号和”speed ”输入信号和得分统计模块通信。其它信号用来和俄罗斯方块BRAM 通信。该模块使用了一个庞大的状态机来控制,几乎每个状态都有子状态。图8.19给出了状态图的描述。表8.8给出了各个状态的功能。

每一片由4块组成,这些块保存在8寄存器中。 1)- x 坐标 : p1x, p2x, p3x, p4x 2)- y 坐标 : p1y, p2y, p3y, p4y

该设计使用寄存器来存储片颜色,其它寄存器存储片的配置信息。需要这些寄存器来指导如何旋转这些片,当片被旋转后,寄存器将得到新的代码。

信号 模式 功能描述 mclk 输入 主时钟输入 cl 输入 计数线 ng 输入 新游戏 car(7:0) 输出 BRAM 数据输入 crx(4:0) 输出 BRAM 地址输入 cry(3:0) 输出 BRAM 地址输入

speed(1:0) 输出 游戏速度 wen

输出

BRAM 写使能

信号 模式 功能描述 mclk 输入 主时钟输入 an 输入 报警 sseg(7:0) 输入 键盘扫描码 speed(1:0) 输入 游戏速度 rectin(3:0) 输入 BRAM 数据输入 crx(4:0) 输出 BRAM 地址输入 cry(3:0) 输出 BRAM 地址输入 rectout (3:0)

输出 BRAM 数据输入

cl 输出 计数线 ng 输出 新游戏 Wen

输出

BRAM 写使能

图8.18 游戏控制模块符号

表8.8 各个状态的功能

代码状态Description

0000 stop 当F1键按下时,状态机将跳转到当前状态。这个状态没有任何逻辑行为;当F2按键按下时,状态机将转移到下一个状态。

0011 reset

使用两个计数器来访问俄罗斯方块的BRAM,写”0000”代码(表示目前BRAM没有任何东西)

“makex”将从0-9计数,”makey”将从0-19计数。每当”makex”到达9后,将返回0,同时”makey”递增1。

0010 initiate 读”random”和”color”信号来选择随机的俄罗斯方块片和它的颜色。

图8.19状态图的描述

0111 wait

等待”cntClk”信号到达所选择的值,然后跳转到”test_down”状态或从键盘读取命令。

0110 test_down

测试俄罗斯方块是否到达底部或者在该片下是否有其它模块,在那种情况下,下个状态将是”test_stop”,否则将跳转到”step_down”状态。

0001 test_stop 如果一个片的y坐标为”0001”,则游戏停止,将跳转到”stop”状态。

1111 del_rows

使用和”reset”状态下一样的步骤,它将访问几乎所有的块来寻找填充行。当找到一个填充行时,将跳转到”copy”子状态,该状态将移动上面的行,其位置下降。对于这种状态,重睹下面的步骤,读一个块的包含,并且复制它到底下的块。

1000 step_down 将删除片,并且缩减一个位置

1110 test_left

测试是否俄罗斯方块达到最左边的位置,或者附近有其它片;在那种情况下,下一个状态将是”wait”,否则将跳转到”step_left”状态。

1010 step_left 当删除片,并且向左缩减重画。

1101 Test_right

测试是否俄罗斯方块达到最右边的位置,或者附近有其它片;在那种情况下,下一个状态将是”wait”,否则将跳转到”step_right”状态。

1001 step_right 当删除片,并且向右缩减重画。

1011 test_rotate 测试俄罗斯方块能否旋转。

1100 rotate 当删除片,并且在旋转的位置重画。

8.3 设计实现和验证

1.打开ISE10.1,新建工程tetrix,设计参数选择:芯片选择Spartan3E XC3S1200E-4FG320,顶层设计选择HDL,仿真器选项选择Xilinx ISE Simulator。

2.新建名字为kv2vhdl,类型为VHDL module的设计文件,完成设计代码输入。

3.新建名字为display,类型为VHDL module的设计文件,完成设计代码输入。

4.新建名字为text_display,类型为VHDL module的设计文件,完成设计代码输入。

5.新建名字为counter,类型为VHDL module的设计文件,完成设计代码输入。

6.新建名字为score,类型为VHDL module的设计文件,完成设计代码输入。

7.新建名字为gamecontrol,类型为VHDL module的设计文件,完成设计代码输入。

8.新建名字为vga,类型为VHDL module的设计文件,完成设计代码输入。

9.新建文件名为tetrix,类型为Implementation Constraints File用户约束文件tetrix.ucf。使用Nexys2使用Nexys2板卡上50MHz时钟作为mclk输入,PS/2时钟和数据接口信号作为PS2C和PS2D输入,hsync,vsync,red,green,blue分别和VGA接口的行同步、垂直同步、红色、绿色和蓝色信号连接。按照板子设计在tetrix.ucf文件完成引脚位置约束,保存并关闭该文件。

10.在管理窗口中双击Implement Design选项,完成设计实现;

11.在管理窗口中右键点击Generate Programming File,选择属性Properities,在Startup Option标签栏中的FPGA Startup Clock选择JTAG。

12.在管理窗口中双击Generate Programming File,生成比特流文件;

13.Nexys2板上电,并且将其PS/2接口和键盘连接,VGA接口和VGA显示器连接。

14.在管理窗口中双击Configure Target Device,出现配置界面,选择配置文件并下载到芯片中,确认下载成功。

15.对设计进行调试和验证。

8.4 设计代码

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

use IEEE.STD_LOGIC_ARITH.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL;

Library UNISIM;

use UNISIM.vcomponents.all;

entity tetrix is --端口声明

Port ( mclk : in std_logic;

kd : in std_logic;

kc : in std_logic;

hs : out std_logic;

vs : out std_logic;

red, grn, blu : out std_logic

);

end tetrix;

architecture Behavioral of tetrix is –元件声明

component vga is

Port( mclk : in std_logic;

pix : in std_logic_vector(2 downto 0);

hs : out std_logic;

vs : out std_logic;

red, grn, blu : out std_logic;

text,vid,clkd : out std_logic);

end component;

component keyboardVhdl is

Port ( CLK, RST, KD, KC : in std_logic;

an : out std_logic;

sseg : out std_logic_vector (7 downto 0)); end component;

component kbfilter is

Port( mclk : in std_logic;

an : in std_logic;

ssegin : in std_logic_vector (7 downto 0);

send : out std_logic;

ssegout : out std_logic_vector (7 downto 0)

);

end component;

component text_display is

Port( clkd : in std_logic;

texton : in std_logic;

car :in std_logic_vector(7 downto 0);

crx :out std_logic_vector(4 downto 0);

cry :out std_logic_vector(3 downto 0);

pix :out std_logic_vector(2 downto 0));

end component;

component score is

Port( mclk :in std_logic;

ng :in std_logic;

cl :in std_logic;

speed :out std_logic_vector(1 downto 0);

wen :out std_logic;

car :out std_logic_vector(7 downto 0);

crx :out std_logic_vector(4 downto 0);

cry :out std_logic_vector(3 downto 0)

);

end component;

component display is

Port( mclk : in std_logic;

clkdiv : in std_logic;

vidon : in std_logic;

rect : in std_logic_vector(3 downto 0);

pixel :out std_logic_vector(2 downto 0);

crx :out std_logic_vector(4 downto 0);

cry :out std_logic_vector(4 downto 0) );

end component;

component gamecontrol is

Port( mclk : in std_logic;

an : in std_logic;

sseg : in std_logic_vector (7 downto 0);

rectin : in std_logic_vector(3 downto 0);

speed : in std_logic_vector(1 downto 0);

ng :out std_logic;

cl :out std_logic;

wen :out std_logic;

rectout :out std_logic_vector(3 downto 0);

crx :out std_logic_vector(4 downto 0);

cry :out std_logic_vector(4 downto 0) );

end component;

--信号声明

signal pix : std_logic_vector(2 downto 0):="000"; signal pixtetrix : std_logic_vector(2 downto 0):="000";

signal pixtext : std_logic_vector(2 downto 0):="000"; signal spd : std_logic_vector(1 downto 0):="00"; signal texton : std_logic:='0';

signal clkdiv : std_logic:='0';

signal vidon : std_logic:='0';

signal newgame : std_logic:='0';

signal countline : std_logic:='0';

--存储器信号声明

signal DOB : std_logic_vector(3 downto 0):="0000";

signal DOA : std_logic_vector(3 downto 0):="0000";

signal DIA : std_logic_vector(3 downto 0):="0000";

signal ADDRB : std_logic_vector(9 downto 0):="0000000000";

signal ADDRA : std_logic_vector(9 downto 0):="0000000000";

signal WEA : std_logic:='0';

signal DOBt : std_logic_vector(7 downto 0):="00000000";

signal DOAt : std_logic_vector(7 downto 0):="00000000";

signal DIAt : std_logic_vector(7 downto 0):="00000000";

signal ADDRBt : std_logic_vector(8 downto 0):="000000000";

signal ADDRAt : std_logic_vector(8 downto 0):="000000000";

signal WEAt : std_logic:='0';

--键盘信号声明

signal ssegkb : std_logic_vector(7 downto 0):="00000000";

signal ankb : std_logic:='0';

signal ssegkbnext : std_logic_vector(7 downto 0):="00000000";

signal send : std_logic:='0';

begin

--模块例化

monitor: vga

Port map( mclk=>mclk, =>pix, hs=>hs, vs=>vs, red=>red, grn=>grn,

blu=>blu, text=>texton, vid=>vidon, clkd=>clkdiv);

keyboard: keyboardVhdl

port map(CLK => mclk, RST => '0', KD => kd, KC => kc, an => ankb,

sseg => ssegkb)

kbf: kbfilter

port map(mclk => mclk, an => ankb, ssegin => ssegkb, send => send,

ssegout => ssegkbnext);

tetrix_display: display

port map(mclk => mclk, clkdiv => clkdiv, vidon => vidon, rect => DOB, crx => ADDRB(4 downto 0), cry => ADDRB(9 downto 5),

pixel => pixtetrix);

textdisplay: text_display

port map( clkd => clkdiv, texton => texton, car => DOBt,

crx => ADDRBt(4 downto 0), cry => ADDRBt(8 downto 5),

pix => pixtext);

score_controll: score

port map( mclk => clkdiv, ng => newgame, cl => countline, speed => spd,

wen => WEAt, car => DIAt, crx => ADDRAt(4 downto 0),

cry => ADDRAt(8 downto 5));

tetrix_gamecontrol: gamecontrol

port map( mclk => mclk, an => send, sseg => ssegkbnext, rectin => DOA,

speed => spd, ng => newgame, cl => countline, wen => WEA,

rectout => DIA, crx => ADDRA(4 downto 0),

cry => ADDRA(9 downto 5));

-- tetrix's BlockRAM

RAMB4_S4_S4_inst : RAMB4_S4_S4

generic map (

-- 1 0 INIT_00 => X"0000000000000000000000000000000000000000000000000000000000000000",

-- 3 2 INIT_01 => X"0000000000000000000000000000000000000000000000000000000000000000",

-- 5 4 INIT_02 => X"0000000000000000000000000000000000000000000000000000000000000000",

-- 7 6 INIT_03 =>

X"00000000000000000000000000EEEC00000000000000000000000000000CCCCC", -- 9 8 INIT_04 =>

X"0000000000000000000000000AEEEC0000000000000000000000000AAAAAEC00 ",

-- 11 10 INIT_05 =>

X"0000000000000000000000000AEEE0DD0000000000000000000000000A00EC00", -- 13 12 INIT_06 =>

X"0000000000000000000000F0000F00DD0000000000000000000000000A000D0D", -- 15 14 INIT_07 =>

X"00000000000000000000000F0F09D00D0000000000000000000000F000F90D0D", -- 17 16 INIT_08 =>

X"00000000000000000000000F0F090000000000000000000000000000F0090000", -- 19 18 INIT_09 =>

X"0000000000000000000000F0000F00000000000000000000000000F000F90000",

INIT_0A => X"0000000000000000000000000000000000000000000000000000000000000000", INIT_0B => X"0000000000000000000000000000000000000000000000000000000000000000", INIT_0C => X"0000000000000000000000000000000000000000000000000000000000000000", INIT_0D => X"0000000000000000000000000000000000000000000000000000000000000000", INIT_0E => X"0000000000000000000000000000000000000000000000000000000000000000", INIT_0F => X"0000000000000000000000000000000000000000000000000000000000000000") port map (

DOA => DOA, -- Port A 4-bit data output

DOB => DOB, -- Port B 4-bit data output

ADDRA => ADDRA, -- Port A 10-bit address input

ADDRB => ADDRB, -- Port B 10-bit address input

CLKA => mclk, -- Port A clock input

CLKB => mclk, -- Port B clock input

DIA => DIA, -- Port A 4-bit data input

DIB => "0000", -- Port B 4-bit data input

ENA => '1', -- Port A RAM enable input

ENB => '1', -- Port B RAM enable input

RSTA => '0', -- Port A Synchronous reset input

RSTB => '0', -- Port B Synchronous reset input

WEA => WEA, -- Port A RAM write enable input

WEB => '0' -- Port B RAM write enable input

);

--------------------------------------------------------------------

--textbox's BlockRAM

RAMB4_S8_S8_inst : RAMB4_S8_S8

generic map (

INIT_00 => X"0007040404040404040404040404040404040404040404040404040404040401",

-- F1 - STOP GAME

INIT_01 =>

X"0007000000000000000000000000000000243A1C34004D442C1B004E00162B07", -- F2 - NEW GAME

INIT_02 =>

X"000700000000000000000000000000000000243A1C34001D2431004E001E2B07", -- A - MOVE LEFT

INIT_03 =>

X"0007000000000000000000000000000000002C2B244B00242A443A004E001C07", -- D - MOVE RIGHT

INIT_04 =>

X"00070000000000000000000000000000002C3334432D00242A443A004E002307", -- SPACE - ROTATE

INIT_05 =>

X"0007000000000000000000000000000000242C1C2C442D004E0024211C4D1B07", -- S - SPEED

INIT_06 => X"000700000000000000000000000000000000000000002324244D1B004E001B07", -- TOP SCORE

INIT_07 => X"00070000000000000000000000000000000000000000242D44211B004D442C07", -- YOUR SCORE

INIT_08 => X"000700000000000000000000000000000000000000242D44211B002D3C443507", INIT_09 => X"0007000000000000000000000000000000000000000000000000000000000007", INIT_0A => X"0007000000000000000000000000000000000000000000000000000000000007", INIT_0B => X"0007000000000000000000000000000000000000000000000000000000000007", INIT_0C => X"0007000000000000000000000000000000000000000000000000000000000007", INIT_0D => X"0007000000000000000000000000000000000000000000000000000000000007",

INIT_0E => X"0007000000000000000000000000000000000000000000000000000000000007", INIT_0F => X"0007050505050505050505050505050505050505050505050505050505050503") port map (

DOA => DOAt, -- Port A 8-bit data output

DOB => DOBt, -- Port B 8-bit data output

ADDRA => ADDRAt, -- Port A 9-bit address input

ADDRB => ADDRBt, -- Port B 9-bit address input

CLKA => mclk, -- Port A clock input

CLKB => clkdiv, -- Port B clock input

DIA => DIAt, -- Port A 8-bit data input

DIB => "00000000", -- Port B 8-bit data input

ENA => '1', -- Port A RAM enable input

ENB => '1', -- Port B RAM enable input

RSTA => '0', -- Port A Synchronous reset input

RSTB => '0', -- Port B Synchronous reset input

WEA => WEAt, -- Port A RAM write enable input

WEB => '0' -- Port B RAM write enable input

);

-- Selecting from which component to read the pixel:

-- tetrix or text display

pix<= pixtetrix when vidon='1' else pixtext;

end Behavioral;

编译原理课程设计

《编译原理》课程设计大纲 课程编号: 课程名称:编译原理/Compiler Principles 周数/学分:1周/1学分 先修课程:高级程序设计语言、汇编语言、离散数学、数据结构 适用专业:计算机科学与技术专业、软件工程专业 开课学院,系或教研室:计算机科学与技术学院 一、课程设计的目的 课程设计是对学生的一种全面综合训练,是与课堂听讲、自学和练习相辅相成的必不可少的一个教学环节。通常,设计题中的问题比平时的练习题要复杂,也更接近实际。编译原理这门课程安排的课程设计的目的是旨在要求学生进一步巩固课堂上所学的理论知识,深化理解和灵活掌握教学内容,选择合适的数据逻辑结构表示问题,然后编制算法和程序完成设计要求,从而进一步培养学生独立思考问题、分析问题、解决实际问题的动手能力。 要求学生在上机前应认真做好各种准备工作,熟悉机器的操作系统和语言的集成环境,独立完成算法编制和程序代码的编写。 设计时间: 开发工具: (1) DOS环境下使用Turbo C; (2) Windows环境下使用Visual C++ 。 (3) 其它熟悉语言。 二、课程设计的内容和要求 设计题一:算术表达式的语法分析及语义分析程序设计。 1.目的

通过设计、编制、调试一个算术表达式的语法及语义分析程序,加深对语法及语义分析原理的理解,并实现词法分析程序对单词序列的词 法检查和分析。 2.设计内容及要求: 算术表达式的文法: 〈无符号整数〉∷= 〈数字〉{〈数字〉} 〈标志符〉∷= 〈字母〉{〈字母〉|〈数字〉} 〈表达式〉∷= [+|-]〈项〉{〈加法运算符〉〈项〉} 〈项〉∷= 〈因子〉{〈乘法运算符〉〈因子〉} 〈因子〉∷= 〈标志符〉|〈无符号整数〉|‘(’〈表达式〉‘)’ 〈加法运算符〉∷= +|- 〈乘法运算符〉∷= *|/ (1) 分别选择递归下降法、算符优先分析法(或简单优 先法)完成以上任务,中间代码选用逆波兰式。 (2) 分别选择LL(1)、LR法完成以上任务,中间代码选 用四元式。 (3) 写出算术表达式的符合分析方法要求的文法,给出 分析方法的思想,完成分析程序设计。 (4) 编制好分析程序后,设计若干用例,上机测试并通 过所设计的分析程序。 设计题二:简单计算器的设计 1.目的 通过设计、编制、调试一个简单计算器程序,加深对语法及语 义分析原理的理解,并实现词法分析程序对单词序列的词法检 查和分析。 2.设计内容及要求 算术表达式的文法:

混凝土结构设计原理试题与答案

一、概念选择题(均为单选题,答案请填写在答题卡上,每小题1分,总共40分) 1.如果混凝土的强度等级为C50,则以下说法正确的是:()A.抗压强度设计值f c=50MP a;B.抗压强度标准值f ck=50MP a; C.立方体抗压强度标准值f cu,k=50MP a;D.抗拉强度标准值f tk=50MP a。2.混凝土强度等级是根据150mm×150 mm×150 mm的立方体抗压试验,按:( ) A.平均值μf cu确定;B.μf cu-1.645σ确定;C.μf cu-2σ确定;D.μf cu-σ确定。3.减少混凝土徐变可采用的措施有:()A.增加水泥用量; B 蒸汽养护混凝土; C 提早混凝土的加荷龄期; D 增加水用量。4.以下关于混凝土收缩,正确的说法是:()(1)收缩随时间而增长(2)水泥用量愈小,水灰比愈大,收缩愈大 (3)骨料弹性模量大级配好,收缩愈小(4)环境湿度愈小,收缩也愈小 (5)混凝土收缩会导致应力重分布 A.(1)、(3)、(5);B.(1)、(4);C.(1)~(5);D.(1)、(5)。 5. 高碳钢筋采用条件屈服强度,以σ0.2表示,即:() A.取极限强度的20 %;B.取应变为0.002 时的应力; C.取应变为0.2 时的应力;D.取残余应变为0.002 时的应力。 6.检验软钢性能的指标有:()(1)屈服强度(2)抗拉强度(3)伸长率(4)冷弯性能 A.(1)~(4);B.(1)~(3);C.(2)~(3);D.(2)~(4)。7.对于热轧钢筋(如HRB335),其强度标准值取值的依据是:()A.弹性极限强度;B.屈服极限强度;C.极限抗拉强度;D.断裂强度。8.钢筋与混凝土这两种性质不同的材料能有效共同工作的主要原因是:()A.混凝土能够承受压力,钢筋能够承受拉力; B.两者温度线膨系数接近; C.混凝土对钢筋的保护; D.混凝土硬化后,钢筋与混凝土之间产生了良好的粘结力,且两者温度线膨系数接近 9.关于设计值和标准值,以下说法正确的是:()A.材料强度设计值大于其标准值,荷载设计值小于其标准值; B.材料强度设计值小于其标准值,荷载设计值大于其标准值; C.材料强度设计值等于其标准值,荷载设计值等于其标准值;

俄罗斯方块软件需求规格说明书

软件需求规格说明书 1306401-35 王正 一、引言 1.1编写目的 通过本游戏的设计,综合自己在校期间所学的理论知识,设计开发俄罗斯广场游戏,使自己熟应用系统的开发过程,培养独立思考能力,检验学习效果和动手能力,初步掌握软件工程的系统理论,进一步巩固和加强自身对编程语言知识的理解,提高自己的编程水平,从而达到理论与实践相结合的目的。 1.2项目背景 游戏是人们活动中一项非常重要的内容,有人认为如果哪一天人类对所有的游戏都失去兴趣,恐怕世界的末日就要到了。电脑对游戏的贡献有目共睹,现在摸索电脑的人很少没玩过电脑游戏的,喜欢游戏的人也很少不玩电脑的。 俄罗斯方块是一款风靡全球的电视游戏机和掌上游戏机游戏,它曾经造成的轰动与造成的经济价值可以说是游戏史上的一件大事。俄罗斯方块最早还是出现在PC机上,而我国的用户都是通过红白机了解、喜欢上它的。随着计算机的发展而发展,俄罗斯方块不断推陈出新,深爱广大玩家喜爱。这个游戏有的简单,有的复杂,但其根本原理是一样的都是对运动的方块进行组合,

来训练玩家的反应能力。因此开发此游戏软件可满足人们的一些娱乐的需求。 此俄罗斯方块游戏可以为用户提供一个可在普通个人电脑上运行的,界面美观的,易于控制的俄罗斯方块游戏。 此次需要开发一项软件,在通过认真的考虑之后,决定做一个“俄罗斯方块”,对于我个人来说,这是一个相当具有挑战性的任务,也是一次不错的锻炼机会。 1.3定义 (1)游戏区:玩家可以在游戏区中堆积方块,并能够在游戏过程中随时了解得分情况。 (2)游戏控制:玩家可以通过游戏控制功能来选择开始新的一局游戏,暂停或退出游戏。 (3)级别设置:玩家可以根据自己的需要自行设定游戏的开始级别,级别越高,游戏的速度越快,难度越大。 1.4参考资料 [1]朱福喜著,JAVA程序设计技巧与开发实例[M] 北京:人民邮电出版社,2004.2 [2] 张海藩软件工程(第五版) 北京:清华大学出版社,2008

编译原理课程设计报告(一个完整的编译器)

编译原理程序设计报告 一个简单文法的编译器的设计与实现专业班级:计算机1406班 组长姓名:宋世波 组长学号: 20143753 指导教师:肖桐 2016年12月

设计分工 组长学号及姓名:宋世波20143753 分工:文法及数据结构设计 词法分析 语法分析(LL1) 基于DAG的中间代码优化 部分目标代码生成 组员1学号及姓名:黄润华20143740 分工:中间代码生成(LR0) 部分目标代码生成 组员2学号及姓名:孙何奇20143754 分工:符号表组织 部分目标代码生成

摘要 编译器是将便于人编写,阅读,维护的高级计算机语言翻译为计算机能解读、运行的低阶机器语言的程序。编译是从源代码(通常为高阶语言)到能直接被计算机或虚拟机执行的目标代码(通常为低阶语言或机器语言)的翻译过程。 一.编译器的概述 1.编译器的概念 编译器是将便于人编写,阅读,维护的高级计算机语言翻译为计算机能解读、运行的低阶机器语言的程序。编译器将原始程序作为输入,翻译产生使用目标语言的等价程序。源代码一般为高阶语言如Pascal、C++、Java 等,而目标语言则是汇编语言或目标机器的目标代码,有时也称作机器代码。 2.编译器的种类 编译器可以生成用来在与编译器本身所在的计算机和操作系统(平台)相同的环境下运行的目标代码,这种编译器又叫做“本地”编译器。另外,编译器也可以生成用来在其它平台上运行的目标代码,这种编译器又叫做交叉编译器。交叉编译器在生成新的硬件平台时非常有用。“源码到源码编译器”是指用一种高阶语言作为输入,输出也是高阶语言的编译器。例如: 自动并行化编译器经常采用一种高阶语言作为输入,转换其中的代码,并用并行代码注释对它进行注释(如OpenMP)或者用语

《结构设计原理》试卷和答案

《结构设计原理》试题1 一、单项选择题 1.配螺旋箍筋的钢筋混凝土柱,其其核心混凝土抗压强度高于单轴混凝土抗压强度是因为【 C 】 A. 螺旋箍筋参与混凝土受压 B. 螺旋箍筋使混凝土密实 C. 螺旋箍筋横向约束了混凝土 D. 螺旋箍筋使纵向钢筋参与受压更强 2.钢筋混凝土轴心受拉构件极限承载力N u有哪项提供【 B 】 A. 混凝土 B. 纵筋 C. 混凝土和纵筋 D. 混凝土、纵筋和箍筋 3.混凝土在空气中结硬时其体积【 B 】 A. 膨胀 B. 收缩 C. 不变 D. 先膨胀后收缩 4.两根适筋梁,其受拉钢筋的配筋率不同,其余条件相同,正截面抗弯承载力M u【 A 】 A. 配筋率大的,M u大 B. 配筋率小的,M u大 C. 两者M u相等 D. 两者M u接近 5.钢筋混凝土结构中要求钢筋有足够的保护层厚度是因为【 D 】 A. 粘结力方面得考虑 B. 耐久性方面得考虑 C. 抗火方面得考虑 D. 以上3者 6.其他条件相同时,钢筋的保护层厚度与平均裂缝间距、裂缝宽度(指构件表面处)的关系是【 A 】 A. 保护层愈厚,平均裂缝间距愈大,裂缝宽度也愈大 B. 保护层愈厚,平均裂缝间距愈小,裂缝宽度也愈小 C. 保护层愈厚,平均裂缝间距愈小,但裂缝宽度愈大 D. 保护层厚度对平均裂缝间距没有影响,但保护层愈厚,裂缝宽度愈大 7.钢筋混凝土梁截面抗弯刚度随荷载的增加以及持续时间增加而【 B 】 A. 逐渐增加 B. 逐渐减少 C. 保持不变 D. 先增加后减少 8.减小预应力钢筋与孔壁之间的摩擦引起的损失σs2的措施是【 B 】 A. 加强端部锚固 B. 超张拉 C. 采用高强钢丝 D. 升温养护混凝土 9.预应力混凝土在结构使用中【 C 】 A. 不允许开裂 B. 根据粘结情况而定 C. 有时允许开裂,有时不允许开裂 D. 允许开裂 10.混凝土结构设计中钢筋强度按下列哪项取值【 D 】 A. 比例极限 B. 强度极限 C. 弹性极限 D. 屈服强度或条件屈服强度 二、填空题 11. 所谓混凝土的线性徐变是指徐变变形与初应变成正比。 12. 钢筋经冷拉时效后,其屈服强度提高,塑性减小,弹性模量减小。 13. 在双筋矩形截面梁的基本公式应用中,应满足下列适用条件:①ξ≤ξb;②x≥2a’,其中,第①条是为了防止梁破坏时受拉筋不屈服;第②条是为了防止压筋达不到抗

(重庆理工大学计算机学院)编译原理课程设计报告

编译原理课程设计报告 实验名称编译原理课程设计 班级 学号 姓名 指导教师 实验成绩 2013 年06月

一、实验目的 通过设计、编写和调试,将正规式转换为不确定的有穷自动机,再将不确定的有穷自动机转换为与之等价的确定的有穷自动机,最后再将确定有穷自动机进行简化。 通过设计、编写和调试构造LR(0)项目集规范簇和LR分析表、对给定的符号串进行LR分析的程序,了解构造LR(0)分析表的步骤,对文法的要求,能够从文法G出发生成LR(0)分析表,并对给定的符号串进行分析。 二、实验内容 正规式——>NFA——>DFA——>MFA 1.正规式转化为不确定的有穷自动机 (1)目的与要求 通过设计、编写和调试将正规式转换为不确定的有穷自动机的程序,使学生了解Thompson算法,掌握转换过程中的相关概念和方法,NFA的表现形式可以是表格或图形。 (2)问题描述 任意给定一个正规式r(包括连接、或、闭包运算),根据Thompson算法设计一个程序,生成与该正规式等价的NFA N。 (3)算法描述 对于Σ上的每个正规式R,可以构造一个Σ上的NFA M,使得L(M)=L(R)。 步骤1:首先构造基本符号的有穷自动机。 步骤2:其次构造连接、或和闭包运算的有穷自动机。

(4)基本要求 算法实现的基本要求是: (1) 输入一个正规式r; (2) 输出与正规式r等价的NFA。(5)测试数据 输入正规式:(a|b)*(aa|bb)(a|b)* 得到与之等价的NFA N

(6)输出结果 2.不确定的有穷自动机的确定化 (1)目的与要求 通过设计、编写和调试将不确定的有穷自动机转换为与之等价的确定的有穷自动机的程序,使学生了解子集法,掌握转换过程中的相关概念和方法。DFA的表现形式可以是表格或图形。(2)问题描述 任意给定一个不确定的有穷自动机N,根据算法设计一个程序,将该NFA N变换为与之等价的DFA D。 (3)算法描述 用子集法将NFA转换成接受同样语言的DFA。 步骤一:对状态图进行改造 (1) 增加状态X,Y,使之成为新的唯一的初态和终态。从X引ε弧到原初态结点, 从原终态结 点引ε弧到Y结点。 (2) 对状态图进一步进行如下形式的改变

编译原理课程设计

编译原理课程设计报告 课题名称: C-语言编译器设计(scanner和parser) 提交文档学生姓名: 提交文档学生学号: 同组成员名单:无 指导教师姓名:金军 指导教师评阅成绩: 指导教师评阅意见: . . 提交报告时间: 2011年 6 月 17 日

1.课程设计目标 设计C-Minus编译器分为scanner和parser两个部分。scanner主要作用是对目标代码进行扫描,列出关键字,变量等内容;parser主要对语法进行分析并生成语法树。 2.分析与设计 ●实现方法:代码用C语言编译而成。其中scanner为手工实现,主要采用switch-case结构实现 状态转换;parser部分采用递归下降分析方法实现。 ●扫描器:C-的词法如下: 1、语言的关键字:i f el se i nt return void while 2、专用符号:+ - * /< <= > >= == != =; , ( ) [ ] { } /* */ 3、其他标记是变量(ID)和数字(NUM),通过下列正则表达式定义: ID = letter letter* NUM = di git digi t* letter = a|..|z|A|..|Z digi t = 0|..|9 4、空格由空白、换行符和制表符组成。空格通常被忽略,除了它必须分开ID、NUM关键字 5. 注释用通常的C语言符号/ * . . . * /围起来。注释可以放在任何空白出现的位置(即注释不能放在 标记内)上,且可以超过一行。注释不能嵌套 其DFA图如下:

分析器:以下为C-的语法规则BNF:

混凝土结构设计原理考试试卷B

混凝土结构设计原理考试试卷 (20 07 至20 08 学年第 二 学期 期末)(B 卷) 一、选择:(每小题2分,共24分) 1. 在混凝土应力—应变关系曲线中,( )作为混凝土棱柱体抗压强度f c 。 A. 比例极限 B. 峰值应力点 C. 收敛点 D. 临界点 2. c c c E εσ='的是混凝土的(B )。 A. 弹性模量; B. 割线模量; C. 切线模量; D. 原点切线模量; 3. 剪扭构件的承载力计算公式中( ) A. 混凝土承载力部分考虑了剪扭相关性,钢筋则没考虑; B. 混凝土和钢筋都考虑了剪扭相关性; C. 混凝土和钢筋均没有考虑剪扭相关性; D. 混凝土承载力部分没有考虑剪扭相关性,钢筋考虑了; 4.条件相同的矩形截面梁加配了受压钢筋后,其实际受弯承载力与不配受压钢筋相比( ) A. 仅在x>2a'的情况下提高; B. 仅在x<2a'的情况下提高; C. 不一定提高; D. 肯定提高; 5. T、I形截面剪扭构件可分成矩形块计算,此时( ) A. 由各矩形块分担剪力; B. 剪力全由腹板承担; C. 剪力、扭矩全由腹板承担; D. 扭矩全由腹板承担; 6. 在双筋梁计算中满足2a'≤x ≤ξb h o 时,表明( ) A. 拉筋不屈服,压筋屈服; B. 拉筋屈服,压筋不屈服; C. 拉压筋均不屈服; D. 拉压钢筋均屈服; 7.小偏心受压构件破坏的主要特征是( )。 A. 受拉钢筋及受压钢筋同时屈服,然后压区混凝土压坏 B. 受拉钢筋先屈服,压区混凝土后压坏 C. 压区混凝土压坏,然后受压钢筋受压屈服 D. 压区混凝土压坏,距轴力较远一侧的钢筋不论受拉或受压均未屈服 8.钢筋混凝土轴心受拉构件中,钢筋的级别及配筋率一定时,为减少裂缝的平均宽度m W ,应尽量采用( )。 A. 直径较小的钢筋 B. 直径较大的钢筋 C. 提高混凝土强度等级 D. 多种直径的钢筋 9. 钢筋混凝土构件变形和裂缝验算中关于荷载、材料强度取值说法正确的是( C )。

俄罗斯方块游戏

课程设计说明书 课程名称:高级语言程序设计 设计题目:俄罗斯方块游戏 院部:计算机科学与信息工程学院 学生姓名: 学号: 专业班级:物联网工程 指导教师: 2015年6月 课程设计任务书

目录 一前言 (4) 二需求分析 (4) 三概要设计 (5) 四详细设计 (7) 五改进或增加功能模块说明 (8) 六程序测试 (8) 七课程设计总结 (11) 八致谢 (11) 九参考文献 (12) 十源程序 (12)

俄罗斯方块游戏 一前言 C++程序设计牵涉到面向对象程序设计的理论、C++语言的语法以及算法等3个方面的内容,其中每一方面都包含十分丰富的内容,都可以分别单独成论。显然在一个程序中深入、详细地介绍以上3个方面的知识是不可能的,必须把它们有机地结合起来,综合应用。不同的书对此采取不同的写法,侧重点有所不同,各有道理,也各有优缺点,适合于不同的读者。需要在教学实践中检验,取长补短,不断完善。 作者认为:要进行C++程序设计当然需要了解面向对象程序设计的有关概念,但是本课程毕竟不是一门面向对象程序设计的理论课程,在本书中不是抽象地介绍面向对象程序设计的理论,而是在介绍C++语言的特点和应用过程中自然地引出面向对象程序设计的有关概念,通过C++的编程过程理解面向对象程序设计方法。在介绍程序设计过程中,介绍有关的算法,引导读者思考怎样构造一个算法。编写程序的过程就是设计算法的过程。 要用C++编程序,最基本的要求是正确掌握和运用C++。由于C++语法复杂,内容又多,如果对它缺乏系统的了解,将难以真正应用,编出来的程序将会错误百出,编译出错,事倍功半。本书的做法是全面而系统地介绍C++的主要特点和功能,引导读者由简而繁地学会编写C++程序。有了C++编程的初步基础后,再进一步提高,掌握更多更深入的算法。这样的方法可能符合大多数学习者的情况,降低了学习难度。 程序设计是一门实践性很强的课程,只靠听课和看书是学不好的。衡量学习好坏的标准不是“懂不懂”,而是“会不会干”。因此必须强调多编程,多上机实践。考虑到不同学校、不同专业、不同读者对学习C++有不同的要求。 二需求分析 1 要求 (1)用C语言实现程序设计;

编译原理课程设计

编译原理课程设计 自顶向下语法分析器 学院(系):计算机科学与技术学院学生姓名:xxxxxxxxx 学号:xxxxxxxxx 班级:电计1102 大连理工大学 Dalian University of Technology

目录

1 系统概论 语法分析是编译过程的核心部分。它的任务是在词法分析识别出单词符号串的基础上,分析并判定程序的语法结构是否符合语法规则。语法分析器在编译程序中的地位如图1所示: 图1 语法分析器在编译程序中的地位 语言的语法结构是用上下文无关文法描述的。因此,语法分析器的工作本质上就是按文法的产生式,识别输入符号串是否为一个句子。这里所说的输入串是指由单词符号(文法的终结符)组成的有限序列。对一个文法,当给你一串(终结)符号时,怎样知道它是不是该文法的一个句子呢?这就要判断,看是否能从文法的开始符号出发推导出这个输入串。或者,从概念上讲,就是要建立一棵与输入串相匹配的语法分析树。 自顶向下分析法就是语法分析办法中的一类。顾名思义,自顶向下就是从文法的开始符号出发,向下推导,推出句子。这种方法是带“回溯”的。 自顶向下分析的主旨是,对任何输入串,试图用一切可能的办法,从文法开始符号(根结)出发,自上而下地为输入串建立一棵语法树。或者说,为输入串寻找一个最左推导。这种分析过程本质上是一种试探过程,是反复使用不同产生式谋求匹配输入串的过程。 实现这种自顶向下的带回溯试探法的一个简单途径是让每个非终结符对应一个递归子程序。每个这种子程序可作为一个布尔过程。一旦发现它的某个候选与输入串相匹配,就用这个候选去扩展语法树,并返回“真”值;否则,保持原来的语法树和IP值不变,并返回“假”值。 2 需求分析 以前,人们对语法的分析都建立在人工的基础上,人工分析虽然能够做到侧类旁推,但终究人力有限,再精密的分析都会出现或多或少的错误。为减少因人为产生的错误,并加快

CMinus词法分析和语法分析设计编译器编译原理课程设计报告书

编译原理课程设计报告 课题名称:C- Minus词法分析和语法分析设计 提交文档学生姓名:X X X 提交文档学生学号:XXXXXXXXXX 同组成员名单:X X X 指导教师姓名:X X 指导教师评阅成绩: 指导教师评阅意见: . . 提交报告时间:2015年6月10日

1.课程设计目标 实验建立C-编译器。只含有扫描程序(scanner)和语法分析(parser)部分。 2.分析与设计 C-编译器设计的整体框架,本实验实现扫描处理和语法分析程序(图中粗黑部分)。 2.1 、扫描程序scanner部分 2.1.1系统设计思想 设计思想:根据DFA图用switch-case结构实现状态转换。 惯用词法:

①语言的关键字:else if int return void while ②专用符号:+ - * / < <= > >= == != = ; , ( ) [ ] { } /* */ ③其他标记是ID和NUM,通过下列正则表达式定义: ID = letter letter* NUM = digit digit* letter = a|..|z|A|..|Z digit = 0|..|9 大写和小写字母是有区别的 ④空格由空白、换行符和制表符组成。空格通常被忽略,除了它必须分开ID、NUM 关键字。 ⑤注释用通常的C语言符号/ * . . . * /围起来。注释可以放在任何空白出现的位置(即注释不能放在标记内)上,且可以超过一行。注释不能嵌套 scanner的DFA

说明:当输入的字符使DFA到达接受状态的时候,则可以确定一个单词了。初始状态设置为START,当需要得到下一个token时,取得次token的第一个字符,并且按照DFA与对此字符的类型分析,转换状态。重复此步骤,直到DONE为止,输出token类型。当字符为“/”时,状态转换为SLAH再判断下一个字符,如果为“*”则继续转到INCOMMENT,最后以“*”时转到ENDCOMMENT状态,表明是注释,如果其他的则是字符停滞于当前字符,并且输出“/”。 2.1.2程序流程图

结构设计原理考试题

《结构设计原理》(上)试题 一、 单项选择题(在每小题的四个备选答案中,选出一个最佳答案,并将其号码填在题干 的括号内) 1.对已处于适筋与超筋界限状态(b ξξ=)的钢筋混凝土单筋矩形截面梁,下列哪种改变将使其成为超筋梁 【 】 A 提高混凝土强度等级 B 加大混凝土截面尺寸 C 增加纵向受拉钢筋 D 增大荷载弯矩 2.T 形截面梁抗弯强度计算中,计算公式明显不同于矩形截面的情况是 【 】 A 第一类T 形截面 B 倒T 形截面(翼缘受拉,梁肋受压) C 第二类T 形截面 D 中性轴位于翼缘与梁肋交界处的T 形截面 3.适筋双筋梁正截面强度破坏时,可能达不到其强度的是 【 】 A 纵向受拉钢筋 B 纵向受压钢筋 C 受拉区混凝土 D 受压区混凝土 4.双筋梁一般计算公式适用条件中,'2s a x ≥是为了保证 【 】 A 纵向受压钢筋达到其设计强度 B 非超筋 C 非少筋 D 适筋 5.混凝土的徐变将影响普通钢筋混凝土梁的 【 】 A 正截面承载力 B 斜截面抗剪承载力 C 斜截面抗弯承载力 D 梁的挠度 6.极限状态法正截面抗弯强度计算所依据的应力阶段是 【 】 A 弹性阶段I B 受拉区混凝土即将开裂阶段I a C 带裂工作阶段II D 破坏阶段III 7.部分预应力是指这样的情况,即预应力度λ为 【 】 A 0=λ B 1=λ C 10<<λ D 1>λ 8.所谓“消压”弯矩是指 【 】 A 该弯矩所产生的应力与预应力在混凝土全截面消压(相互抵消) B 该弯矩所产生的应力与预应力在外荷载弯矩作用下的受压区边缘消压(相互抵消) C 该弯矩所产生的应力与预应力在外荷载弯矩作用下的受拉区边缘消压(相互抵消) D 该弯矩所产生的应力与预应力在中性轴(中和轴)消压(相互抵消) 9.减少摩擦引起的预应力损失的措施? ? 有没 【 】 A 二级升温 B 两端同时张拉 C 涂润滑油 D 采用超张拉 10.后张法分批张拉预应力钢筋时,因混凝土弹性压缩引起的预应力损失最大的是 【 】 A 第一批张拉的预应力钢筋 B 第二批张拉的预应力钢筋 C 倒数第一批张拉的预应力钢筋 D 倒数第二批张拉的预应力钢筋 二、判断改错题(题意正确者,打ˇ即可;题意错误者,先打×,然后将错误处改正确,5小题,每小题5分,共25分) 1.当纵向受拉钢筋弯起时,保证斜截面受弯承载力的构造措施是:钢筋伸过其正截面中的理

编译原理课程设计-词法分析器(附含源代码)

编译原理-词法分析器的设计 一.设计说明及设计要求 一般来说,编译程序的整个过程可以划分为五个阶段:词法分析、语法分析、中间代码生成、优化和目标代码生成。本课程设计即为词法分析阶段。词法分析阶段是编译过程的第一个阶段。这个阶段的任务是从左到右一个字符一个字符地读入源程序,对构成源程序的字符流进行扫描和分解,从而识别出一个个单词(也称单词符号或符号)。如保留字(关键字或基本字)、标志符、常数、算符和界符等等。 二.设计中相关关键字说明 1.基本字:也称关键字,如C语言中的 if , else , while , do ,for,case,break, return 等。 2.标志符:用来表示各种名字,如常量名、变量名和过程名等。 3.常数:各种类型的常数,如12,6.88,和“ABC” 等。 4.运算符:如 + ,- , * , / ,%, < , > ,<= , >= 等。5.界符,如逗点,冒号,分号,括号,# ,〈〈,〉〉等。 三、程序分析 词法分析是编译的第一个阶段,它的主要任务是从左到右逐个字符地对源 程序进行 扫描,产生一个个单词序列,用以语法分析。词法分析工作可以是独立的一遍,把字符流的源程序变为单词序列,输出在一个中间文件上,这个文件做为语法分析程序的输入而继续编译过程。然而,更一般的情况,常将

词法分析程序设计成一个子程序,每当语法分析程序需要一个单词时,则 调用该子程序。词法分析程序每得到一次调用,便从源程序文件中读入一 些字符,直到识别出一个单词,或说直到下一个单词的第一个字符为止。 四、模块设计 下面是程序的流程图 五、程序介绍 在程序当前目录里建立一个文本文档,取名为infile.txt,所有需要分析的程序都写在此文本文档里,程序的结尾必须以“@”标志符结束。程序结果输出在同一个目录下,文件名为outfile.txt,此文件为自动生成。本程序所输出的单词符号采用以下二元式表示:(单词种别,单词自身的值)如程序输出结果(57,"#")(33,"include")(52,"<")(33,"iostream") 等。 程序的功能:(1)能识别C语言中所有关键字(共32个)(单词种别分别为1 — 32 ,详情见程序代码相关部分,下同) (2)能识别C语言中自定义的标示符(单词种别为 33) (3)能识别C语言中的常数(单词种别为0) (4)能识别C语言中几乎所有运算符(单词种别分别为41 — 54) (5)能识别C语言中绝大多数界符(单词种别分别为 55 — 66)六、运行结果 输入文件infile.txt 运行结果(输出文件 outfile.txt)

俄罗斯方块说明

俄罗斯方块单人版

1、需求分析 俄罗斯方块,或称积木游戏,它是利用一些形状各异却又是用正方形组成的方块,经过不同位置不同角度的变化之后,堆积在一起的一种智力游戏。 2、概要设计 而从编程的角度讲,只需要提供各种方块的图形,提供几个键盘操作键以供方块的形状和位置的变化,提供几个功能函数以供游戏的正常进行。 各种方块图形:利用数组定形,然后利用随机函数随机地不按顺序地按游戏的需要而出现。 功能函数将在变量函数里面介绍。

3、详细设计 添加位图: 封面:IDB_BITMAP1 背景:IDB_BITMAP2 方块:IDB_BITMAP4 添加菜单: 开始:ID_MENU_START 接着就是定义变量了,但是,由于这个游戏要添加的变量和函数太多了,要建一个新类。 是否应该先添加应该类呢?最好是这样。因为新类将会涉及到变量。 添加普通类Crussia,见下图。 图4-1-1 添加变量函数: 由于两个类一共有很多变量函数,列举如下:

View.h : Public: //俄罗斯类 CRussia russia; //开始标志 bool start; //封面 CBitmap fenmian; //暂停 BOOL m_bPause; //开始菜单 afx_msg void OnMenuStart(); //计时器 afx_msg void OnTimer(UINT nIDEvent); //键盘操作 afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags); // Russia.h: Public: //游戏数组 int Russia[100][100]; // 当前图形 int Now[4][4]; //上一图形 int Will[4][4]; //变换后的图形 int After[4][4]; //当前图形的左上角位置 CPoint NowPosition; //当前可能出现的图形形状数, int Count; //游戏结束 bool end; //级别 int m_Level; //速度

编译原理课程设计----C语言编译器的实现

$ 编译原理课程设计报告 设计题目编译代码生成器设计 、 学生姓名 班级 学号 指导老师 成绩 `

一、课程设计的目的 编译原理课程兼有很强的理论性和实践性,是计算机专业的一门非常重要的专业基础课程,它在系统软件中占有十分重要的地位,是计算机专业学生的一门主修课。为了让学生能够更好地掌握编译原理的基本理论和编译程序构造的基本方法和技巧,融会贯通本课程所学专业理论知识,提高他们的软件设计能力,特设定该课程的课程设计,通过设计一个简单的PASCAL语言(EL语言)的编译程序,提高学生设计程序的能力,加深对编译理论知识的理解与应用。 二、课程设计的要求 1、明确课程设计任务,复习编译理论知识,查阅复印相关的编译资料。 2、按要求完成课程设计内容,课程设计报告要求文字和图表工整、思路清晰、算法正 确。 3、@ 4、写出完整的算法框架。 5、编写完整的编译程序。 三、课程设计的内容 课程设计是一项综合性实践环节,是对平时实验的一个补充,课程设计内容包括课程的主要理论知识,但由于编译的知识量较复杂而且综合性较强,因而对一个完整的编译程序不适合平时实验。通过课程设计可以达到综合设计编译程序的目的。本课程的课程设计要求学生编写一个完整的编译程序,包括词法分析器、语法分析器以及实现对简单程序设计语言中的逻辑运算表达式、算术运算表达式、赋值语句、IF语句、While语句以及do…while语句进行编译,并生成中间代码和直接生汇编指令的代码生成器。 四、总体设计方案及详细设计 总体设计方案: 1.总体模块

【 2. \ 详细设计: 界面导入设计 (1)一共三个选项: ①choice 1--------cifafenxi ②choice 2--------yufafenxi ③choice 3--------zhongjiandaima (2)界面演示 } 图一

编译原理课程设计

编译原理: 编译原理是计算机专业的一门重要专业课,旨在介绍编译程序构造的一般原理和基本方法。内容包括语言和文法、词法分析、语法分析、语法制导翻译、中间代码生成、存储管理、代码优化和目标代码生成。编译原理是计算机专业设置的一门重要的专业课程。编译原理课程是计算机相关专业学生的必修课程和高等学校培养计算机专业人才的基础及核心课程,同时也是计算机专业课程中最难及最挑战学习能力的课程之一。编译原理课程内容主要是原理性质,高度抽象。 编译原理课程设计: 《编译原理课程设计》是2007年11月浙江大学出版社出版的图书,作者是冯雁、鲁东明、李莹。 内容简介: 本书围绕着编译技术的基本原理和方法,以模拟程序设计语言SPL的编译器的设计和实现为主线,结合词法分析、语法分析、语义分析、代码生成、代码优化、错误处理等各个基本模块,对原理和实现方法进行了详细分析。该编译器可接受SPL的程序,并将其翻译成汇编语言程序,最终实现汇编语言到8086/8088机器语言的翻译。本书为编译技术等相关课程的实验提供了参考。在附件中还提供了三类不同类型和难度的实验题,可供课程实验选择。 第1章引论: 1.1本书介绍 1.2SPL语言的特点及实验安排

1.2.1SPL语言的特点 1.2.2SPL语言编译器的主要结构1.2.3实验安排 1.3平台的选择和介绍 1.3.1LEX简介 1.3.2YACC简介 第2章词法分析: 2.1词法分析器的基本框架 2.2词法分析器的基本原理 2.2.1DFA的构造和实现 2.2.2词法分析的预处理 2.2.3实现词法分析器的注意要点2.3词法分析器的实现 2.3.1SPL语言单词属性字 2.3.2SPL词法分析器的输入和输出2.3.3SPL词法分析器的分析识别第3章语法分析: 3.1语法分析的基本框架 3.1.1上下文无关文法 3.1.2语法分析过程 3.1.3语法分析过程中的数据结构3.2语法分析的基本方法

编译原理课程设计

河海大学 编译原理课程设计 学生姓名: 学号: 班级: 专业:--------- 指导教师:

编译原理 课程设计指导书

题目一基于语法制导翻译的表达式转换编译器 一、设计目的 通过本课程设计获得对实际编译器的构造原理、过程和方法的感性认识,全面掌握语法制导翻译技术。 二、设计内容 采用语法制导翻译模式设计一个包含词法分析、语法分析、符号表管理、错误处理及输出等功能模块的、由中缀表达式到后缀表达式的完整编译器。该翻译器的规格说明如下: start → list eof list → expr;list |ε expr → expr + term { print(‘+’) } | expr –term { print(‘-’) } | term term → term * factor { print(‘*’) } | term / factor { print(‘/’) } | term div factor { print(‘DIV’) } | term mod factor { print(‘MOD’) } factor → ( expr ) | id { print( https://www.doczj.com/doc/9718398330.html, ) } | num { print( num.value ) } 三、设计要求 1、使用模块化设计思想来设计该编译器; 2、词法分析模块用于读入输入串,并将其转换成供语法分析模块使用的记号流。其中包括滤掉空格和注释、识别常数、识别标识符和关键字等功能; 3、要求在语法分析模块中利用语法制导翻译技术完成具体的中缀表达式到后缀表达式的翻译,其中包括按前述翻译器的规格说明构建对应表达式、项、因子的非终结符expr、term 和factor的函数以及检查记号是否匹配的函数;并在不匹配时调用错误处理模块; 4、要求符号表管理模块主要完成符号表对应数据结构的具体实现功能; 5、错误处理模块负责报告错误信息及位置,并终止分析过程; 6、输出模块完成翻译后所得到的后缀表达式的输出。

编译原理课程设计

先简要分析一下语法分析的大致流程: 当有句子要进行处理时,首先要对其进行词法分析来分解出该句子中的每个符号,然后将该句子按照算符优先算法压入归约栈中,如果可以顺利归约,则说明这是一个合法的句子,否则该句子非法。 这里有一个需要考虑的地方,就是如何进行归约。由于文法已经给定,所以我们考虑设计一个文法表,文法表中的内容就是可归约串的种别码的顺序,比如v=E可以表示为9,1,13。这样的话当我们要进行一次归约时,只用按顺序存储最左素短语中符号的种别码,然后拿这个种别码序列与文法表进行匹配,就可知道当前归约需要执行哪些操作。 还有一点需要注意,就是如何对一个表达式进行求值。这里需要我们设计一个二元组的变量名表,这个变量名表可以根据变量的名称来返回变量的数据。变量名表的具体设计见详细设计部分。 由于是简化分析,所以这个程序只考虑整数的处理。 有了上面的分析,可以构造出算符优先分析算法的流程图,如下图所示。

详细设计 (1)词法分析部分 由于词法分析的内容在课程设计1中已经介绍,并且这次的状态转换图与课程设计1中的非常相似,所以这里就不过多介绍。(2)优先关系表 在程序中我们用一个二维数组priTable[][]来存储算符间的优先关系。priTable[a][b]=1表示a>b; 。priTable[a][b]=0表示a=b; 。priTable[a][b]=-1表示a

混凝土结构设计原理》试题库含参考答案

混凝土结构设计原理试题库及其参考答案 一、判断题(请在你认为正确陈述的各题干后的括号内打“√”,否则打“×”。每小题1分。) 第1章钢筋和混凝土的力学性能 1.混凝土立方体试块的尺寸越大,强度越高。() 2.混凝土在三向压力作用下的强度可以提高。() 3.普通热轧钢筋受压时的屈服强度与受拉时基本相同。() 4.钢筋经冷拉后,强度和塑性均可提高。() 5.冷拉钢筋不宜用作受压钢筋。() 6.C20表示f cu=20N/mm。() 7.混凝土受压破坏是由于内部微裂缝扩展的结果。() 8.混凝土抗拉强度随着混凝土强度等级提高而增大。() 9.混凝土在剪应力和法向应力双向作用下,抗剪强度随拉应力的增大而增大。() 10.混凝土受拉时的弹性模量与受压时相同。() 11.线性徐变是指压应力较小时,徐变与应力成正比,而非线性徐变是指混凝土应力较大时,徐变增长与应力不成正比。() 12.混凝土强度等级愈高,胶结力也愈大() 13.混凝土收缩、徐变与时间有关,且互相影响。() 第3章轴心受力构件承载力 1.轴心受压构件纵向受压钢筋配置越多越好。() 2.轴心受压构件中的箍筋应作成封闭式的。() 3.实际工程中没有真正的轴心受压构件。() 4.轴心受压构件的长细比越大,稳定系数值越高。()

5. 轴心受压构件计算中,考虑受压时纵筋容易压曲,所以钢筋的抗压强度设计值最大取为 2/400mm N 。( ) 6.螺旋箍筋柱既能提高轴心受压构件的承载力,又能提高柱的稳定性。( ) 第4章 受弯构件正截面承载力 1. 混凝土保护层厚度越大越好。( ) 2. 对于'f h x ≤的T 形截面梁,因为其正截面受弯承载力相当于宽度为'f b 的矩形截面梁,所以其配筋率应按0' h b A f s =ρ来计算。( ) 3. 板中的分布钢筋布置在受力钢筋的下面。( ) 4. 在截面的受压区配置一定数量的钢筋对于改善梁截面的延性是有作用的。( ) 5. 双筋截面比单筋截面更经济适用。( ) 6. 截面复核中,如果b ξξ>,说明梁发生破坏,承载力为0。( ) 7. 适筋破坏的特征是破坏始自于受拉钢筋的屈服,然后混凝土受压破坏。( ) 8. 正常使用条件下的钢筋混凝土梁处于梁工作的第Ⅲ阶段。( ) 9. 适筋破坏与超筋破坏的界限相对受压区高度b ξ的确定依据是平截面假定。( ) 第5章 受弯构件斜截面承载力 1. 梁截面两侧边缘的纵向受拉钢筋是不可以弯起的。( ) 2. 梁剪弯段区段内,如果剪力的作用比较明显,将会出现弯剪斜裂缝。( ) 3. 截面尺寸对于无腹筋梁和有腹筋梁的影响都很大。( ) 4. 在集中荷载作用下,连续梁的抗剪承载力略高于相同条件下简支梁的抗剪承载力。( ) 5. 钢筋混凝土梁中纵筋的截断位置,在钢筋的理论不需要点处截断。( ) 第6章 受扭构件承载力

编译原理课程设计 C语言编译器的实现

编译原理课程设计报告 设计题目编译代码生成器设计 学生姓名 班级 学号 指导老师 成绩

一、课程设计的目的 编译原理课程兼有很强的理论性和实践性,是计算机专业的一门非常重要的专业基础课程,它在系统软件中占有十分重要的地位,是计算机专业学生的一门主修课。为了让学生能够更好地掌握编译原理的基本理论和编译程序构造的基本方法和技巧,融会贯通本课程所学专业理论知识,提高他们的软件设计能力,特设定该课程的课程设计,通过设计一个简单的PASCAL语言(EL语言)的编译程序,提高学生设计程序的能力,加深对编译理论知识的理解与应用。 二、课程设计的要求 1、明确课程设计任务,复习编译理论知识,查阅复印相关的编译资料。 2、按要求完成课程设计内容,课程设计报告要求文字和图表工整、思路清晰、算法正 确。 3、写出完整的算法框架。 4、编写完整的编译程序。 三、课程设计的内容 课程设计是一项综合性实践环节,是对平时实验的一个补充,课程设计内容包括课程的主要理论知识,但由于编译的知识量较复杂而且综合性较强,因而对一个完整的编译程序不适合平时实验。通过课程设计可以达到综合设计编译程序的目的。本课程的课程设计要求学生编写一个完整的编译程序,包括词法分析器、语法分析器以及实现对简单程序设计语言中的逻辑运算表达式、算术运算表达式、赋值语句、IF语句、While语句以及do…while语句进行编译,并生成中间代码和直接生汇编指令的代码生成器。 四、总体设计方案及详细设计 总体设计方案: 1.总体模块 主程序 词法分析程序语法分析 程序 中间代码 生成程序

2. 表2.1 各种单词符号对应的种别码 单词符号种别码单词符号种别码bgin 1 :17 If 2 := 18 Then 3 < 20 wile 4 <> 21 do 5 <= 22 end 6 > 23 lettet(letter|digit)* 10 >= 24 dight dight* 11 = 25 + 13 ;26 —14 ( 27 * 15 ) 28 / 16 # 0 详细设计: 4.1界面导入设计 (1)一共三个选项: ①choice 1--------cifafenxi ②choice 2--------yufafenxi ③choice 3--------zhongjiandaima (2)界面演示 图一

相关主题
文本预览
相关文档 最新文档