当前位置首页 > 电子工程/通信技术 > GSM/GPRS/EDGE
搜柄,搜必应! 快速导航 | 使用教程  [会员中心]

EDA课程设计GSM通讯机的VHDL设计及仿真

文档格式:DOC| 19 页|大小 841KB|积分 10|2021-11-07 发布|文档ID:38458314
第1页
下载文档到电脑,查找使用更方便 还剩页未读,继续阅读>>
1 / 19
此文档下载收益归作者所有 下载文档
  • 版权提示
  • 文本预览
  • 常见问题
  • 课程设计说明书 NO.1GSM通讯机的VHDL设计及仿真1.课程设计的目的 EDA技术及应用课程设计是学习EDA技术及应用课程之后的实践教学环节其目的是训练学生综合运用学过的《EDA技术及应用》的基础知识,通过解决比较简单的实际问题巩固和加深在《EDA技术及应用》课程中所学的理论知识和实验技能独立完成查找资料,选择方案,设计电路,安装调试,分析结果,撰写报告等工作使学生进一步理解所学本课程的内容,初步掌握模拟电子电路设计的一般方法步骤,通过理论联系实际提高和培养学生并理论联系实际提高和培养学生的分析、解决实际问题的能力,创新能力及动手能力,为后续课程的学习、毕业设计、毕业后的工作打下基础2.设计方案论证2.1软件介绍 Max+plusⅡ是Altera公司提供的FPGA/CPLD开发集成环境,Altera是世界上最大可编程逻辑器件的供应商之一Max+plusⅡ界面友好,使用便捷,被誉为业界最易用易学的EDA软件在Max+plusⅡ上可以完成设计输入、元件适配、时序仿真和功能仿真、编程下载整个流程,它提供了一种与结构无关的设计环境,是设计者能方便地进行设计输入、快速处理和器件编程。

      Max+plusⅡ开发系统的特点:(1)、开放的界面,Max+plusⅡ支持与Cadence,Exemplarlogic,Mentor Graphics,Synplicty,Viewlogic和其它公司所提供的EDA工具接口2)、与结构无关,Max+plusⅡ系统的核心Complier支持Altera公司的FLEX10K、FLEX8000、FLEX6000、MAX9000、MAX7000、MAX5000和Classic可编程逻辑器件,提供了世界上唯一真正与结构无关的可编程逻辑设计环境3)、完全集成化,Max+plusⅡ的设计输入、处理与较验功能全部集成在统一的开发环境下,这样可以加快动态调试、缩短开发周期4)、丰富的设计库,Max+plusⅡ提供丰富的库单元供设计者调用,其中包括74系列的全部器件和多种特殊的逻辑功能(Macro-Function)以及新型的参数化的兆功能(Mage-Function) 沈 阳 大 学 课程设计说明书 NO.2(5)、模块化工具,设计人员可以从各种设计输入、处理和较验选项中进行选择从而使设计环境用户化。

    6)、硬件描述语言(HDL),Max+plusⅡ软件支持各种HDL设计输入选项,包括VHDL、Verilog HDL和Altera自己的硬件描述语言AHDL7)、Opencore特征,Max+plusⅡ软件具有开放核的特点,允许设计人员添加自己认为有价值的宏函数2.2设计方案2.2.1 实现功能 (1)显示系统当前运行状态,由VGA接口输出,在液晶屏上以640*480分辨率显示; (2)实时检测输入设备,对GSM模块进行操控,输入设备采用PS/2接口键盘; (3)通过RS232接口连接GSM模块,采用UART标准进行全双工通信,发送AT命令控制GSM模块,GSM模块返回信息通过UART由系统接收并做出相应处理; (4)支持GSM拨号功能; (5)支持短信收发功能,并可实时查阅、删除已有短信; (6)编辑模式可通过BackSpace键删除误输入; (7)支持来电号码显示,并周期性发出来电铃声; (8)支持新短信显示提示,并发出一声短信提示音; (9)支持中文菜单显示,通过上下箭头按键选择不同菜单项; (10)界面支持字体变色、动态滚动效果2.2.2系统框图 沈 阳 大 学 课程设计说明书 NO.3 FPGA主控制器液晶显示器PS/2接口键盘GSM模块VGAPS/2UART图1 GSM系统框图由上图可见,主控制器通过3个接口分别连接了3个硬件,对应不同接口应该独立地进行处理,所以必须对主控制器进行模块划分。

    3.设计结果与分析模块1:分频 功能描述:将50MHz时钟源进行分频,提供给VGA模块(25MHz)和UART模块,其中UART模块为波特率可调,通过改变CNT_RS232的值实现不同的波特率 具体代码:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY FREQUENCY IS GENERIC ( CNT_RS232:INTEGER:=163; CNT_VGA: INTEGER:=1); PORT( CLK:IN STD_LOGIC; CLK_RS232:OUT STD_LOGIC; CLK_VGA:OUT STD_LOGIC);END ENTITY;ARCHITECTURE FREQUENCY_DIV OF FREQUENCY ISBEGIN 沈 阳 大 学 课程设计说明书 NO.4 PROCESS (CLK)VARIABLE REG_RS232:STD_LOGIC :=0; VARIABLE REG_VGA:STD_LOGIC :=0; VARIABLE TEMP_RS232:INTEGER RANGE 0 TO CNT_RS232; VARIABLE TEMP_VGA:INTEGER RANGE 0 TO CNT_VGA; BEGIN IF (CLKEVENT AND CLK=1) THEN TEMP_RS232:=TEMP_RS232+1; TEMP_VGA:=TEMP_VGA+1; IF (TEMP_RS232=CNT_RS232) THEN REG_RS232:=NOT REG_RS232; TEMP_RS232:=0; CLK_RS232<=REG_RS232; END IF; IF (TEMP_VGA=CNT_VGA) THEN REG_VGA:=NOT REG_VGA; TEMP_VGA:=0; CLK_VGA<=REG_VGA; END IF; END IF; END PROCESS;END ARCHITECTURE; 将以上程序写入MAX+pluwe2中进行编译仿真,可得如下结果。

    图2 frequency元件图 沈 阳 大 学 课程设计说明书 NO.5图3 对 frequency程序的仿真结果图 模块2:PS/2 Keyboard 功能描述:接收键盘的时钟源PS2_CLK,并进行平滑处理,接收完一个按键相应输出按键的通码MakeCode和触发信号TRIG,另外输出平滑后的键盘时钟信号PS2_CLKsm,为接收模块提供同步时钟 具体代码:library ieee;use ieee.std_logic_1164.all;entity PS2keyboard is port(CLK,PS2_CLK,PS2_DATA: in std_logic; TRIG:out std_logic; MAKE_CODE: out std_logic_vector(7 downto 0); PS2_CLKsm: out std_logic);end entity;architecture code of PS2keyboard istype state_type is(S1,S2);type cache_type is array(2 downto 0) of std_logic_vector(7 downto 0);signal smooth_ps2_clk:std_logic;begin smooth:process(CLK) variable cnt:integer range 0 to 7; variable scan:std_logic_vector(7 downto 0); begin if falling_edge(CLK) then scan(cnt):=PS2_CLK; 沈 阳 大 学 课程设计说明书 NO.6if cnt=7 then cnt:=0; else cnt:=cnt+1; end if; if scan="11111111" then smooth_ps2_clk<=1; elsif scan="00000000" then smooth_ps2_clk<=0; end if; end if; end process smooth; receive:process(smooth_ps2_clk) variable cnt:integer range 0 to 10; variable count:integer range 0 to 2; variable pstate:state_type; variable cache:cache_type; variable reg:std_logic_vector(10 downto 0); begin if falling_edge(smooth_ps2_clk) then reg(cnt):=PS2_DATA; if cnt=10 then cnt:=0; if count=1 and reg(8 downto 1)/=X"F0" then count:=0; end if; cache(count):=reg(8 downto 1 ); if count=0 then count:=count+1; MAKE_CODE<=cache(0); TRIG<=1; elsif count=2 then count:=0; MAKE_CODE<=cache(0); TRIG<=0;else count:=count+1;TRIG<=0;MAKE_CODE<=cache(0);end if; else cnt:=cnt+1; end if; end if;end process receive; PS2_CLKsm<=smooth_ps2_clk; 沈 阳 大 学 课程设计说明书 NO.7end architecture;将以上程序写入MAX+pluwe2中进行编译仿真,可得如下结果。

    图4 ps2keyboard元件图图5 对 ps2keyboard的程序仿真图模块3:UART模块功能描述:分为发送模块和接收模块发送模块由DATA_IN接收数据,由SEND_MARK触发,将数据从TXD发送出去接收模块采用16倍频采样,确保不会出现误判,从RXD接收完数据后,触发RECE_MARK信号,将接收到的数据从DATA_OUT输送出去具体代码:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;entity uart_withoutParity is port( CLK_UART:in std_logic;TXD:out std_logic; RXD:in std_logic; SEND_MARK:in std_logic; 沈 阳 大 学 课程设计说明书 NO.8RECE_MARK:out std_logic; --1 when finished receiving DATA_IN: in std_logic_vector(7 downto 0); DATA_OUT:out std_logic_vector(7 downto 0));end entity;architecture code of uart_withoutParity is type send_state is(S1,S2,S3,S4); type rece_state is(R0,R1,R2);beginsend:process(CLK_UART) variable samp: integer range 0 to 16:=0; variable temp: std_logic_vector(7 downto 0); variable cnt: integer range 0 to 8:=0; variable sp_state: send_state; begin if (CLK_UARTevent and CLK_UART=1) then case sp_state is when S1 => txd<=1; samp:=0; if SEND_MARK=1 then sp_state:=S2; else sp_state:=S1; end if; when S2 => temp:=DATA_IN; txd<=0; samp:=samp+1; if samp=16 then samp:=0; cnt:=0; sp_state:=S3; else sp_state:=S2; end if; when S3 => txd<=temp(0); samp:=samp+1; if samp=16 then samp:=0; temp:=0&temp(7 downto 1); cnt:=cnt+1; 沈 阳 大 学 课程设计说明书 NO.9if cnt=8 then sp_state:=S4; else sp_state:=S3; end if; end if; when S4 => txd<=1; samp:=samp+1; if samp=15 then samp:=0; sp_state:=S1; end if; when others=> sp_state:=S1; end case; end if;end process send;receive:process(CLK_UART) variable rp_state:rece_state; variable reg: std_logic_vector(7 downto 0); variable cnt: integer range 0 to 16; variable count: integer range 0 to 8; begin if CLK_UARTevent and CLK_UART=1 then case rp_state is when R0=> RECE_MARK<=0; reg:=(others=>0); if RXD=0 then cnt:=cnt+1; if cnt=8 then rp_state:=R1; end if; else cnt:=0; end if; when R1=> cnt:=cnt+1; if cnt=16 then cnt:=0; end if; if cnt=8 then reg:=RXD®(7 downto 1); 沈 阳 大 学 课程设计说明书 NO.10count:=count+1; if count=8 then count:=0;cnt:=0;rp_state:=R2; end if; end if; when R2=> DATA_OUT<=reg(7 downto 0); RECE_MARK<=1; cnt:=cnt+1; if cnt=16 then cnt:=0;rp_state:=R0; end if; when others=> rp_state:=R0; end case; end if;end process receive;end architecture; 将以上程序写入MAX+pluwe2中进行编译仿真,可得如下结果。

    图6 uart_withoutParity元件图 沈 阳 大 学 课程设计说明书 NO.11图7对uart_withoutParity程序仿真图 模块4VGA接口 VGA模块由3个子模块组成,分别是CONTENT、VGA、VGA_DIV,其中VGA_DIV模块将显示器分割成20*15个小块,VGA模块输出信号至显示器,CONTENT模块包含了所要显示的内容,还包括了键盘按键的判断、UART的缓存数据,还是整个系统主要的状态控制器将这3个模块用component语句进行例化,生成VGA_interface模块,再在顶层的Block Diagram文件进行调用,减少了顶层文件连线的复杂性 VGA的VHDL源代码如下:library ieee;use ieee.std_logic_1164.all;entity VGA isport( CLK_VGA:in std_logic; HS,VS:out std_logic; RGB:out std_logic_vector (2 downto 0); RGB_DATA:in std_logic_vector (2 downto 0); RGB_H:inout std_logic; RGB_V:inout std_logic);end entity;architecture VGA_DIS of VGA issignal h_cnt:integer range 0 to 800 :=0;signal v_cnt:integer range 0 to 525 :=0;begin 沈 阳 大 学 课程设计说明书 NO.12 p1:process (CLK_VGA) begin if rising_edge(CLK_VGA) then if h_cnt=799 then h_cnt<=0; if v_cnt=524 then v_cnt<=0; else v_cnt<=v_cnt+1; if (v_cnt>36 and v_cnt<=516) then RGB_V<=not RGB_V; else null;end if; end if; else h_cnt<=h_cnt+1; if (h_cnt>151 and h_cnt<=791) then RGB_H<=not RGB_H; else null;end if; end if; end if; end process p1; p2:process (CLK_VGA) begin if rising_edge (CLK_VGA) then if (h_cnt>=8 and h_cnt<=103) then HS<=0; else HS<=1; end if; if (v_cnt>=2 and v_cnt<=3) then VS<=0; else VS<=1; end if; end if; end process p2; p3:process (CLK_VGA) begin if rising_edge (CLK_VGA) then if (v_cnt>=37 and v_cnt<=516 )then if (h_cnt>=152 and h_cnt<=791) then RGB<=RGB_DATA; else RGB<="000"; end if; else null; end if; else null; end if;end process p3; 沈 阳 大 学 课程设计说明书 NO.13end;VGA_DIV的VHDL源代码如下:library ieee;use ieee.std_logic_1164.all;entity VGA_DIV isport( CLK:in std_logic; RGB_H,RGB_V:in std_logic; x:inout integer range 0 to 16 :=0; y:inout integer range 0 to 16 :=0; div_x:inout integer range 0 to 19 :=0; div_y:inout integer range 0 to 14 :=0);end entity;architecture VGA_CON of VGA_DIV issignal v_cnt:integer range 0 to 240 :=0;signal h_cnt:integer range 0 to 320 :=0;begin cnt1:process(RGB_H) begin if rising_edge (RGB_H) then h_cnt<=h_cnt+1; x<=x+1; if h_cnt=319 then h_cnt<=0;else null;end if; if (((h_cnt+1) mod 16)=0) then div_x<=div_x+1; x<=0; if (div_x=19) then div_x<=0; else null;end if; else null;end if; end if; end process cnt1; cnt2:process(RGB_V) begin if rising_edge (RGB_V) then v_cnt<=v_cnt+1;y<=y+1; if v_cnt=239 then v_cnt<=0;else null;end if; if (((v_cnt+1) mod 16)=0) then div_y<=div_y+1; y<=0; if (div_y=14) then div_y<=0; else null;end if; else null;end if; end if;end process cnt2; 沈 阳 大 学 课程设计说明书 NO.14end architecture; CONTENT 的VHDL源代码如下:LIBRARY IEEE;use ieee.std_logic_1164.all;USE IEEE.STD_LOGIC_UNSIGNED.ALL;use ieee.STD_LOGIC_ARITH.ALL;entity CONTENT isport( CLK,CLK_RS232READ:in std_logic; SEND_MARK:out std_logic; UART_value:out std_logic_vector(7 downto 0); WRITE_X:in integer range 0 to 19; WRITE_Y:in integer range 0 to 14; WRITE_TR:in std_logic; DATA_IN:in integer range 0 to 127; PS2_CLKsm: in std_logic; RECE_MARK:in std_logic; UART_in:in std_logic_vector(7 downto 0 ); DIV_X:in integer range 0 to 19; DIV_Y:in integer range 0 to 14; X:inout integer range 0 to 16 :=0; Y:inout integer range 0 to 16 :=0; RGB_DATA:out std_logic_vector (2 downto 0));end entity;architecture a16x12 of CONTENT istype line_type is array(0 to 19) of integer range 0 to 127; type data_type is array(0 to 14) of line_type; type pix_all_type is array (0 to 127) of std_logic_vector (0 to 255); type invert_line_type is array(0 to 19) of bit;type invert_data_type is array(0 to 14) of invert_line_type;signal data :data_type; signal invert_data:invert_data_type; constant pix_all:pix_all_type:=(65=>X"00000100028002800440044008200FE0101010102008701C0000000000000000",66=>X"00001FE008100810081008200FC008200810081008101FE00000000000000000",67=>X"000007C008201010100010001000100010001010082007C00000000000000000",beginprocess (clk)variable color:std_logic_vector (2 downto 0):="000"; variable cnt:integer range 0 to 10000000 :=0; 沈 阳 大 学 课程设计说明书 NO.15beginif rising_edge(clk) then if cnt=10000000 then cnt:=0; if color="111" then color:="001"; else color:=color+1; end if; else cnt:=cnt+1; end if; if pix_all(data(DIV_Y)(DIV_X))(Y*16+X)=0 then RGB_DATA<="000"; else if invert_data(DIV_Y)(DIV_X)=1 then RGB_DATA<=color; else RGB_DATA<=0&pix_all(data(DIV_Y)(DIV_X))(Y*16+X)&1; end if; end if; end if;end process;end architecture;分别对 VGA、VGA_DIV、CONTENT的源程序进行编译仿真得到其原理图。

    图8VGA原理图 沈 阳 大 学 课程设计说明书 NO.16图9 对VGA源程序的仿真结果图图10 得到的VGA_DIV、CONTENT原理图模块5:整个系统图11整个GSM通讯机原理图 沈 阳 大 学 课程设计说明书 NO.17如图,为使系统各模块关系更加清楚,我们将各个模块创建为符号文件,并在bdf文件中指定连接关系4. 设计体会通过这次EDA技术及应用课程设计,加强了我们动手能力,提高了我们的思考和解决问题的思维此次设计我们选用的是MAX+plusII软件,在整个设计过程中整个小组的同学团结一致和互帮互助,遇到了很多问题,有时心里想着这样的接法可以行得通,但实际进行运行仿真时,总是实现不了,但最终通过我们自己的努力解决了这些问题,我们受益匪浅做课程设计同时也是对课本知识的巩固和加强,由于课本上的知识太多,平时课间的学习并不能很好的理解和运用各个元件的功能,而且考试内容有限,所以在这次课程设计过程中,我们了解了很多元件的功能,并且对于其在电路中的使用有了更多的认识平时看课本时,有时问题老是弄不懂,做完课程设计,那些问题就迎刃而解了。

    而且还可以记住很多东西,比如一些引脚的初始化过程,通过动手实践让我们对各个元件映象深刻认识来源于实践,实践是认识的动力和最终目的,实践是检验真理的唯一标准所以这个期末测试之后的课程设计对我们的作用是非常大的通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固同时,我也学到了很多课内学不到的东西,比如独立思考解决问题,出现差错的随机应变,和与人合作共同提高在这次数字电子课程设计过程中,我们学会使用MAX+plusII软件设计电路并运行仿真,让我们的动手能力得到很大的提高,增加了我们的学习兴趣5.参考文献[1]谭会生,瞿逐春.EDA技术综合应用实例与分析[M].西安:西安电子科技大学出版社.2010.2:2—96. 沈 阳 大 学 课程设计说明书 NO.18[2]谭会生,张昌凡.EDA技术及应用[M].西安:西安电子科技大学出版社.2010.2:192—193.[3]江国强.EDA技术与应用[M].北京:电子工业出版社.2007.4:55—126.[4]付家才.EDA工程实践技术[M].北京:化学工业出版社.2006.12:78—101.[5]姜雪松,吴钰淳.VHDL设计实力例子及仿真[M].北京:机械工业出版社.2007.1107—109.[6]平均芬.硬件描述语言VHDL在EDA仿真中的应用[J].现代电子技术.2007.06:67—78.[7]李邦军.基于VHDL设计的综合实例[J].红外与激光工程. 2007.34(3): 356—359.[8]邵清亮,张振川.VHDL设计电路优化[J].现代电子技术.2006.08:98—120. 沈 阳 大 学。

    点击阅读更多内容
    卖家[上传人]:17777777777
    资质:实名认证