存档资料 成绩:
华东交通大学理工学院 课 程 设 计 报 告 书
所属课程: EDA技术及应用 设计题目: 正弦函数信号发生器的设计 分 院: 电 信 分 院 班 级: 通信工程 2008级 2班 姓 名: 骆 玉 春 学 号: 20080210420224 指导教师: 王 涛 实验地点: 实验楼五楼(EDA实验室506)
2010 年 6 月 19 日
华东交通大学理工学院
课程设计任务书
专业:08通信工程 班级: 2班 姓名: 骆玉春
一、课程设计题目
正弦函数信号发生器的设计 二、课程设计工作:自 2011 年 6月 16 日起至 2011 年 6 月20 日止。
三、课程设计的内容要求:
1、识别各种Quartus II软件中各元件及其图形表示和文字符号。 2、学会如何使用Quartus II。 3、掌握VHDL语言的编程思想和VHDL语言的基本使用规则。 4、熟练掌握正弦函数信号发生器的工作原理,并读懂源程序。 5、按照编译、调试、仿真的正确步骤,并正确进行调试和仿真。 6、学会分析仿真图。
学生签名: 2011年 6月 19日
课程设计评阅意见
等 级 序号 项 目 优秀 良好 中等 及格 不及格 1 2 3 4 5 6 7 8 课程设计态度评价 出勤情况评价 任务难度评价 工作量饱满评价 任务难度评价 设计中创新性评价 论文书写规范化评价 综合应用能力评价 综合评定等级
评阅人 职称
2011 年 月 日
目 录
课程设计评阅意见 ........................................................... 1 目 录 ................................................................... 2 第一章 设计目的 ........................................................... 3 第二章 设计要求 ........................................... 错误!未定义书签。 第三章 设计内容 ........................................................... 3 第四章 设计原理 ........................................................... 3 第五章 设计步骤 ........................................................... 4 5.1建立.mif格式文件...................................................... 4 5.2建立.hex格式文件...................................................... 5 5.3定制LPM_ROM........................................................... 5 5.4完成顶层设计 ......................................................... 11 第六章 课程设计总结 ....................................................... 13 参考文献 .................................................................. 14
第一章 设计目的
进一步熟悉QuartusII 6.0及其LPM_ROM与FPGA硬件资源的使用方法。培养动手能力以及谐作能力。
第二章 设计要求
1、CLK为12MHz。
2、通过DAC0832输出正弦波电压信号,电压范围0~-5V。 3、通过仿真观察波形。
第三章 设计内容
在Quartus II上完成正弦波信号发生器的设计,包括仿真和资源利用情况了解(假设利用Cyclone器件)。最后在实验系统上实测,包括FPGA中ROM的在系统数据读写测试和仿真测试。信号输出的D/A使用实验系统上的DAC0832。
第四章 设计原理
正弦波信号发生器的结构由四部分组成: 1、计数器或地址发生器(这里选择6位)。
2、正弦信号数据ROM(6位地址线,8位数据线),含有64个8位数据(一个周期)。
3、VHDL顶层设计。
4、8位D/A(实验中可用ADC0832代替)。
图1所示的信号发生器结构框图中,顶层文件singt.vhd在FPGA中实现,包含两个部分:ROM的地址信号发生器,由6位计数器担任;一个正弦数据ROM,由LPM_ROM模块构成。LPM_ROM底层是FPGA中的M4K模块。地址发生器的时钟CLK的输入频率与每周期的波形数据点数(在此选择64点),以及D/A输出的频率f的关系是:f=fo/64
6位计数器 (地址发生器) VHDL顶层设计 singt.vhd 正弦波数据 存储ROM 8位D/A 波形数据 输出 图1 正弦信号发生器结构框图
第五章 设计步骤
首先确定如图1中所示的波形数据文件。Quartus II能接受的LPM_ROM模块中的初始化数据文件的格式有两种:Memory Initialization File文件(.mif 文
件)格式和Hexadecimal(Intel-Format)File文件(.hex文件) 格式 。
5.1建立.mif格式文件
首先在Quartus II中选择ROM数据文件编辑窗口,即在File菜单中选择New并在New窗口选择Other file页,再选择Memory Initialization File项,单击OK按钮后产生ROM数据文件大小选择窗口。根据64点8位正弦数据的情况,可选ROM的数据数Number为64位,数据宽Word size取8位。单击OK按钮,将出现如图2所示的空的mif数据表格,表格中的数据格式可通过鼠标右键单击窗口边缘的地址数据弹出窗口选择。此表中任一数据(如第三行的99)对应的地址为左列与顶行数之和(如16+2=18,十六进制为12,即00010010)。然后将波形数据填入此表中。最后在File菜单单击Save as按钮,保存此数据文件,这里不妨取名romd.mif。
图2 将波形数据填入mif文件表中
5.2建立.hex格式文件
建立.hex格式文件,与建立.mif格式文件方法相同,只是在New窗口中选择Other file 项后,选择Hexadecimal(Inter-Format) File项,最后存盘.hex格式文件。如图3所示。
图3 将波形数据填入hex文件表转换成十六进制的数据表
5.3定制LPM_ROM
在设计正弦波信号发生器前,必须首先完成存放波形数据ROM的设计。利用MegaWizard Plug-In manager定制正弦信号数据ROM宏功能块,并将以上的波形数据加载于此ROM中。设计步骤如下:
(1)打开 MegaWizard Plug-In manager 初始对话框。在 Tools 菜单中选择MegaWizard Plug-In manager产生一个对话框,选择Create a new custom...项,即定制一个新的模块。单击Next按钮后,在所产生的对话框的左栏选择Storage项下的LPM_ROM,再选择Cyclone器件和VHDL语言方式;最后输入ROM文件存放的路径和文件名,单击Next按钮。
(2)选择ROM控制线、地址线和数据线。在弹出的对话框中选择地址线位宽和ROM中数据数分别为6和64;选择地址锁存控制信号inclock。
(3)单击Next按钮在对话框的“What should the RAM…”栏选择默认的Auto。在栏选择“Do you want to…Yes,use this file for memory content data”项,并按Browse钮,选择指定路径上的文件data_rom.mif。在“Allow In-System Memory…”栏选择打勾,并在“The Instance ID of this ROM”栏输入ROM1,作为ROM的ID名称。最后单击Next按钮,再单击Finish 按钮后完成ROM定制。
(4)打开此文件可以看到其中调用初始化数据文件的语句为:init_file => \"sdata.mif\"。其中的init_file指向已做了修改。修改后用于例化的波形数据ROM文件data_rom.vhd如下。
data_rom.vhd 源代码:
-- megafunction wizard: %LPM_ROM% -- GENERATION: STANDARD -- VERSION: WM1.0 -- MODULE: altsyncram
-- ============================================================ -- File Name: data_rom.vhd -- Megafunction Name(s): -- altsyncram
-- ============================================================ -- ************************************************************ -- THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE! -- 6.0 Build 178 04/27/2006 SJ Full Version
-- ************************************************************ -- Copyright (C) 1991-2006 Altera Corporation
-- Your use of Altera Corporation's design tools, logic functions -- and other software and tools, and its AMPP partner logic -- functions, and any output files any of the foregoing -- (including device programming or simulation files), and any -- associated documentation or information are expressly subject -- to the terms and conditions of the Altera Program License -- Subscription Agreement, Altera MegaCore Function License -- Agreement, or other applicable license agreement, including, -- without limitation, that your use is for the sole purpose of -- programming logic devices manufactured by Altera and sold by -- Altera or its authorized distributors. Please refer to the -- applicable agreement for further details.
LIBRARY ieee; --库说明
USE ieee.std_logic_1164.all; --调用程序包 LIBRARY altera_mf;
USE altera_mf.all; --使用宏功能库中的所有元件
ENTITY data_rom IS --定义实体(正弦波数据存储器)
PORT --data_rom 端口说明
( address: IN STD_LOGIC_VECTOR (5 DOWNTO 0);
inclock: IN STD_LOGIC ;
q: OUT STD_LOGIC_VECTOR (7 DOWNTO 0));
END data_rom; --结束定义实体
ARCHITECTURE SYN OF data_rom IS --定义结构体
SIGNAL sub_wire0 : STD_LOGIC_VECTOR (7 DOWNTO 0); COMPONENT altsyncram --例化altsyncram元件;调用LPM模块
altsyncram
GENERIC ( --参数传递语句
address_aclr_a: STRING; init_file: STRING;
intended_device_family: STRING;--类属参量数据类型定义 lpm_hint: STRING; lpm_type: STRING; numwords_a : NATURAL; operation_mode: STRING; outdata_aclr_a: STRING; outdata_reg_a: STRING; widthad_a: NATURAL; width_a: NATURAL;
width_byteena_a: NATURAL);
PORT ( --altsyncram元件接口说明
clock0: IN STD_LOGIC ;
address_a: IN STD_LOGIC_VECTOR (5 DOWNTO 0); q_a: OUT STD_LOGIC_VECTOR (7 DOWNTO 0) );
END COMPONENT;
BEGIN
q<= sub_wire0(7 DOWNTO 0); altsyncram_component: altsyncram GENERIC MAP (
address_aclr_a => \"NONE\无异步地址清零
init_file => \"D:/myproject/zidata/sdata.hex\初始化数
据文件,此处已修改过
)
PORT MAP (
clock0 => inclock,address_a => address,q_a => sub_wire0); intended_device_family => \"Cyclone\参数传递映射 lpm_hint => \"ENABLE_RUNTIME_MOD=NO\lpm_type => \"altsyncram\数据类型 numwords_a => 64, --数据数量64 operation_mode => \"ROM\模式ROM outdata_aclr_a => \"NONE\无输出锁存异步清0 outdata_reg_a => \"UNREGISTERED\输出无锁存 widthad_a => 6, --地址线宽度6 width_a => 8, --数据线宽度8
width_byteena_a => 1 --byteena_a输入口宽度为1
END SYN;
-- ============================================================ -- CNX file retrieval info
-- ============================================================ -- Retrieval info: PRIVATE: ADDRESSSTALL_A NUMERIC \"0\" -- Retrieval info: PRIVATE: AclrAddr NUMERIC \"0\" -- Retrieval info: PRIVATE: AclrByte NUMERIC \"0\" -- Retrieval info: PRIVATE: AclrOutput NUMERIC \"0\" -- Retrieval info: PRIVATE: BYTE_ENABLE NUMERIC \"0\" -- Retrieval info: PRIVATE: BYTE_SIZE NUMERIC \"8\" -- Retrieval info: PRIVATE: BlankMemory NUMERIC \"0\"
-- Retrieval info: PRIVATE: CLOCK_ENABLE_INPUT_A NUMERIC \"0\" -- Retrieval info: PRIVATE: CLOCK_ENABLE_OUTPUT_A NUMERIC \"0\" -- Retrieval info: PRIVATE: Clken NUMERIC \"0\"
-- Retrieval info: PRIVATE: IMPLEMENT_IN_LES NUMERIC \"0\" -- Retrieval info: PRIVATE: INIT_FILE_LAYOUT STRING \"PORT_A\" -- Retrieval info: PRIVATE: INIT_TO_SIM_X NUMERIC \"0\"
-- Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING \"Cyclone\" -- Retrieval info: PRIVATE: JTAG_ENABLED NUMERIC \"0\" -- Retrieval info: PRIVATE: JTAG_ID STRING \"NONE\" -- Retrieval info: PRIVATE: MAXIMUM_DEPTH NUMERIC \"0\" -- Retrieval info: PRIVATE: MIFfilename STRING \"D:/myproject/zidata/sdata.hex\"
-- Retrieval info: PRIVATE: NUMWORDS_A NUMERIC \"64\" -- Retrieval info: PRIVATE: RAM_BLOCK_TYPE NUMERIC \"0\" -- Retrieval info: PRIVATE: RegAddr NUMERIC \"1\" -- Retrieval info: PRIVATE: RegOutput NUMERIC \"0\" -- Retrieval info: PRIVATE: SingleClock NUMERIC \"0\" -- Retrieval info: PRIVATE: UseDQRAM NUMERIC \"0\" -- Retrieval info: PRIVATE: WidthAddr NUMERIC \"6\" -- Retrieval info: PRIVATE: WidthData NUMERIC \"8\"
-- Retrieval info: CONSTANT: ADDRESS_ACLR_A STRING \"NONE\"
-- Retrieval info: CONSTANT: INIT_FILE STRING \"D:/myproject/zidata/sdata.hex\"
-- Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING \"Cyclone\" -- Retrieval info: CONSTANT: LPM_HINT STRING \"ENABLE_RUNTIME_MOD=NO\" -- Retrieval info: CONSTANT: LPM_TYPE STRING \"altsyncram\" -- Retrieval info: CONSTANT: NUMWORDS_A NUMERIC \"64\" -- Retrieval info: CONSTANT: OPERATION_MODE STRING \"ROM\" -- Retrieval info: CONSTANT: OUTDATA_ACLR_A STRING \"NONE\" -- Retrieval info: CONSTANT: OUTDATA_REG_A STRING \"UNREGISTERED\" -- Retrieval info: CONSTANT: WIDTHAD_A NUMERIC \"6\" -- Retrieval info: CONSTANT: WIDTH_A NUMERIC \"8\"
-- Retrieval info: CONSTANT: WIDTH_BYTEENA_A NUMERIC \"1\" -- Retrieval info: USED_PORT: address 0 0 6 0 INPUT NODEFVAL address[5..0]
-- Retrieval info: USED_PORT: inclock 0 0 0 0 INPUT NODEFVAL inclock -- Retrieval info: USED_PORT: q 0 0 8 0 OUTPUT NODEFVAL q[7..0] -- Retrieval info: CONNECT: @address_a 0 0 6 0 address 0 0 6 0 -- Retrieval info: CONNECT: q 0 0 8 0 @q_a 0 0 8 0
-- Retrieval info: CONNECT: @clock0 0 0 0 0 inclock 0 0 0 0 -- Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all
-- Retrieval info: GEN_FILE: TYPE_NORMAL data_rom.vhd TRUE -- Retrieval info: GEN_FILE: TYPE_NORMAL data_rom.inc FALSE -- Retrieval info: GEN_FILE: TYPE_NORMAL data_rom.cmp TRUE -- Retrieval info: GEN_FILE: TYPE_NORMAL data_rom.bsf TRUE
-- Retrieval info: GEN_FILE: TYPE_NORMAL data_rom_inst.vhd FALSE2) 定制好LPM模块后应将其设置成工程进行仿真测试,以确保其功能的可靠,并熟悉该元件的时序情况。对于LPM_ROM,通过仿真测试了解数据文件是否被加载进去。
5.4完成顶层设计
顶层的设计主要包括编辑顶层文件、创建工程、全程编译、观察RTL电路图、仿真、了解时序分析结果、引脚锁定、等等。
(1)信号发生器的顶层设计文件如下所示: library ieee; --库说明
use ieee.std_logic_1164.all; --引用程序包 use ieee.std_logic_unsigned.all; --引用程序包 entity singt is --定义信号发生器实体 port( clk: in std_logic; --信号源时钟
dout: out std_logic_vector(7 downto 0)); --8位波形数据输出
end singt; --结束实体定义
architecture dacc of singt is --定义结构体
component data_rom --调用波形数据存储器LPM_ROM,data_rom.vhd声明 port( address: in std_logic_vector(5 downto 0); --6位地址信号
inclock: in std_logic; --地址锁存时钟
q: out std_logic_vector(7 downto 0));
end component; 数器
begin
signal q1:std_logic_vector(5 downto 0); --设内部节点作为地址计
process(clk) --LPM_ROM地址发生进程 begin
if clk'event and clk='1' then q1<=q1+1;--Q1作为地址发生器计数器
end if; end process;
u1: data_rom port map (address=>q1,q=>dout,inclock=>clk); --例化 end dacc; --结束结构体,结束本程序
2)为此顶层设计创建一项工程,工程名和实体名都是singt。
3)全程编译一次后进入时序仿真测试。图4是仿真过程截图,由波形可见,
随着每一个时钟上升沿的到来,输出端口将正弦波数据依次输出。
图4 仿真波形输出图
第六章 课程设计总结
在本次设计的过程中,我在编译过程中出现问题,第一个问题出在定制LPM_ROM的过程中,我按照书上的指导一步步进行下去,可是到最后还是没编译出来,后来在老师和同学的指导下,发现问题所在,因我用的quartus软件版本太低, 后来在重新安装了一个更高版本的软件,即quartus6.0版本,本以为这样就没问题了,当我把第一个问题解决完的时候,第二个问题接踵而至。
第二个问题出现在完成存放波形数据ROM的设计过程中,没有正确的选择指定路径文件名romd.mif导致用于例化的波形数据ROM文件data_rom.vhd编译失败,经过同学的指导和我的思考和分析后,我正确的选择指定路径文件名romd.mif,这样编译正确通过。第三个问题是,在仿真的过程中,我对仿真的具体流程不太熟悉,因为平时做实验都用的是max+plus2软件在进行编译仿真,最后,在老师和同学的热情帮助下,顺利完成仿真。并熟练地掌握了quartus的使用方法。在这次设计中,我也深深地体会到“细节决定成败”这句话的真正含义,也许就因为一个小的细节就会导致设计的失败。这次设计也启发了我在以后的学习中一定要耐心、细心、认真,不可粗枝大叶,不懂的时候一定得虚心向别人请教。
参 考 文 献
[1] 潘松、黄继业. EDA实用教程. 北京:科学出版社,2006
[2] 沈明山编著.EDA技术及可编程器件应用实训 北京:科学出版社,2004 [3] 崔建明主编.电工电子EDA仿真技术 北京:高等教育出版社,2004 [4] 侯继红.李向东主编,EDA实用技术教程 北京:中国电力出版社,2004 [5] 李衍编著.EDA技术入门与提高王行 西安:西安电子科技大学出版社,2005
[6] 林明权等编著.马维旻改编,VHDL数字控制系统设计范例 北京:电子工业出版社,2003
[7] 辛春艳编著.VHDL硬件描述语言 北京:国防工业出版社,2002
因篇幅问题不能全部显示,请点此查看更多更全内容