基于VHDL的点阵扫描程序.docx_第1页
基于VHDL的点阵扫描程序.docx_第2页
基于VHDL的点阵扫描程序.docx_第3页
基于VHDL的点阵扫描程序.docx_第4页
基于VHDL的点阵扫描程序.docx_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

数字电路与逻辑设计实验报告基于VHDL的点阵扫描程序【系统设计】1采用自顶向下(top-down)设计法,分为以下三个步骤:l Step 1:确定初步方案,进行系统设计和描述:图1 点阵显示系统结构框图 1) 系统结构框图:绘出系统结构框图如下所示:2) 分析:系统输入信号:a. 输入控制信号:控制点阵显示内容几种状态的转换;b. 时钟输入:实验中我所使用的实验板高频时钟为1MHz; 系统输出信号: 点阵上显示的各点亮暗信息就是系统输出信息。l Step 2:系统划分,进行各个模块功能描述: 从题目要求的点阵系统的功能出发,将系统划分为四大模块:分频模块、各个模式分频控制模块、总控制模块、显示模块。可简要概括为分频模块和显示控制模块,其中显示控制模块包括各模式分频控制模块、总控制模块和显示模块。1) 方框图(模块划分):2) 分析:a.分频模块: 由于系统可用单元为128宏个单元,所以为了节约使用量,采取用二进制向量来计数,同时用向量特定位的状态来作为分频标志,经计算可得若定义一个25位的二进制数,则18号位的0、1变化可作为4Hz的时钟高低电平变化标志,以此类推19号位可作为2Hz的时钟高低电平变化标志,21号位可作为0.5Hz的时钟高低电平的变化标志。因此可以把计数的值直接用于控制点阵的显示。 b.显示控制模块: 输入信号: M_mode:为2维向量,由2个拨码开关控制,共可控制显示4种状态, 在此只是用00-11的四种状态 Auto是自动切换使能键 Reset是复位键 C_out为分频模块的输出,作为显示控制的标志。 输出信号: lie:为8维向量,为点阵显示的行信号; hang:为8维向量,为点阵显示的列信号;l Step 3:逻辑描述:1) 系统状态分析: 根据题目要求,系统共有4个大状态,记为A、B、C、DA:计扫描控制电路,使光点从左上角像素点开始扫描,终止于右下角像素点,然后周而复始地重复下去,扫过一帧所需时间为16 秒;B:每次显示1 个字符,共 5个,每秒切换一个字符,所显示字符为:EZFHNC:显示一幅动画;D:滚动显示一幅动画。2) MDS图: 输入控制信号m_mode为二维向量,在手动模式下控制显示的模式 Auto为自动显示的使能信号绘出MDS图,如下所示: B Auto=0,m_mode=00A Auto=0,m_mode=01 Auto=1,m_mode=01 Auto=1,m_mode=00 auto=1,m_mode=10DC auto=1,m_mode=11 auto=0,m_mode=11 auto=0,m_mode=10 通过两个拨码开关来输入m_mode实现状态在A、B、C之间的转移控制。另外,系统的大状态只有上述的A、B、C四种,而每种大状态中,有包含有多个循环的小状态,这部分内容将在下面的“点阵显示原理设计”中详细分析。以上部分即通过自顶向下的方法,逐步探求系统的设计方法。当然在实验过程中,也对初步设计时进行了反复的修改和补充,使整个体统更加完善。2. 点阵显示原理设计:图6 点阵电路原理1) 点阵显示原理分析: 88 点阵是由如图所示的64个发光二极管构成的,当相应二极管的行电平为高电平,列电平为低电平时,二极管导通发亮,所以8个列使用一个行驱动。那么当一行同时有超过一个以上的灯亮时,每个灯都会分走电流,导致每行灯点亮多时就变暗,少时就变亮。 为了使点阵能够在人眼看它的时候呈现出设计好的图形,并且亮度均匀,用列信号(hang)作为选通控制就会亮度均匀,只要保证任何时刻只有一位hang信号为低,其余位都为高即可。反之,用行信号去控制就会出现亮度不均匀的情况。2) 显示内容设计:l A状态:扫描控制电路,光点从左上角像素点开始扫描,终止于右下角像素点,然后周而复始地重复下去。 此状态在某一时刻只有一个点在亮,比较简单,不做过多分析。l B状态:每次显示1 个字符,至少显示4 个字符,每秒切换一个字符; 设计显示的字符为:EZFHN。由于B状态共显示5个字符,所以分为四个状态分别为“E”、“Z”、“F”、“H”、“N”,又根据上面分析的点阵的工作原理,将这五个状态中的每一个再进一步分成8个子状态,如下图所示。所以,对于B状态,实际上是4*8=32个子状态间的切换,利用人眼的视觉暂留,在显示每个字符的1秒钟内用高频扫面这个字符的8个子状态,进入下一秒钟后,同理用高频扫面这个字符的8个子状态。B状态的分解如下图所示: 列电平(hang)总是按照以下这8个状态在循环扫描,在某一时刻只有一个列电平为0,其余均为高电平: hang(1) = 01111111 hang(2) = 10111111 hang(3) = 11011111 hang(4) = 11101111 hang(5) = 11110111 hang(6) = 11111011 hang(7) = 11111101 hang(8) = 11111110 行电平(row)则控制要显示的内容。l C状态:显示一幅动画 ,令点阵从里到外对称的显示四个点,然后全亮,然后在逐渐全暗,然后再重新循环亮对称的四个点。其原理同B状态。l D状态:显示一幅滚动图画,是一个箭头从右向左移动,其原理同【实验源程序】1、分频模块:library ieee; use ieee.std_logic_1164.all;use ieee.std_logic_signed.all;entity freq isport(f_clk : in std_logic;f_reset: in std_logic;f_ctrl:out std_logic_vector(9 downto 0);end freq;architecture f of freq issignal count:std_logic_vector(24 downto 0):=0000000000000000000000000;beginprocess(f_clk,f_reset,count)begin if(f_reset=1)then count=0000000000000000000000000; elsif(f_clkevent and f_clk=1)then if count=1111111111111111111111111 then count=0000000000000000000000000; elsecount=count+1; end if; end if;f_ctrl(9 downto 3)=count(24 downto 18); -18-4Hz,19-2Hz,20-1Hz,21-0.5Hzf_ctrl(2 downto 0)=count(2 downto 0); -1MHzend process;end f;2、各个模式的频率控制模块library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_signed.all;entity contr isport(c_mode:instd_logic_vector(1 downto 0);c_in:instd_logic_vector(9 downto 0);c_out:outstd_logic_vector(7 downto 0);end contr;architecture c of contr issignal c_lie:std_logic_vector(4 downto 0):=00000;signal c_hang:std_logic_vector(2 downto 0):=000;beginprocess(c_mode,c_in,c_lie,c_hang)beginif (c_mode=00) thenc_lie(4 downto 0)=c_in(9 downto 5); -1Hz, when use chose 8-4 for 0.5Hz,model1s hang c_hang(2 downto 0)=c_in(5 downto 3); -4Hz for model1s hang elsif (c_mode=01) thenc_lie(4 downto 0)=c_in(9 downto 5); - 1Hz model2 c_hang(2 downto 0)=c_in(2 downto 0); elsif c_mode=10 then c_lie(4 downto 0)=c_in(7 downto 3); -4Hz for model3c_hang(2 downto 0)=c_in(2 downto 0);elsif c_mode=11 then c_lie(4 downto 0)=c_in(8 downto 4); - 1Hz model2 c_hang(2 downto 0)=c_in(2 downto 0);end if;c_out(7 downto 3)=c_lie(4 downto 0);c_out(2 downto 0)hanghanghanghanghanghanghanghanglielielielielielielieliehang=11111111;liehang=10111111;liehang=11011111;liehang=11101111;liehang=11110111;liehang=11111011;liehang=11111111;liehang=11111111;liehang=11111111;liehang=10111111;liehang=11011111;liehang=11101111;liehang=11110111;liehang=11111011;liehang=11111101;liehang=11111111;liehang=11111111;liehang=10111111;liehang=11011111;liehang=11101111;liehang=11110111;liehang=11111011;liehang=11111101;liehang=11111111;liehang=11111111;liehang=10111111;liehang=11011111;liehang=11101111;liehang=11110111;liehang=11111011;liehang=11111111;liehang=11111111;liehang=11111111;liehang=10111111;liehang=11011111;liehang=11101111;liehang=11110111;liehang=11111011;liehang=11111101;liehang=11111111;liehang=11111111;liehang=11100111;liehang=11011011;liehang=10111101;liehang=01111110;liehang=00000000;liehang=10000001;liehang=11000011;liehang=11100111;liehang=11111111;lie hang=11111111;lie lie=00010000;hang lie=00111000;hang lie=01111100;hang lie=11111110;hang lie=00111000;hang lie=00111000;hang lie=00111000;hang lie=00000000;hang lie=00111000;hang lie=01111100;hang lie=11111110;hang lie=00111000;hang lie=00111000;hang lie=00111000;hang lie=00000000;hang lie=00010000;hang lie=01111100;hang lie=11111110;hang lie=00111000;hang lie=00111000;hang lie=00111000;hang lie=00000000;hang lie=00010000;hang lie=00111000;hang lie=11111110;hang lie=00111000;hang lie=00111000;hang lie=00111000;hang lie=00000000;hang lie=00010000;hang lie=00111000;hang lie=01111100;hang lie=11111110;hang lie=00111000;hang lie=00111000;hang lie=00000000;hang lie=00010000;hang lie=00111000;hang lie=01111100;hang lie=11111110;hang lie=00111000;hang lie=00111000;hang lie=00000000;hang lie=00010000;hang lie=00111000;hang lie=01111100;hang lie=11111110;hang lie=00111000;hang lie=00111000;hang lie=00000000;hang lie=00010000;hang lie=00111000;hang lie=01111100;hang lie=11111110;hang lie=00111000;hang lie=00111000;hang lie=00000000;hang lie=00010000;hang lie=00111000;hang lie=01111100;hang lie=11111110;hang lie=00111000;hang lie=00111000;hang lie=00111000;hang=11111110; end case; end if; d_lie=lie; d_hangclk,f_reset=re,f_ctrl=ctrl);d_d:dianzhen port map(d_mode=mode,d_scan=fd_scan,d_lie=mlie,d_hang=mhang);c_c:contr port map(c_mode=mode,c_in=ctrl,c_out=fd_scan);process(clk,reset,m_mode,mhang,mlie,auto,re,fd_scan)beginre=reset ;if(re=0) then if auto=0 then mode=m_mode; elsif auto=1 then if( fd_scan(7)event and fd_scan(7)=1) thenif(mode=11) thenmode=00;elsemode=mode+1;end if; end if;end if; else mode=00; end if;m_lie=mlie;m_hang=mhang;end process;end m;【故障及问题分析】1. VHDL语法问题总结:在编程的过程当中出现了一些容易犯的错误,现在将它们总结如下:1) 进程与进程之间、进程与进程外的语句是并行的关系;进程内部才是串行的关系;2) 不同的进程可以对同一个信号敏感,但是不同的进程不能修改同一个信号;3) 实体的输出信号不能直接作为一个进程的敏感信号,如果需要的话,可以将这个输出信号赋值给临时信号,再用临时信号作为进程的敏感信号。4) Case when 语句比if else then 语句更能节省宏单元。2. ALTERA Quartus II使用方法总结:通过这一个月的实践,可以说我对ALTERA Quartus II已经掌握的很熟练了。有几个问题总结如下:1) 在下载时,一定注意器件的选择是否正确。2) 在建立仿真波形时,end time的设定不能太长,因为计算机会“跑不过来”;同时也不能设的太短,因为所使用的实验板具有15ns的延迟,假设设置为1ns的话,就完全看不到波形。可以根据情况设置,我一般选择us级别的end time.3) 无需每次下载之前都建立仿真波形仿真。编译的作用是找出VHDL语法上的错误;仿真的作用是找出除了语法错误以外的、人为产生的错误;在软件的学习过程当中,产生了思维定势,觉得一定是:编译、仿真、下载的顺序。 仿真时所采用的分频比,并不是实际要求的分频比,而是为了看到清晰的波形,大大降低了实际的分频比。则在下载之前,还要将分频比改回所要求的原始分频比,然后直接下载就可以了。所以说,编译之后也可以直接下载,只要能够保证程序在逻辑上的正确性即可。3. EMP7128SLC84-15实验板的使用:对于此型号的实验板,有以下几点注意:1) 高频时钟会有不同,我所使用的实验板是30MHz的,也有1MHz,10MHz等型号的。2) 时钟管脚为83管脚。3) 有低频时钟:实验板上有可调的低频时钟,但由于点阵需要不止一个时钟,而且要求时间是精确的,所以必须从高频时钟中分得所需的时钟。【总结和结论】通过一个月的不断努力,我已经能够进一步掌握VHDL的使用语法,熟练ALTERA

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论