波形发生器(VHDL)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

华南理工大学广州学院
数字系统设计(VHDL)课程报告
题目:波形发生器
姓名:
学号:
序号:
学院:
班级:
指导老师:
完成时间: 2014-1-1 __
题目:波形发生器
一、 功能及原理介绍
1、功能介绍
此波形发生器,通过选择“00”、“01”、“10”、“11”,这四种模式来选择相应的
波形输出,除此之外,它还可以产生一些其它的波形,利用MIF 文件生成器产生波形的MIF 文件,由此产生各种波形。

这个波形发生器可以用作信号发生器,产生一些自己所需要的信号。

2、原理介绍
正弦信号发生器的结构由 3 部分组成:数据计数器或地址发生器、数据 ROM 和 D/A 。

性能良好的正弦信 号发生器的设计要求此 3 部分具有高速性能,且数据 ROM 在高速条件下,占用最少的逻辑资源,设计流程最便捷,波 形数据获最方便。

顶层文件any_bo.VHD 在FPGA 中实现,包含2 个部分:ROM 的地址 信号发生器由7 位计数器担任,和正弦数据ROM ,拒此,ROM 由LPM_ROM 模块构成能达到最优设计,LPM_ROM 底层是FPGA 中的EAB 或ESB 等。

地址发生器的时钟CLK 的输入频率 f0 与每周期的波形数据点数(在此选择 128 点)。

2.1.MIF 文件生成器的使用方法
mif 文件就是存储器初始化文件,即memory initialization file ,用来配置RAM 或ROM 中的数据。

而产生MIF 文件的在这里有三种方法:(1)利用Quartus 自带的mif 编辑器、(2)利用mif 软件来生成、(3)用C 语言或者matlab 语言等来生成,而我就利用MIF 文件生成器MIF_Maker 2010来产生MIF 文件。

① 双击打开MIF_Maker 2010,如图
选择模式
00 01
10 11
7位计数器
(地址发生器)
7位计数器
(地址发生器)
7位计数器
(地址发生器)
7位计数器
(地址发生器)
正弦波数据 存储ROM
三角波数据 存储ROM
方波数据 存储ROM
锯齿波数据 存储ROM
正弦波输出 三角波输出 方波输出 锯齿波输出
首先我们对所需要的MIF文件对应的波形参数进行设置,如上图,在“查看”,并于此下拉菜单中选择“全局参数设置”,如选择波形参数:数据长度128,输出数据位宽8,数据格式十六进制(有的情况下需要选择符号类型),初始相位0度,按“确定”后,将会出现一波形编辑窗。

②然后选择波形类型。

选择“设定波形”,再选择“正弦波”,如下图
③若要选择其它的波形也可以,如果要编辑任意波形,可以选择“手绘波形”项,在下拉菜单中选择“线条”,如图,表示可以手工绘制线条。

④最后选择“文件”中的“保存”,将此编辑好的波形文件以MIF格式保存即可。

⑤产生的MIF文件像如下图一样,每对应一个地址就有一个采样数据
2.2.利用LPM_ROM的定制和使用
FPGA中的ROM除了作为数据和程序存储单元外,ROM还有其它的用处,如数字信号发生器的波形数据存储器、查表式计算器的核心工作单元等等。

(1)单击Tools下的MegaWizard Plug-in Mannager管理器按钮,进入如图的LPM模块
(2)选择Memory Compliler中的ROM:1-PORT项,FPGA是CycloneII系列,文本表达选择VHDL,文件名为fang_bo等等,如下图
(3)定制调用此ROM模块的参数设置和初始化条件的配置如下两图
2.3.利用嵌入式逻辑分析仪SignalTapII对输出波形进行显示
利用FPGA片上资源实现逻辑分析仪的功能。

signaltap和你自己的逻辑设计一起被quartus 编译,生成的sof文件中会包含signaltap。

使用时在quartus中打开当前工程,打开stp文件(signaltap的定义文件),把sof下载到器件中就可以开始抓取波形了。

①SignalTap II嵌入逻辑分析仪集成到Quartus II设计软件中,能够捕获和显示可编程单芯片系统(SOPC)设计中实时信号的状态,这样开发者就可以在整个设计过程中以系统级
的速度观察硬件和软件的交互作用。

它支持多达1024个通道,采样深度高达128Kb,每个分析仪均有10级触发输入/输出,从而增加了采样的精度。

SignalTap II为设计者提供了业界领先的SOPC设计的实时可视性,能够大大减少验证过程中所花费的时间。

目前SignalTap II 逻辑分析仪支持的器件系列包括:APEXT II, APEX20KE, APEX20KC, APEX20K, Cyclone, Excalibur, Mercury, Stratix GX, Stratix。

②SignalTap II将逻辑分析模块嵌入到FPGA中,逻辑分析模块对待测节点的数据进行捕获,数据通过JTAG接口从FPGA传送到Quartus II软件中显示。

使用SignalTap II无需额外的逻辑分析设备,只需将一根JTAG接口的下载电缆连接到要调试的FPGA器件。

SignalTap II 对FPGA的引脚和内部的连线信号进行捕获后,将数据存储在一定的RAM块中。

因此,需要用于捕获的采样时钟信号和保存被测信号的一定点数的RAM块。

③使用SignalTap II的一般流程是:设计人员在完成设计并编译工程后,建立SignalTap II (.stp)文件并加入工程、配置STP文件、编译并下载设计到FPGA、在Quartus II软件中显示被测信号的波形、在测试完毕后将该逻辑分析仪从项目中删除。

以下描述设置SignalTap II 文件的基本流程:
A.设置采样时钟。

采样时钟决定了显示信号波形的分辨率,它的频率要大于被测信号的最高频率,否则无法正确反映被测信号波形的变化。

SignalTap II在时钟上升沿将被测信号存储到缓存。

B.设置被测信号。

可以使用Node Finder 中的SignalTap II 滤波器查找所有预综合和布局布线后的SignalTap II 节点,添加要观察的信号。

逻辑分析器不可测试的信号包括:逻辑单元的进位信号、PLL的时钟输出、JTAG引脚信号、LVDS(低压差分)信号。

C.配置采样深度、确定RAM的大小。

SignalTap II所能显示的被测信号波形的时间长度为Tx,计算公式如下:
--- Tx="N"×Ts
--- N为缓存中存储的采样点数,Ts为采样时钟的周期。

D.设置buffer acquisition mode。

buffer acquisition mode包括循环采样存储、连续存储两种模式。

循环采样存储也就是分段存储,将整个缓存分成多个片段(segment),每当触发条件满足时就捕获一段数据。

该功能可以去掉无关的数据,使采样缓存的使用更加灵活。

E.触发级别。

SignalTap II支持多触发级的触发方式,最多可支持10级触发。

F.触发条件。

可以设定复杂的触发条件用来捕获相应的数据,以协助调试设计。

当触发条件满足时,在signalTap时钟的上升沿采样被测信号。

G. 完成STP设置螅玈TP文件同原有的设计下载到FPGA中,在Quartus II中SignalTap II 窗口下查看逻辑分析仪捕获结果。

SignalTap II可将数据通过多余的I/O引脚输出,以供外设的逻辑分析器使用;或输出为csv、tbl、vcd、vwf文件格式以供第三方仿真工具使用。

二、VHDL编程实现
LIBRARY IEEE; --信号发生器源文件
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;--运算符的重载
USE IEEE.STD_LOGIC_ARITH.ALL;
ENTITY any_bo IS
generic(divide_to_100k:integer:=100000;--类属
cnt1_value:integer:=5);
PORT ( RST,EN,CLK: IN STD_LOGIC;--复位信号,时钟信号,计数使能
rw,rs,e:out std_logic;
lcd_data:out std_logic_vector(7 downto 0);
AR1 : OUT STD_LOGIC_VECTOR (6 DOWNTO 0);--正弦波地址测试输出
AR2 : OUT STD_LOGIC_VECTOR (6 DOWNTO 0);--三角波地址测试输出
AR3 : OUT STD_LOGIC_VECTOR (6 DOWNTO 0);--方波地址测试输出
AR4 : OUT STD_LOGIC_VECTOR (6 DOWNTO 0);--锯齿波地址测试输出
cnt : IN STD_LOGIC_VECTOR (0 TO 1) ;--正弦波、三角波、方波、锯齿波的选择模式,00--正弦波,01--三角波,10--方波,11--锯齿波
result : OUT STD_LOGIC_VECTOR (7 DOWNTO 0));--8位波形数据输出
END any_bo;
ARCHITECTURE ONE OF any_bo IS
COMPONENT zheng_xian --调用正弦波形数据存储器LPM_ROM 文件:zheng_xian.vhd 声明
PORT(address1 : IN STD_LOGIC_VECTOR (6 DOWNTO 0);--7 位地址信号
inclock1 : IN STD_LOGIC ;--地址锁存时钟
q1 : OUT STD_LOGIC_VECTOR (7 DOWNTO 0) );
END COMPONENT;
COMPONENT san_jiao --调用三角波形数据存储器LPM_ROM 文件:san_jiao.vhd 声明
PORT(address2 : IN STD_LOGIC_VECTOR (6 DOWNTO 0);--7 位地址信号
inclock2 : IN STD_LOGIC ;--地址锁存时钟
q2 : OUT STD_LOGIC_VECTOR (7 DOWNTO 0) );
END COMPONENT;
COMPONENT fang_bo --调用方波形数据存储器LPM_ROM 文件:fang_bo.vhd 声明
PORT(address3 : IN STD_LOGIC_VECTOR (6 DOWNTO 0);--7 位地址信号
inclock3 : IN STD_LOGIC ;--地址锁存时钟
q3 : OUT STD_LOGIC_VECTOR (7 DOWNTO 0) );
END COMPONENT;
COMPONENT ju_chi --调用锯齿波形数据存储器LPM_ROM 文件:ju_chi.vhd 声明
PORT(address4 : IN STD_LOGIC_VECTOR (6 DOWNTO 0);--7 位地址信号
inclock4 : IN STD_LOGIC ;--地址锁存时钟
q4 : OUT STD_LOGIC_VECTOR (7 DOWNTO 0) );
END COMPONENT;
SIGNAL Q1 : STD_LOGIC_VECTOR (6 DOWNTO 0); --设定内部节点作为地址计数器
SIGNAL Q2 : STD_LOGIC_VECTOR (6 DOWNTO 0); --设定内部节点作为地址计数器
SIGNAL Q3 : STD_LOGIC_VECTOR (6 DOWNTO 0); --设定内部节点作为地址计数器
SIGNAL Q4 : STD_LOGIC_VECTOR (6 DOWNTO 0); --设定内部节点作为地址计数器
SIGNAL out11 : STD_LOGIC_VECTOR (7 DOWNTO 0);--寄存8位正弦波的数据
SIGNAL out22 : STD_LOGIC_VECTOR (7 DOWNTO 0);--寄存8位三角波的数据
SIGNAL out33 : STD_LOGIC_VECTOR (7 DOWNTO 0);--寄存8位方波的数据
SIGNAL out44 : STD_LOGIC_VECTOR (7 DOWNTO 0);--寄存8位锯齿波的数据
signal clk_100k:std_logic;
type state is(s0,s1,s2,s3,s4,s5,s6,S7,S8,S9,s10,s11,s12,s13);
signal current_s:state; --状态机,用来驱动12864显示
type data_buffer_1 is array(0 to 11)of std_logic_vector(7 downto 0);--8位LCD12864数据type data_buffer_2 is array(0 to 11)of std_logic_vector(7 downto 0);-- 8位LCD12864数据type data_buffer_3 is array(0 to 9)of std_logic_vector(7 downto 0); --8位LCD12864数据type data_buffer_4 is array(0 to 11)of std_logic_vector(7 downto 0); --8位LCD12864数据constant
data_buf_1:data_buffer_1:=(x"a3",x"b0",x"a3",x"b0",x"a1",x"c3",x"d5",x"fd",x"cf",x"d2",x"b2",x" a8");---表示”00:正弦波”的字符
constant
data_buf_2:data_buffer_2:=(x"a3",x"b0",x"a3",x"b1",x"a1",x"c3",x"c8",x"fd",x"bd",x"c7",x"b2",x "a8");---表示”01:三角波”的字符
constant
data_buf_3:data_buffer_3:=(x"a3",x"b1",x"a3",x"b0",x"a1",x"c3",x"b7",x"bd",x"b2",x"a8");
---表示”10:方波”的字符
constant
data_buf_4:data_buffer_4:=(x"a3",x"b1",x"a3",x"b1",x"a1",x"c3",x"be",x"e2",x"b3",x"dd",x"b2", x"a8");---表示”11:锯齿波”的字符
--signal FIG:STD_LOGIC_VECTOR (2 DOWNTO 0);
BEGIN
P1:PROCESS(CLK,RST,EN ) --LPM_ROM 地址发生器进程
variable cint:integer range 0 to divide_to_100k;
BEGIN
IF (RST='0') THEN Q1<="0000000";Q2<="0000000";Q3<="0000000";Q4<="0000000";
ELSIF CLK'EVENT AND CLK = '1' THEN cint:=cint+1; --Q1、Q2、Q3、Q4 作为地址发生器计数器
if(cint=divide_to_100k)then cint:=0;
end if;
if(cint<divide_to_100k/2) then clk_100k<='0';
else clk_100k<='1';
end if;
IF (EN='1') THEN Q1<=Q1+1;Q2<=Q2+1;Q3<=Q3+1;Q4<=Q4+1; END IF; END IF;
END PROCESS P1;
AR1<=Q1;
AR2<=Q2;
AR3<=Q3;
AR4<=Q4;
u1 : zheng_xian PORT MAP(address1=>Q1, q1 => out11,inclock1=>CLK);--正弦波的例化
u2 : san_jiao PORT MAP(address2=>Q2, q2 => out22,inclock2=>CLK);--三角波例化
u3 : fang_bo PORT MAP(address3=>Q3, q3 => out33,inclock3=>CLK);--方波例化
u4 : ju_chi PORT MAP(address4=>Q4, q4 => out44,inclock4=>CLK);--锯齿例化
P2:PROCESS(cnt)
BEGIN
CASE cnt IS
WHEN "00" => result<=out11;--输出正弦波数据
WHEN "01" => result<=out22;--输出三角波数据
WHEN "10" => result<=out33;--输出方波波数据
WHEN "11" => result<=out44;--输出锯齿波数据
END CASE;
END PROCESS P2;
P3:process(clk_100k,current_s)
variable cnt1:integer range 0 to 10000;
variable cnt2:integer range 0 to 400;
begin
if(clk_100k'event and clk_100k='1')then
case current_s is
when s0=>
cnt1:=cnt1+1;
if(cnt1<cnt1_value) then
e<='0';--使能先低后高接着再低电平表写完数据
rs<='0';
rw<='0';
elsif(cnt1<2*cnt1_value) then
lcd_data<="00110000";--选择12864的基本模式:
elsif(cnt1<20*cnt1_value) then
e<='1';
elsif(cnt1=20*cnt1_value) then
e<='0';
cnt1:=0;
current_s<=s1;
end if;
when s1=>
cnt1:=cnt1+1;
if(cnt1<cnt1_value) then
e<='0';
rs<='0';
rw<='0';
elsif(cnt1<2*cnt1_value) then
lcd_data<="00110000";
elsif(cnt1<20*cnt1_value) then
e<='1';
elsif(cnt1=20*cnt1_value) then
e<='0';
cnt1:=0;
current_s<=s2;
end if;
when s2=>
cnt1:=cnt1+1;
if(cnt1<cnt1_value) then
e<='0';
rs<='0';
rw<='0';
elsif(cnt1<2*cnt1_value) then
lcd_data<="00001100";--此处用了3次的0x30,起到延时的作用
elsif(cnt1<20*cnt1_value) then
e<='1';
elsif(cnt1=20*cnt1_value) then
e<='0';
cnt1:=0;
current_s<=s3;
end if;
when s3=>
cnt1:=cnt1+1;
if(cnt1<cnt1_value) then
e<='0';
rs<='0';
rw<='0';
elsif(cnt1<2*cnt1_value) then
lcd_data<="00000001"; --12864清零0x01
elsif(cnt1<20*cnt1_value) then
e<='1';
elsif(cnt1=20*cnt1_value) then
e<='0';
cnt1:=0;
current_s<=s4;
end if;
when s4=>
cnt1:=cnt1+1;
if(cnt1<cnt1_value) then
e<='0';
rs<='0';
rw<='0';
elsif(cnt1<2*cnt1_value) then
lcd_data<=x"80"; --显示第一行坐标的地址,从左一位开始
elsif(cnt1<20*cnt1_value) then
e<='1';
elsif(cnt1=20*cnt1_value) then
e<='0';
cnt1:=0;
current_s<=s5;
end if;
when s5=>
cnt1:=cnt1+1;
if cnt1<1*cnt1_value then
e<='0';
rs<='1';
rw<='0';
elsif cnt1<2*cnt1_value then
lcd_data<=data_buf_1(cnt2);--LCD12864写数据
elsif cnt1<20*cnt1_value then
e<='1';
elsif cnt1=20*cnt1_value then
e<='0';
cnt1:=0;
cnt2:=cnt2+1;
if cnt2=12 then---有多少个字符,此cnt2的值也不同
current_s<=s6;
cnt2:=0;
end if;
end if;
when s6=>
cnt1:=cnt1+1;
if(cnt1<cnt1_value) then
e<='0';
rs<='0';
rw<='0';
elsif(cnt1<2*cnt1_value) then
lcd_data<=x"90";显示第二行坐标的地址,从左一位开始
elsif(cnt1<20*cnt1_value) then
e<='1';
elsif(cnt1=20*cnt1_value) then
e<='0';
cnt1:=0;
current_s<=s7;
end if;
when s7=>
cnt1:=cnt1+1;
if cnt1<1*cnt1_value then
e<='0';
rs<='1';
rw<='0';
elsif cnt1<2*cnt1_value then
lcd_data<=data_buf_2(cnt2); --LCD12864写数据
elsif cnt1<20*cnt1_value then
e<='1';
elsif cnt1=20*cnt1_value then
e<='0';
cnt1:=0;
cnt2:=cnt2+1;
if cnt2=12 then---有多少个字符,此cnt2的值也不同
current_s<=s8;
cnt2:=0;
end if;
end if;
when s8=>
cnt1:=cnt1+1;
if(cnt1<cnt1_value) then
e<='0';
rs<='0';
rw<='0';
elsif(cnt1<2*cnt1_value) then
lcd_data<=x"88";显示第三行坐标的地址,从左一位开始
elsif(cnt1<20*cnt1_value) then
e<='1';
elsif(cnt1=20*cnt1_value) then
e<='0';
cnt1:=0;
current_s<=s9;
end if;
when s9=>
cnt1:=cnt1+1;
if cnt1<1*cnt1_value then
e<='0';
rs<='1';
rw<='0';
elsif cnt1<2*cnt1_value then
lcd_data<=data_buf_3(cnt2); --LCD12864写数据
elsif cnt1<20*cnt1_value then
e<='1';
elsif cnt1=20*cnt1_value then
e<='0';
cnt1:=0;
cnt2:=cnt2+1;
if cnt2=10 then---有多少个字符,此cnt2的值也不同
current_s<=s10;
cnt2:=0;
end if;
end if;
when s10=>
cnt1:=cnt1+1;
if(cnt1<cnt1_value) then
e<='0';
rs<='0';
rw<='0';
elsif(cnt1<2*cnt1_value) then
lcd_data<=x"98";显示第四行坐标的地址,从左一位开始
elsif(cnt1<20*cnt1_value) then
e<='1';
elsif(cnt1=20*cnt1_value) then
e<='0';
cnt1:=0;
current_s<=s11;
end if;
when s11=>
cnt1:=cnt1+1;
if cnt1<1*cnt1_value then
e<='0';
rs<='1';
rw<='0';
elsif cnt1<2*cnt1_value then
lcd_data<=data_buf_4(cnt2); --LCD12864写数据
elsif cnt1<20*cnt1_value then
e<='1';
elsif cnt1=20*cnt1_value then
e<='0';
cnt1:=0;
cnt2:=cnt2+1;
if cnt2=12 then---有多少个字符,此cnt2的值也不同
current_s<=s12;
cnt2:=0;
end if;
end if;
when s12=>null;
when s13=>
e<='Z';
rs<='Z';
rw<='Z';
LCD_data<=(others=>'Z');
cnt1:=0;
cnt2:=0;
end case;end if;
END PROCESS P3;
END ONE;
三、仿真波形图
四、引脚设置图
五、下载测试结果分析
五、下载测试结果分析
(1)当cnt=00时—正弦波
分析:
当选择模式为”00”时,每个地址都会对应着一个采样数据,例如:如上图:当地址为0x43时,输出的0x6D,当地址为0x45时,输出为0x67等等,由下表的部分值可知,输出的数据延时了一个周期,不过这也是正确的,这个正弦波形,是ROM的数据线宽8位,地址宽为7位,每个周期采样128个点,即放置128个8位数据,故由输出波形图可知,这个波形是我们所需要的波形,因而正确。

地址43 44 45 46 47 48 49 4A ……
采样值0x6D 0x 67 0x 61 0x 5A 0x 55 0x 4F 0x 49 0x 43
地址53 54 55 56 57 58 59 5A ……
采样值0x 19 0x 15 0x 12 0x 0F 0x 0C 0x 0A 0x 07 0x 05
(2)当cnt=10时--方波
分析:
当选择模式为”10”时,每个地址都会对应着一个采样数据,例如:如上图:当地址为0x73时,输出的0xFF,当地址为0x74时,输出为0xFF等等,由下表的部分值可知,输出的数据延时了一个周期,不过这也是正确的,这个方波形,是ROM的数据线宽8位,地址宽为7位,每个周期采样128个点,即放置128个8位数据,故由输出波形图可知,这个波形也是我们所需要的波形,因而正确。

地址01 02 03 04 05 06 07 08 ……
采样值0x00 0x 00 0x 00 0x 00 0x 00 0x 00 0x 00 0x 00
地址73 74 75 76 77 78 79 7A ……
采样值0x FF 0x FF 0x FF 0x FF 0x FF 0x FF 0x FF 0x FF
(3)当cnt=01时--三角波
分析:
当选择模式为”01”时,每个地址都会对应着一个采样数据,例如:如上图:当地址为0x59时,输出的0x9B,当地址为0x5A时,输出为0x97等等,由下表的部分值可知,输出的数据延时了一个周期,不过这也是正确的,这个三角波形,是ROM的数据线宽8位,地址宽为7位,每个周期采样128个点,即放置128个8位数据,故由输出波形图可知,这个波形也是我们所需要的波形,因而正确。

地址59 5A 5B 5C 5D 5E 5F 60 ……
采样值0x 9B 0x 97 0x 93 0x 8F 0x 8B 0x 87 0x 83 0x 80
地址70 71 72 73 74 75 76 77 ……
采样值0x 40 0x 3C 0x 38 0x 34 0x 30 0x 2C 0x 28 0x 24
(4)当cnt=11时—锯齿波
分析:
当选择模式为”00”时,每个地址都会对应着一个采样数据,例如:如上图:当地址为0x43时,输出的0x6D,当地址为0x45时,输出为0x67等等,由下表的部分值可知,输出的数据延时了一个周期,不过这也是正确的,这个正弦波形,是ROM的数据线宽8位,地址宽为7位,每个周期采样128个点,即放置128个8位数据,故由输出波形图可知,这个波形是我们所需要的波形。

地址30 31 32 33 34 35 36 37 ……
采样值0x5F 0x 61 0x 63 0x 65 0x 67 0x 69 0x 6B 0x 6D
地址40 41 42 43 44 45 46 47 ……
采样值0x 7F 0x 81 0x 83 0x 85 0x 87 0x 89 0x 8B 0x 8D
六、实物图
七、心得体会
今个学期我接触了一门新的课程----EDA技术实用教程(VHDL版),这门课程其实就是数字电路的设计,也是数字电路的综合,有了EDA,那么设计复杂的数字电路也就没有那么复杂,它可以利用强大的FPGA芯片处理更快运行的数据,实时性更高,效率更高,比起那些单一的分立元件好很多,因而在数字电路设计上得到了广泛的应用。

学习EDA这门课程,首先就要学习一门新的语言—VHDL,描述EDA的语言主要有两种,一种是VHDL,另外一种是Verirog,我们这里主要学习VHDL语言,它其实和C语言差不多,像IF、CASE等等这些语句,其用法基本上市一致的,所以理解起来也是很容易的,至于那些我们没有学过的函数,只要我们有了C语言的基础,也是很容易学的。

由于我在大二的时候已经买了一块FPGA的开发板,所以我在学习每一种新的函数的时候都会尽量尝试编译、下载,做到尽量理解这里的内容。

同时,学习EDA也要有一个软件对所设计好的电路进行仿真,在这里我们主要学习QuartusII软件,那些程序的编译、原理图的设计都是用这个软件进行编写的,至于仿真我们可以用QuartusII自身带的插件进行仿真,这主要是为了让我们更好的理解电路的功能特性,验证电路的设计是否正确。

我在设计这个波形发生器的时候,我主要是利用QuartusII这个软件的宏功能模块,因而减少了编写程序的复杂性,然后再对每个波形的端口进行例化。

设计一个比较好的波形发生器,首先就要建立好数学模型,然后再进行总体的构思,最后才进行程序的编写,所以我首先就设计好MIF波形文件,这个文件可以有很多的产生方法,这个文件是设计好设计的关键所在,因而搞好数学的模型很重要。

于此同时,我在选择模式加上了LCD12864显示屏进行演示,要驱动好12864,首选利用状态机进行编程,对LCD12864每个状态都进行相应的操作,以前自己对这个LCD12864的认识并不是有很大的认识,现在我懂得了如何让LCD12864显示更多的功能,还学会了读懂一个元器件的时序图,还懂得了了解基本的命令表,虽然在验收的时候显示屏显示不出相应的内容,但是我在宿舍验证的时候是可以的,显示的内容是可以的,尽管于此,我们总体的结果还是可以得到的,故得到结论,一个好的产品并不是轻易得到的,它需要经过多次的实验,多次的总结方可以得到正确的结论。

课程评语。

相关文档
最新文档