能智函数发生器eda设计--大学毕设论文.doc
湖南商学院EDA技术及应用课程设计(实习)报告题目 智能函数发生器 姓 名:黄亚珍学 号:070910051专 业:电子信息工程班 级:电信0702指导教师:陈勇职 称:副教授计算机与电子工程学院2010年1月课程设计(实习)评审表姓 名黄亚珍学 院电子信息工程学 号070910051专业班级电信0702题 目智能函数发生器评审意见评审成绩指导教师签名职称评审时间 年 月 日课程设计(实习)作品验收表题目智能函数发生器参与人员姓 名黄亚珍班 级电信0702学 号070910051设计任务与要求: 作品完成情况:验收情况: 验收教师签名:_ 年 月 日目 录1 设计任务及要求11.1 设计任务11.2 设计要求12 总体设计方案13 各模块详细设计及实现23.1 下降斜坡信号产生23.1.1 详细设计23.1.2 设计实现23.2 上升斜坡信号产生33.2.1 详细设计33.2.1 设计实现43.3 正弦信号产生43.3.1 详细设计43.3.2 设计实现53.4 阶梯信号产生63.4.1 详细设计63.4.2 设计实现73.5 方波信号产生83.5.1 详细设计83.5.2 设计实现83.6 三角波信号产生93.6.1 详细设计93.6.2 设计实现93.7 信号选择103.7.1 详细设计103.7.2 设计实现113.8 顶层原理图113.8.1 详细设计113.8.2 设计实现124 软件仿真125 硬件实现135.1 引脚锁定135.2 硬件测试146 心得体会156.1 遇到的问题及解决方法156.2 感想15参考文献15附件1623智能函数发生器摘要 自己写关键字 自己写1 设计任务及要求1.1 设计任务 1.2 设计要求2 总体设计方案(自己看书上面有)该设计主要分为8个模块,前6个模块是波形的VHDL描述模块;第七个模块的波形选择模块,也是用VHDL语言进行描述,用于选择何种波形进行最后的输出;最后一个模块是顶层原理图模块,是将前7个模块连接在一起构成完整的只能函数发生器。具体的总体设计方框图如下:顶层原理图波形选择下降斜坡信号方波信号阶梯波信号上升斜坡信号正弦波信号三角波信号图1 总体设计方框图3 各模块详细设计及实现3.1 下降斜坡信号产生3.1.1 详细设计见书3.1.2 设计实现具体VHDL语言描述如下:entity deslope is -实体port (clk,reset:in std_logic; -输入端口定义,为标准逻辑位 q:out std_logic_vector(7 downto 0) -输出端口定义,为8位标准逻辑矢量 );end deslope;architecture behave of deslope is -结构体beginprocess(reset,clk) -进程variable cnt:std_logic_vector (7 downto 0):="11111111" -定义变量CNTbeginif reset='0' then cnt:=(others=>'1'); -当RESET为0时,输出Q为1elsif clk'event and clk='1' then -当时钟上升沿到来时,判断变量CNT if cnt="00000000" then 是否为0,即降到最地点 cnt:=(others=>'1'); -若CNT为0,则置为全1 else cnt:=cnt-1; -否则,CNT减1 end if;end if;q<=cnt; -将CNT赋值给输出信号Qend process; -结束进程end behave; -结构体结束3.2 上升斜坡信号产生3.2.1 详细设计见书3.2.1 设计实现具体VHDL语言描述如下:entity inslope is -实体port (clk,reset:in std_logic; -端口定义 q: out std_logic_vector(7 downto 0 ) );end inslope; -实体结束architecture behave of inslope is -结构体beginprocess(clk,reset) -进程,CLK及RESET为敏感信号variable cnt:std_logic_vector (7 downto 0); -定义变量CNTbeginif reset='0' then cnt:=(others=>'0'); -当RESET为0时,重置为,输出置为0elsif clk'event and clk='1' then -当时钟上升沿到来时,判断CNT是否为 if cnt="11111111" then 最大值 cnt:=(others=>'0'); -若CNT为最大值,置为全0 else cnt:=cnt+1; -否则,CNT加1 end if;end if;q<=cnt; -将变量CNT赋值给输出Qend process; -进程结束end behave; -结构体结束3.3 正弦信号产生3.3.1 详细设计见书3.3.2 设计实现具体VHDL语言描述如下:entity sinwave is -实体port(clk,reset:in std_logic; -端口定义 q:out integer range 0 to 255); -输出为正整数end sinwave; -实体结束architecture behave of sinwave is -结构体beginprocess(clk,reset) -进程variable cnt:integer range 0 to 63; -定义变量CNT为常数beginif reset='0' then q<=0; -若复位信号为0,则输出置为0elsif clk'event and clk='1' then -当时钟信号上升沿到来时 if cnt=63 then -若CNT为63时则置为0 cnt:=0; else -否则,CNT加1,相当于CNT为 cnt:=cnt+1; 一个64进制的计数器 end if;case cnt is -查表输出,根据不同CNT值确定输出Q的值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<=186; 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;end case;end if;end process; -进程结束end behave; -结构体结束3.4 阶梯信号产生3.4.1 详细设计见书3.4.2 设计实现具体的VHDL描述语言如下:entity stair is -实体port(clk,reset:in std_logic; -端口定义 q:out std_logic_vector(7 downto 0) ); end stair;architecture behave of stair is -结构体begin process(clk,reset) -进程variable cnt:std_logic_vector(7 downto 0); -变量定义,计数CNTvariable temp:std_logic; -变量定义,标志TEMPbeginif reset='0' then cnt:=(others=>'0'); -当RESET为0 时,CNT置0elsif clk'event and clk='1' then -当时钟上升沿来到时 if temp='0' then -标志TEMP为0时,进行CNT赋值 if cnt="11111111" then -CNT到最大值时,置0 cnt:=(others=>'0'); temp:='1' else cnt:=cnt+16; temp:='1' -否则,CNT加16(阶梯常数) end if; -CNT值改变后,标志TEMP置1 else temp:='0' -标志TEMP为其他值时,进行TEMP置0 end if; end if;q<=cnt; -将CNT赋值给输出信号Qend process; -进程结束end behave; -结束结构体3.5 方波信号产生3.5.1 详细设计见书。3.5.2 设计实现具体VHDL语言描述如下:entity square is -实体port( clk,reset:in std_logic; -端口定义 q:out std_logic_vector(7 downto 0) );end square; architecture behave of square is -结构体signal temp:std_logic; -定义标志变量TEMPbeginprocess(clk,reset) -进程,敏感信号为CLK,RESETvariable cnt:integer; -定义变量CNT,用于计数beginif reset='0' then temp<='0' -RESET有效时,标志TEMP置为0elsif clk'event and clk='1' then -当时钟信号上升沿到来时 if cnt<63 then -CNT为64进制计数量,到63时置0 cnt:=cnt+1; -否则CNT加1 else cnt:=0; temp<=not temp; -64个时钟周期后,TEMP取反 end if; end if; end process; -进程结束q<= "11111111" when temp='1' else -根据TEMP的值来确定输出 "00000000"end behave; -结构体结束3.6 三角波信号产生3.6.1 详细设计见书3.6.2 设计实现entity triangle is -实体port(clk,reset:in std_logic; -端口定义 q:out std_logic_vector(7 downto 0); end triangle;architecture behave of triangle is -结构体beginprocess(clk,reset) -进程variable cnt:std_logic_vector(7 downto 0); -定义计数变量CNTvariable temp:std_logic; -定义标志变量TEMPbeginif reset='0' then cnt:="00000000" -RESET为0时,CNT为0elsif clk'event and clk='1' then -当时钟上升沿到来时 if temp='0' then -TEMP为0时,CNT递减 if cnt="00000001" then cnt:="00000000" temp:='1' -CNT为最小值时,TEMP值1 else cnt:=cnt-1; end if; elsif temp='1' then -TEMP为1时,CNT递增 if cnt="11111110" then cnt:="11111111" temp:='0' -CNT为最大值时,TEMP置0 else cnt:=cnt+1; end if;end if;end if;q<=cnt; -将CNT赋值给输出信号Qend process; -进程结束end behave; -结构体结束3.7 信号选择3.7.1 详细设计实体部分主要是端口定义。7个输入信号,一个选择信号CHIOCE,D0至D5为输入端口,是8位的标准逻辑矢量。1个输出信号Q。结构体部分描述实体的功能,根据不同的选择信号CHOICE值的不同将端口D0到D5的值从Q进行输出。这部分用的并行条件赋值语句。3.7.2 设计实现具体VHDL语言描述如下:entity select6 is -实体port(choice:in std_logic_vector(2 downto 0); -端口定义 d0,d1,d2,d3,d4,d5:in std_logic_vector(7 downto 0); q:out std_logic_vector(7 downto 0);end select6;architecture behave of select6 isbegin -根据不同CHOICE的值进行选择输出q<=d0 when choice="000" else d1 when choice="001" else d2 when choice="010" else d3 when choice="011" else d4 when choice="100" else d5 ;end behave;3.8 顶层原理图3.8.1 详细设计3个输入信号,选择信号CHICE,时钟信号CLK,复位信号RESET。没个波形的输出端口接选择模块的输入端口D0到D5。当选择信号为0时,输出下降的斜坡信号;当选择信号为1时,输出上升的斜坡信号;当选择信号为2时,输出为正弦波;当选择信号为3时,输出为方波信号。当选择信号为4时,输出为阶梯信号;当选择信号为5时,输出为三角波信号。3.8.2 设计实现具体设计图形如下:图2 顶层原理图4 软件仿真当选择信号取不同值时输出不同的波形。选择信号为0时,输出为下降斜坡:图3 下降斜坡信号输出选择信号为1时,输出为上升斜坡:图4 上升斜坡信号输出选择信号为2时,输出为正弦波:图5 正弦波信号输出选择信号为3时,输出为方波:图6 方波信号输出选择信号为4,输出为阶梯波:图7 阶梯波信号输出选择信号为5时,输出为三角波:图8 三角波信号输出5 硬件实现5.1 引脚锁定首先在MAX+PLUSS II上进行引脚锁定,引脚锁定的具体模式选择1,芯片选择的是EPF10K10LC84-4。其端口的具体对应如下表格:表1 引脚对应表格对应实验箱上的位置端口名称引脚名称对应引脚号键7CLKPIO4881键8RESETPIO4980键1CHOICE0PIO010CHOICE1PIO111CHOICE2PIO212数码管7Q0PIO2439Q1PIO2547Q2PIO2648Q3PIO2749数码管8Q4PIO2850Q5PIO2951Q6PIO3052Q7PIO31535.2 硬件测试你就描述下功能6 心得体会6.1 遇到的问题及解决方法自己写。6.2 感想自己参考文献1朱正伟.EDA技术及应用M.北京:清华大学出版社,20052沈明山.EDA技术及可编程器件应用实例M.北京:科学出版社,20043 杨恒. FPGA/VHDL快速工程实践入门与提高M.北京:北京航空航天大学出版社,2003附件各模块VHDL语言描述及原理图设计。上升斜坡波形设计:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity inslope isport (clk,reset:in std_logic; q: out std_logic_vector(7 downto 0 ) );end inslope;architecture behave of inslope isbeginprocess(clk,reset)variable cnt:std_logic_vector (7 downto 0);beginif reset='0' then cnt:=(others=>'0');elsif clk'event and clk='1' then if cnt="11111111" then cnt:=(others=>'0'); else cnt:=cnt+1; end if;end if;q<=cnt;end process;end behave;下降斜坡波形设计:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity deslope isport (clk,reset:in std_logic; q:out std_logic_vector(7 downto 0) );end deslope;architecture behave of deslope isbeginprocess(reset,clk)variable cnt:std_logic_vector (7 downto 0):="11111111"beginif reset='0' then cnt:=(others=>'1');elsif clk'event and clk='1' then if cnt="00000000" then cnt:=(others=>'1'); else cnt:=cnt-1; end if;end if;q<=cnt;end process;end behave;正弦波设计:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity sinwave isport(clk,reset:in std_logic; q:out integer range 0 to 255);end sinwave;architecture behave of sinwave isbeginprocess(clk,reset)variable cnt:integer range 0 to 63;beginif reset='0' then q<=0;elsif clk'event and clk='1' then if cnt=63 then cnt:=0; else cnt:=cnt+1; end if;case cnt 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<=186; 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;end case;end if;end process;end behave;阶梯波设计:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity stair isport(clk,reset:in std_logic; q:out std_logic_vector(7 downto 0) );end stair;architecture behave of stair isbegin process(clk,reset)variable cnt:std_logic_vector(7 downto 0);variable temp:std_logic;beginif reset='0' then cnt:=(others=>'0');elsif clk'event and clk='1' then if temp='0' then if cnt="11111111" then cnt:=(others=>'0'); temp:='1' else cnt:=cnt+16; temp:='1' end if; else temp:='0' end if;end if;q<=cnt;end process;end behave;方波设计:library ieee;use ieee.std_logic_1164.all;entity square isport( clk,reset:in std_logic; q:out std_logic_vector(7 downto 0) );end square;architecture behave of square is signal temp:std_logic;beginprocess(clk,reset)variable cnt:integer;beginif reset='0' then temp<='0'elsif clk'event and clk='1' then if cnt<63 then cnt:=cnt+1; else cnt:=0; temp<=not temp; end if;end if; end process;q<= "11111111" when temp='1' else "00000000"end behave;三角波设计:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity triangle isport(clk,reset:in std_logic; q:out std_logic_vector(7 downto 0) ); end triangle;architecture behave of triangle isbeginprocess(clk,reset)variable cnt:std_logic_vector(7 downto 0);variable temp:std_logic;beginif reset='0' then cnt:="00000000"elsif clk'event and clk='1' then if temp='0' then if cnt="00000001" then cnt:="00000000" temp:='1' else cnt:=cnt-1; end if; elsif temp='1' then if cnt="11111110" then cnt:="11111111" temp:='0' else cnt:=cnt+1; end if; end if;end if;q<=cnt;end process;end behave;选择模块设计:library ieee;use ieee.std_logic_1164.all;entity select6 isport(choice:in std_logic_vector(2 downto 0); d0,d1,d2,d3,d4,d5:in std_logic_