资源描述
东 北 石 油 大 学
课 程 设 计
课 程 电子系统设计与实践
题 目 数字电压表设计
院 系 计算机与信息技术学院
专业班级 计算机科学与技术09-1班
学生姓名
学生学号
指导教师
2009年 7 月 10 日
东北石油大学课程设计任务书
课程 电子系统设计与实践计
题目 数字电压表设计
专业 计算机科学与技术 姓名 学号
主要内容、基本要求等
一、主要内容:
利用EL教学实验箱、微机和QuartusⅡ软件系统,使用VHDL语言输入方法设计数字钟。可以利用层次设计方法和VHDL语言,完成硬件设计设计和仿真。最后在EL教学实验箱中实现。
二、基本要求:
1、A/D转换接口电路的设计,负责对ADC0809的控制。
2、编码转换电路设计,负责把从ADC0809数据总线中读出的电压转换成BCD码。
3、输出七段显示电路的设计,负责将BCD码用7段显示器显示出来。
三、扩展要求
1. 当测量结束后,蜂鸣器鸣响10声。
按照规范写出论文,要求字数在4000字以上,并进行答辩。论文内容包括概述(学习、调研、分析、设计的内容摘要)、EDA技术的现状和发展趋势、对EL教学实验箱和QuartusⅡ软件的掌握程度、数字钟的设计过程(包括原理图或程序设计、编译、仿真分析、硬件测试的全过程),论文中含有原理图、程序、仿真波形图及其分析报告。
完成期限 2周
指导教师
专业负责人
年 月 日东北石油大学课程设计成绩评价表
课程名称
电子系统设计与实践
题目名称
数字电压表设计
学生姓名
学号
指导教师姓名
李军
职称
副教授
序号
评价项目
指 标(优秀)
满分
评分
1
选题难度
选题难度较高,或者对原题目进行了相当程度的改进。
10
2
工作量、工作态度和出勤率
工作量饱满,工作努力,遵守纪律,出勤率高,工作作风严谨,善于与他人合作。
10
3
课程设计质量
按期圆满的完成了规定的任务,方案设计合理,思考问题全面,系统功能完善。
35
4
报告质量
问题论述思路清晰,结构严谨,文理通顺,撰写规范,图表完备正确。
30
5
回答问题
在进行课程设计程序系统检查时,能正确回答指导教师所提出的问题。
10
6
创新
工作中有创新意识,对前人工作有改进或有应用价值。在进行系统检查时能对创新性进行说明,并在报告中有相应的论述。
5
总分
评语:
指导教师: 年 月 日
摘 要
Quartus II 是Altera公司的综合性PLD开发软件,支持原理图、VHDL、VerilogHDL以及AHDL(Altera Hardware Description Language)等多种设计输入形式,内嵌自有的综合器以及仿真器,可以完成从设计输入到硬件配置的完整PLD设计流程。
Quartus II可以在XP、Linux以及Unix上使用,除了可以使用Tcl脚本完成设计流程外,提供了完善的用户图形界面设计方式。具有运行速度快,界面统一,功能集中,易学易用等特点。
本文设计主要利用VHDL语言在EDA平台上设计一个数字电压表,它的显示位数为4位,由三大部分组成,每一部分又包含了若干子电路,将各电路组合起来,就构成了一个整体。。总的程序由几个各具不同功能的部分组成,其中包括循环控制P1、复位和状态转换P2、编码转换data、BCD码加法do、输出七段显示dout。并且使用Quartus7.2-II软件进行电路波形仿真,下载到EDA实验箱进行验证。
关键词: EDA(电子设计自动化);VHDL(硬件描述语言);ADC0809;数字电压表。
目 录
第1章 概 述 1
1.1 EDA的概念 1
1.2 VHDL语言的概念 2
1.3 EDA的开发环境 3
第2章 数字电压表的系统分析 4
2.1设计目的 4
2.2功能说明 4
2.3实验原理 4
2.4系统硬件 4
第3章 数字电压表的底层电路设计 5
3.1设计规划 5
3.2设计说明 5
3.3电路程序 5
第4章 数字电压表的测试与运行 13
4.1数字电压表的编译与仿真 13
4.2数字电压表的适配与测试 16
结 论 17
参考文献 18
东北石油大学本科生电子系统设计与实践
第1章 概 述
1.1 EDA的概念
EDA在通信行业(电信)里的另一个解释是企业数据架构,EDA给出了一个企业级的数据架构的总体视图,并按照电信企业的特征,进行了框架和层级的划分。 EDA是电子设计自动化(Electronic Design Automation)的缩写,在20世纪60年代中期从计算机辅助设计(CAD)、计算机辅助制造(CAM)、计算机辅助测试(CAT)和计算机辅助工程(CAE)的概念发展而来的。
20世纪90年代,国际上电子和计算机技术较先进的国家,一直在积极探索新的电子电路设计方法,并在设计方法、工具等方面进行了彻底的变革,取得了巨大成功。在电子技术设计领域,可编程逻辑器件(如CPLD、FPGA)的应用,已得到广泛的普及,这些器件为数字系统的设计带来了极大的灵活性。这些器件可以通过软件编程而对其硬件结构和工作方式进行重构,从而使得硬件的设计可以如同软件设计那样方便快捷。这一切极大地改变了传统的数字系统设计方法、设计过程和设计观念,促进了EDA技术的迅速发展。
EDA技术就是以计算机为工具,设计者在EDA软件平台上,用硬件描述语言VHDL完成设计文件,然后由计算机自动地完成逻辑编译、化简、分割、综合、优化、布局、布线和仿真,直至对于特定目标芯片的适配编译、逻辑映射和编程下载等工作。EDA技术的出现,极大地提高了电路设计的效率和可操作性,减轻了设计者的劳动强度。
利用EDA工具,电子设计师可以从概念、算法、协议等开始设计电子系统,大量工作可以通过计算机完成,并可以将电子产品从电路设计、性能分析到设计出IC版图或PCB版图的整个过程的计算机上自动处理完成。
现在对EDA的概念或范畴用得很宽。包括在机械、电子、通信、航空航天、化工、矿产、生物、医学、军事等各个领域,都有EDA的应用。目前EDA技术已在各大公司、企事业单位和科研教学部门广泛使用。例如在飞机制造过程中,从设计、性能测试及特性分析直到飞行模拟,都可能涉及到EDA技术。
1.2 VHDL语言的概念
VHDL 的英文全名是 Very-High-Speed Integrated Circuit Hardware Description Language,诞生于 1982 年。1987 年底,VHDL被 IEEE 和美国国防部确认为标准硬件描述语言。
VHDL主要用于描述数字系统的结构,行为,功能和接口。除了含有许多具有硬件特征的语句外,VHDL的语言形式和描述风格与句法是十分类似于一般的计算机高级语言。VHDL的程序结构特点是将一项工程设计,或称设计实体(可以是一个元件,一个电路模块或一个系统)分成外部(或称可视部分,及端口)和内部(或称不可视部分),既涉及实体的内部功能和算法完成部分。在对一个设计实体定义了外部界面后,一旦其内部开发完成后,其他的设计就可以直接调用这个实体。这种将设计实体分成内外部分的概念是VHDL系统设计的基本点。
VHDL 语言能够成为标准化的硬件描述语言并获得广泛应用 , 它自身必然具有很多其他硬件描述语言所不具备的优点。归纳起来 ,VHDL 语言主要具有以下优点:
(1) VHDL 语言功能强大 , 设计方式多样
VHDL 语言具有强大的语言结构, 只需采用简单明确的VHDL语言程序就可以描述十分复杂的硬件电路。同时, 它还具有多层次的电路设计描述功能。此外 ,VHDL 语言能够同时支持同步电路、异步电路和随机电路的设计实现, 这是其他硬件描述语言所不能比拟的。VHDL 语言设计方法灵活多样 , 既支持自顶向下的设计方式, 也支持自底向上的设计方法; 既支持模块化设计方法, 也支持层次化设计方法。
(2) VHDL 语言具有强大的硬件描述能力
VHDL 语言具有多层次的电路设计描述功能,既可描述系统级电路 , 也可以描述门级电路;描述方式既可以采用行为描述、寄存器传输描述或者结构描述,也可以采用三者的混合描述方式。同时,VHDL 语言也支持惯性延迟和传输延迟,这样可以准确地建立硬件电路的模型。VHDL 语言的强大描述能力还体现在它具有丰富的数据类型。VHDL 语言既支持标准定义的数据类型,也支持用户定义的数据类型,这样便会给硬件描述带来较大的自由度。
(3) VHDL 语言具有很强的移植能力
VHDL 语言很强的移植能力主要体现在: 对于同一个硬件电路的 VHDL 语言描述 , 它可以从一个模拟器移植到另一个模拟器上、从一个综合器移植到另一个综合器上或者从一个工作平台移植到另一个工作平台上去执行。
(4) VHDL 语言的设计描述与器件无关
采用 VHDL 语言描述硬件电路时, 设计人员并不需要首先考虑选择进行设计的器件。这样做的好处是可以使设计人员集中精力进行电路设计的优化, 而不需要考虑其他的问题。当硬件电路的设计描述完成以后 ,VHDL 语言允许采用多种不同的器件结构来实现。
(5) VHDL 语言程序易于共享和复用
VHDL 语言采用基于库 ( library) 的设计方法。在设计过程中 , 设计人员可以建立各种可再次利用的模块 , 一个大规模的硬件电路的设计不可能从门级电路开始一步步地进行设计 , 而是一些模块的累加。这些模块可以预先设计或者使用以前设计中的存档模块, 将这些模块存放在库中 , 就可以在以后的设计中进行复用。
由于 VHDL 语言是一种描述、模拟、综合、优化和布线的标准硬件描述语言 , 因此它可以使设计成果在设计人员之间方便地进行交流和共享, 从而减小硬件电路设计的工作量, 缩短开发周期。
1.3 EDA的开发环境
EDA工具软件可大致可分为芯片设计辅助软件、可编程芯片辅助设计软件、系统设计辅助软件等三类。
目前进入我国并具有广泛影响的EDA软件是系统设计软件辅助类和可编程芯片辅助设计软件:Protel、Altium Designer、PSPICE、multiSIM10(原EWB的最新版本)、OrCAD、PCAD、LSIIogic、MicroSim、ISE、modelsim、Matlab等等。这些工具都有较强的功能,一般可用于几个方面,例如很多软件都可以进行电路设计与仿真,同进还可以进行PCB自动布局布线,可输出多种网表文件与第三方软件接口。
第2章 数字电压表的系统分析
2.1设计目的
1.掌握负责对ADC0809进行控制的A/D转换接口电路的设计。
2.掌握负责把从ADC0809数据总线中读出的电压转换成BCD码的编码转换电路的设计。
3.掌握十六进制转十进制的运算方法。
4.理解输出七段显示电路的设计。
2.2功能说明
1.具有输出模拟电压的功能。
2.具有复位。
2.3实验原理
在同一EPLD芯片EPF10K10上集成了如下电路模块:
1.控制ADC0809对模拟电压的转换。
2.通过编码设计电路,将ADC0809中的电压转换为BCD码。
3.通过对7段显示电路的设计,将读出的电压通过7段显示器显示出来。
2.4系统硬件
1.EPF10K10LC84-4适配器。
2. 可变直流电平输出电路。
3. ADC0809。
4. 7段显示器。
第3章 数字电压表的底层电路设计
3.1设计规划
数字电压表因为只实现一个功能,附带一个重置的控制功能。因此可以将数字电压表设计分为以下模块:
1.控制信号模块:利用状态机来实现控制器对ADC0809进行模/数信号的转换的控制。
2.电压转换BCD码模块:找出模拟输入电压与输出电压的对应关系,设计一个12位的BCD码加法器。
3.电压显示模块:对转换后的电压数进行显示,将数字分为7个部分,另外还有小数点,通过vhdl程序对进行相应电压数的转换。
3.2设计说明
首先从整体分析数字电压表,然后对其进行细化,将其大致分为三大模块,然后专攻一个部分,再将其融合在一起。
3.3电路程序
3.3.1 实体部分(VHDL语言编译)
其代码如下:(VHDL语言):
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity voltmeter is
port (D: in std_logic_vector(7 downto 0);
CLK,INT,RESET: in std_logic;
CS,RD,WR: out std_logic;
DATOUT: out std_logic_vector(11 downto 0)
);
end voltmeter;
architecture doit of voltmeter is
signal datain : std_logic_vector(7 downto 0);
signal data1,data2 : std_logic_vector(15 downto 0);
signal dout1,dout2,dout3,dout4 : std_logic_vector(11 downto 0);
signal do1,do2,do3,do4,c1,c2,c3,doo1,doo2,doo3,doo4 :std_logic_vector(4 downto 0);
type statetype is(idle,write,swait,read,disp1,disp2,disp3,disp4);
signal present_state,next_state: statetype;
这段VHDL语言声明实体voltmeter并定义其信号。
3.3.2产生控制信号
对于ADC0809芯片的各种介绍请参阅其数据手册。芯片ADC0809的控制时序图如图3-3所示。实验仪器中ADC0809接口电路原理图如图3-1所示。
图3-1 ADC0809接口电路原理图
由图3-1和图3-2可知,当CS 和WR同时为高电平时,ADC0809开始转换,当转换完成后,在INT脚输出高电平,等待读数据;当CS和RD同时为电平时,通过数据总线D[7..0]从ADC0809是读出数据,如图51-2所示。
图3-2 控制器控制信号时序图
从图3-2我们可以将整个控制器分成4个步骤状态:S0、S1、S2、S3,第个状态的动作方式如下:
状态S0:CS=1、WR=1、RD=0(由控制器发出信号要求ADC0809开始进行模/数信号的转换)。
状态S1:CS=0、WR=0、RD=0(ADC0809进行转换动作,转换完毕后INT将低电位升至高电位)。
状态S2:CS=1、WR=0、RD=1(由控制器发出信号以读取ADC0809的转换资料)。
状态S3:CS=0、WR=0、RD=0(由控制器读取数据总线上的数字转换资料)。
由上述的四个状态可以归纳出整个控制器的动作功能有:
负责在每个步骤送出所需的CS、WR、RD控制信号。
在状态S1时,监控INT信号是否由低变高,如此以便了解转换动作结束与否。
在状态S3,读取转换的数字资料。
其代码如下:(VHDL语言):
P1: process(present_state,next_state,INT)
begin
case present_state is
when idle => CS<='1'; WR<='0'; RD<='0';
next_state<=write;
when write => CS<='1'; WR<='1'; RD<='0';
next_state<=swait;
when swait => CS<='0'; WR<='0'; RD<='0';
if ( INT='1') then
next_state<=read;
else
next_state<=swait;
end if;
when read => CS<='1'; WR<='0'; RD<='1';
next_state<=disp1;
when disp1 => CS<='0'; WR<='0'; RD<='0';
DATOUT<=dout1;
next_state<=disp2;
when disp2 => CS<='0'; WR<='0'; RD<='0';
DATOUT<=dout2;
next_state<=disp3;
when disp3 => CS<='0'; WR<='0'; RD<='0';
DATOUT<=dout3;
next_state<=disp4;
when disp4 => CS<='0'; WR<='0'; RD<='0';
DATOUT<=dout4;
next_state<=write;
end case;
end process P1;
这段代码实现了状态S1,S2,S3的控制。
3.3.3 BCD码表示数字电压信号(VHDL语言)
计算转换后的数字电压信号,最终以BCD码表示。
当参考电压(Vref)为2.56V时,模拟输入电压与输出电压的对应关系如表3-1所示。
表3-1 模拟输入电压与输出电压的
进制
参考电压
16
2
高4位电压
低4位电压
0
0000
0.00
0.00
1
0001
0.32
0.02
2
0010
0.64
0.04
3
0011
0.96
0.06
4
0100
1.28
0.08
5
0101
1.60
0.10
6
0110
1.92
0.12
7
0111
2.24
0.14
8
1000
2.56
0.16
9
1001
2.88
0.18
A
1010
3.20
0.20
B
1011
3.52
0.22
C
1100
3.84
0.24
D
1101
4.16
0.26
E
1110
4.48
0.28
F
1111
4.80
0.30
这样由ADC0809收到的信号是01110110(76H),则对照表52-1时,高4位0111的电压为2.24V,而低4位0110是0.12V,所以最后的电压输出结果为2.24+0.12=2.36V。
对于数据转换成BCD码,我们必须设计一个12位的BCD码加法器,如上述的2.24V的二进制表示为:001000100100、0.12V是000000010010,所以其相加结果为001000110110,为2.36V。
其代码如下:(VHDL语言):
P2: process(CLK, RESET)
begin
if(RESET='0') then
present_state<=idle;
datain<="00000000";
elsif(CLK'event and CLK='1') then
present_state<=next_state;
if(present_state=read) then
datain<=D;
end if;
end if;
end process P2;
data1<="0000000000000000" when datain(7 downto 4)="0000" else
"0000001100010011" when datain(7 downto 4)="0001" else
"0000011000100101" when datain(7 downto 4)="0010" else
"0000100100111000" when datain(7 downto 4)="0011" else
"0001001001010000" when datain(7 downto 4)="0100" else
"0001010101100011" when datain(7 downto 4)="0101" else
"0001100001110101" when datain(7 downto 4)="0110" else
"0010000110001000" when datain(7 downto 4)="0111" else
"0010010100000000" when datain(7 downto 4)="1000" else
"0010100000010011" when datain(7 downto 4)="1001" else
"0011000100100101" when datain(7 downto 4)="1010" else
"0011010000111000" when datain(7 downto 4)="1011" else
"0011011101010000" when datain(7 downto 4)="1100" else
"0100000001100011" when datain(7 downto 4)="1101" else
"0100001101110101" when datain(7 downto 4)="1110" else
"0100011010001000" when datain(7 downto 4)="1111" else
"0000000000000000";
data2<="0000000000000000" when datain(3 downto 0)="0000" else
"0000000000100000" when datain(3 downto 0)="0001" else
"0000000000111001" when datain(3 downto 0)="0010" else
"0000000001011001" when datain(3 downto 0)="0011" else
"0000000001111000" when datain(3 downto 0)="0100" else
"0000000010011000" when datain(3 downto 0)="0101" else
"0000000100010111" when datain(3 downto 0)="0110" else
"0000000100110111" when datain(3 downto 0)="0111" else
"0000000101010110" when datain(3 downto 0)="1000" else
"0000000101110110" when datain(3 downto 0)="1001" else
"0000000110010101" when datain(3 downto 0)="1010" else
"0000001000010101" when datain(3 downto 0)="1011" else
"0000001000110100" when datain(3 downto 0)="1100" else
"0000001001010100" when datain(3 downto 0)="1101" else
"0000001001110011" when datain(3 downto 0)="1110" else
"0000001010010011" when datain(3 downto 0)="1111" else
"0000000000000000";
3.3.4 BCD码进位(VHDL语言)
在读取到转换数据后,先用查表的指令算出高、低4位的两个电压值,并分别用12位的BCD码表示。接着设计12位的BCD码加法。相加从最低4位开始,且每4位相加结果超过10时需作进位动作。
其代码如下(VHDL语言):
do1<=('0' & data1(3 downto 0))+('0' & data2(3 downto 0));
c1<="00000" when do1<"01010" else
"00001";
do2<=('0' & data1(7 downto 4))+('0' & data2(7 downto 4))+c1;
c2<="00000" when do2<"01010" else
"00001";
do3<=('0' & data1(11 downto 8))+('0' & data2(11 downto 8))+c2;
c3<="00000" when do3<"01010" else
"00001";
do4<=('0' & data1(15 downto 12))+('0' & data2(15 downto 12))+c3;
doo1<=do1 when do1<"01010" else
do1-"01010";
doo2<=do2 when do2<"01010" else
do2-"01010";
doo3<=do3 when do3<"01010" else
do3-"01010";
doo4<=do4 when do4<"01010" else
do4-"01010";
3.3.5 7段显示器显示BCD码(VHDL语言编译)
其代码如下:(VHDL语言):
dout1<="111111000100" when doo1="0000" else --a,b,c,d,e,f,g,dp,sel3,sel2,sel1,sel0;
"011000000100" when doo1="0001" else
"110110100100" when doo1="0010" else
"111100100100" when doo1="0011" else
"011001100100" when doo1="0100" else
"101101100100" when doo1="0101" else
"101111100100" when doo1="0110" else
"111000000100" when doo1="0111" else
"111111100100" when doo1="1000" else
"111101100100" when doo1="1001" else
"000000001111";
dout2<="111111000101" when doo2="0000" else --a,b,c,d,e,f,g,dp,sel3,sel2,sel1,sel0;
"011000000101" when doo2="0001" else
"110110100101" when doo2="0010" else
"111100100101" when doo2="0011" else
"011001100101" when doo2="0100" else
"101101100101" when doo2="0101" else
"101111100101" when doo2="0110" else
"111000000101" when doo2="0111" else
"111111100101" when doo2="1000" else
"111101100101" when doo2="1001" else
"000000001111";
dout3<="111111000110" when doo3="0000" else --a,b,c,d,e,f,g,dp,sel3,sel2,sel1,sel0;
"011000000110" when doo3="0001" else
"110110100110" when doo3="0010" else
"111100100110" when doo3="0011" else
"011001100110" when doo3="0100" else
"101101100110" when doo3="0101" else
"101111100110" when doo3="0110" else
"111000000110" when doo3="0111" else
"111111100110" when doo3="1000" else
"111101100110" when doo3="1001" else
"000000001111";
dout4<="111111010111"whendoo4="0000"else --a,b,c,d,e,f,g,dp,sel3,sel2,sel1,sel0;
"011000010111" when doo4="0001" else
"110110110111" when doo4="0010" else
"111100110111" when doo4="0011" else
"011001110111" when doo4="0100" else
"101101110111" when doo4="0101" else
"101111110111" when doo4="0110" else
"111000010111" when doo4="0111" else
"111111110111" when doo4="1000" else
"111101110111" when doo4="1001" else
"000000001111";
end doit;
以上代码实现了BCD码的加法。
第4章 数字电压表的测试与运行
4.1数字电压表的编译与仿真
4.1.1数字电压表的编译
数字电压表编译完成后,所显示的设计器件,引脚利用率,文件名,工程名等。
图4-1 综合完成
4.1.2数字电压表的逻辑电路图
图4-2 RTL Viewer
通过RTL Viewer我们可以清楚的看到电路的内部构造
4.1.3数字电压表的功能仿真
仿真前对各个引脚进行周期设置。通过对电压表的功能仿真,让我们清楚的看到实体的功能及运行状况。便于我们修改程序,及时作出调整。
图4-4 仿真结果
4.2数字电压表的适配与测试
选择Assign中 Dvice 选择FLEX10K中的EPF10K10LC84-4 选择configure.下载到试验箱,将引脚图调出来。 按引脚连线,如下图4-6,连线后测试成功 电压显示正常。
图4-5 引脚连线
转动可调电阻。可以清晰看到7段数码管上显示电压的变化。
结 论
设计数字电压表,巩固了使用VHDL语言输入方法。熟悉了Quartus-II的使用。
通过这次设计,进一步加深了对EDA的了解,并且了解到日常生活中的小器件都与EDA有着密切的联系,让我对它有了更加浓厚的兴趣。当然在这过程中会遇到各种各样的困惑与不解,特别是在读整个程序时,头特别大,不知从何处招手,当我静下心来,一步步的分析它的子模块时,并编译出来时,心里是特别的高兴。在编译A/D转换接口时,遇到了很到的麻烦,因为不是特别清晰它的工作原理,幸好书上有关于状态机的详细介绍,并且回想起了老师上课时对状态机的讲解,所以也慢慢的克服了,也认识到上课认真听讲的重要性,让我更加了解到平时的积累是重要的,有了这些小知识的积累才会成为一个合格的计算机工作者。在编写编码转换电路设计时,第一次成功并且亲自地完成了模拟信号转换为数字信号,并且当电压值在数码管上显示时,感觉特别的神奇,特别的自豪,原来很多看起来秘密以前不可想象的真的是就这么做出来了,经过不断的修改,总结并在成功的完成调试,编译,仿真之后,才真正的意识到程序员工作的辛苦和他们对社会的贡献,但同时也有着一种从未有过的成就感萦绕在心中。
总的来说,这次设计让我学会了很多,通过理论与实际相结合,不仅增强了自己的逻辑思维能力还增强了自己的动手能力,并且通过与同学的探讨与分析,增强了同学间的团结合作能力,意识到合作的重要性。最重要的是,这次设计加深了我对EDA的学习兴趣,在日后的学习中我会更加努力的。
参考文献
[1] 潘松,王国栋,VHDL实用教程[M].成都:电子科技大学出版社,2000.(1)
[2] VHDL语言及其应用,《计算机工程》1998年10期
[3] 朱正伟.EDA技术及应用[M].北京:清华大学出版
展开阅读全文