EDA 设计报告
智能函数发生器的设计
姓名:陈晓
班级:电子信息工程二班
学号:200607240205
智能函数发生器的 VHDL 设计与仿真
摘要: 以函数信号发生器的功能为设计对象, 运用 EDA 技术的设计方法, 进行
各种波形的输入设计、设计处理, 项目校验和器件编程。在 VHDL 语言的编写中
按照行为描述, 寄存器传输描述, 实现了几种波形的软件设计和具体逻辑元件
结构的硬件映射。结合 FPGA/ CPLD 的开发集成环境, 产生了函数信号发生器的
各种信号, 同时完成了行为仿真、时序和功能仿真, 给出了在 GW48 - CK 型实
验开发系统上实现的正弦波形仿真结果。实验表明采用该方法能生成锯齿波、三
角波、阶梯波、正弦波等波形, 实现了信号发生器的功能, 说明该设计是行之有
效的。信号发生器功能设计的方法可以推广到其它电子系统的设计中。
关键词:电子设计自动化; VHSIC 硬件描述语言; 智能函数发生器
1 智能函数发生器设计
传统的设计方案智能函数信号发生器一般是指能自动产生方波、三角波、正弦波
等函数信号波形的电路和仪器。根据用途不同 , 函数发生器可以产生多种信号
波形。使用的器件可以(是分立元件 , 也可以采用集成电路 如单片函数发)生器
模块 8038 , 如由集成运算放大器与晶体管差分放大器就可以共同组成方波 -
三角波 - 正弦波函[3]数信号发生器 。这种有模拟电路元器件的构成方式需用
器件多 , 仪器体积较大 , 损耗也大。
2
EDA 技术的设计方案
EDA 技术设计信号发生器的流程函数信号发生器的设计流程 , 如图 1 所示。
信号发生器功能的设计是基于美国 Altera 公司提供的 FPGA/ CPLD 的开发集
成环境 MAX +PLUS Ⅱ软件经过设计输入编辑、编译网表提取、数据库建立、逻
辑综合、逻辑分割、适配、延时网表提取、编程文件装配及编程下载的流程.
方波、三角波、正弦波、阶梯波 , 函数信号发生器的总体框图。如图 所示。
Q[7..0]
OUTPUT
Q[7..0]
BXXZ
SEL[1..0]
D0[7..0]
D1[7..0]
D2[7..0]
inst
sel[1..0]
INPUT
VCC
SJB
clk
reset
INPUT
VCC
INPUT
VCC
Q[7..0]
CLK
RESET
inst3
SIN
Q[7..0]
CLK
RESET
inst2
JXB
Q[7..0]
CLK
RESET
inst1
设计处理: 设计处理的任务是对项目进行编译 , 就是将信号发生器的程序改为
可以用于生成的“语言”, 编译器通过读入设计文件并产生用于编程、仿真和分
析的输出文件。
函数波形和智能选择模块的设计
在利用 HDL 的硬件设计方法中 , 经过了 3 个层次对信号发生器的硬件设计。
第一层行为描述 , 就是对整个系统的数学模型的描述 , 把系统分成几个具体
的模块 , 采用 VHDL 语言生成所需的基本模块。正弦波形的设计: 采用描点法
来描述正弦波 ,仿真波形中可以看到输入输出引脚设置 , 其中 clk 输入时钟
端口 , reset 为输入复位端口, d 为整数输出端口 , 一个周期选取 64 个点 ,
计算出 64 个常数后 , 查表输出 。复位信号的级别高于其它信号 , 而且低电
平是有效电平 , 所以整个程序的工作状态应处于高电平状态当时钟检测到上升
沿时 ,计数器计数 , 描点工作开始。没达到最大值之前 ,一直自加 , 否则就自
动转为“0”。那么首先要确定这 64 个点。然后在程序里用 case 语句来选择。
设计中用 VHDL 语言勾画出正弦波的输入输出引脚和内部计数过程的计数状态
变化时序和关系。
三角波的设计: 采用 0~255~0 循环加/减法计数器实现。
方波的设计: 采用高/低电平实现 , 用 cnt 来控制方波的周期 , 用 a 的值来
控制输出到底是高电平还是低电平。注意 cnt 的取值 , 不能太大 , 否则方波
的周期会很大 , 不容易看出是方波了。
波形选择调用模块的设计: 波形选择模块的功能是把前面的几个波形模块联系
起来 , 可以根据外部的开关状态选择输出的波形。在芯片上就是通过几个按键
的选择来选择模块 , sel 就是这个按键 ,sel 的不同值就会选择不同的波形。
如: 当 sel 值为“0”时 , 波形选择就选递增模块与之对应。“1”与递减模块
对应 , 然后“2”、“3”分别与三角、正弦、方波模块对应 , 其他值就设为无
效值。在仿真波形中可以看到 sel 为波形选择端口 , 该模块可以根据外部的开
关状态选择输出的波形。Sel = ‘2’是正弦波形。
波形模块如下:
三角波形模块
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY SJB IS
PORT(CLK,RESET: IN STD_LOGIC;
Q: OUT STD_LOGIC_VECTOR (7 DOWNTO
0));
END SJB;
ARCHITECTURE BEHAVE OF SJB IS
BEGIN
PROCESS(CLK,RESET)
VARIABLE TMP: STD_LOGIC_VECTOR(7
DOWNTO 0);
VARIABLE A:STD_LOGIC;
BEGIN
IF RESET='0' THEN
TMP:="00000000";
ELSIF (CLK'EVENT AND CLK='1') THEN
IF A='0' THEN
IF TMP="111111110" THEN
TMP:="11111111";
A:='1';
ELSE
TMP:=TMP+1;
END IF;
ELSE
IF TMP="00000001" THEN
TMP:="00000000";
A:='0';
ELSE TMP:=TMP-1;
END IF;
END IF;
END IF;
Q<=TMP;
END PROCESS;
END BEHAVE;
sin 波形模块
sin 波形
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY SIN IS
PORT (CLK,RESET: IN STD_LOGIC;
Q:OUT INTEGER RANGE 0 TO 255);
END SIN;
ARCHITECTURE BEHAVE OF SIN IS
BEGIN
PROCESS(CLK,RESET)
VARIABLE TMP:INTEGER RANGE 0 TO 63;
BEGIN
IF RESET='0' THEN
Q<=0;
ELSIF (CLK'EVENT AND CLK='1') THEN
IF TMP=63 THEN
TMP:=0;
ELSE
TMP:=TMP+1 ;
END IF;
CASE TMP IS
WHEN 00=>Q<=255;WHEN
01=>Q<=254;WHEN 02=>Q<=252;
WHEN 03=>Q<=249;WHEN
04=>Q<=245;WHEN 05=>Q<=239;
WHEN 06=>Q<=233;WHEN
07=>Q<=225;WHEN 08=>Q<=217;
WHEN 09=>Q<=207; WHEN
10=>Q<=197;WHEN 11=>Q<=186;
WHEN 12=>Q<=174; WHEN
13=>Q<=162;WHEN 14=>Q<=150;
WHEN 15=>Q<=137; WHEN
16=>Q<=124;WHEN 17=>Q<=112;
WHEN 18=>Q<=99; WHEN
19=>Q<=87;WHEN 20=>Q<=75;
WHEN 21=>Q<=64; WHEN
22=>Q<=53;WHEN 23=>Q<=43;
WHEN 24=>Q<=34; WHEN
25=>Q<=26;WHEN 26=>Q<=19;
WHEN 27=>Q<=13; WHEN 28=>Q<=8;WHEN
29=>Q<=4;
WHEN 30=>Q<=1; WHEN 31=>Q<=0;WHEN
32=>Q<=0;
WHEN 33=>Q<=1; WHEN 34=>Q<=4;WHEN
35=>Q<=8;
WHEN 36=>Q<=13; WHEN
37=>Q<=19;WHEN 38=>Q<=26;
WHEN 39=>Q<=34; WHEN
40=>Q<=43;WHEN 41=>Q<=53;
WHEN 42=>Q<=64; WHEN
43=>Q<=75;WHEN 44=>Q<=87;
WHEN 45=>Q<=99; WHEN
46=>Q<=112;WHEN 47=>Q<=124;
WHEN 48=>Q<=137; WHEN
49=>Q<=150;WHEN 50=>Q<=162;
WHEN 51=>Q<=174; WHEN
52=>Q<=168;WHEN 53=>Q<=197;
WHEN 54=>Q<=207; WHEN
55=>Q<=217;WHEN 56=>Q<=225;
WHEN 57=>Q<=233; WHEN
58=>Q<=239;WHEN 59=>Q<=245;
WHEN 60=>Q<=249; WHEN
61=>Q<=252;WHEN 62=>Q<=254;
WHEN 63=>Q<=255;
WHEN OTHERS=>NULL;
END CASE;
END IF;
END PROCESS;
END BEHAVE;
方波波形模块
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY JXB IS
PORT (CLK,RESET:IN STD_LOGIC;
Q:OUT INTEGER RANGE 0 TO 255);
END JXB;
ARCHITECTURE BEHAVE OF JXB IS
SIGNAL A:BIT;
BEGIN
PROCESS(CLK,RESET)
VARIABLE CNT:INTEGER;
BEGIN
IF RESET='0' THEN
A<='0';
ELSIF (CLK'EVENT AND CLK='1') THEN
IF CNT<63 THEN
CNT:=CNT+1;
ELSE
CNT:=0;
A<=NOT A;
END IF;
END IF;
END PROCESS;
PROCESS(CLK,A)
BEGIN
IF (CLK'EVENT AND CLK='1') THEN
IF A='1' THEN
Q<=255;
ELSE
Q<=0;
END IF ;
END IF ;
END PROCESS;
END BEHAVE;
波形选择模块
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY BXXZ IS
PORT(SEL:IN STD_LOGIC_VECTOR(1
DOWNTO 0);
D0,D1,D2:IN STD_LOGIC_VECTOR (7
DOWNTO 0);
Q: OUT STD_LOGIC_VECTOR(7 DOWNTO
0));
END BXXZ;
ARCHITECTURE BEHAVE OF BXXZ IS
BEGIN
PROCESS(SEL)
BEGIN
CASE SEL IS
WHEN "00"=>Q<=D0;
WHEN "01"=>Q<=D1;
WHEN "10"=>Q<=D2;
WHEN OTHERS=>NULL;
END CASE;
END PROCESS;
END BEHAVE;
信号发生器的功能与时序仿真测试
上述各功能模块设计完成后 , 根据总体结构的逻辑顺序将模块连接好 , 启动
MAX + PLUS Ⅱ里编译功能 , 调试各分电路的. vhd 文件 , 然后调用波形仿真
工具 , 引入管脚信号 , 设定输入信号 , 然后开始仿真。以正弦波形模块为
例 , clr 是复位信号 , clk 是
时钟信号 , 具体 clk , sel 的赋值可观察到图形
3 结束语
运用 VHDL 语言进行智能函数发生器功能的设计具有以下优势: 1 信号发生器的
功能测试与仿真实验结果表明 , 时序和波形正确 , 达到了设计的功能要求 ,
说明该设计是行之有效的。2 为了智能化的选择不同信号的波形 , 系统设计了
波形选择调用模块 , 来完成不同函数信号的输出。