移动速度可控的字符集自动循环显示 VHDL设计与实现
来源:互联网 发布:python调用shell命令 编辑:程序博客网 时间:2024/05/21 17:55
作者:chenjieb520
一.设计目的
学习较复杂的数字系统设计方法。
二.设计内容
利用状态机,移位寄存器和数控分频器,在DE2平台上实现字符“HELLO”的从右向左自动循环显示,移动速度可控(字符以每0.1~1秒一次的速度移动),在HEX7~HEX0上循环显示“HELLO”,“HELLO”从左边移出后,再从右边重新开始显示。
三.程序设计原理
(1) 新建一个QuartusⅡ工程。
(2) 建立一个VHDL文件,实现所要求的电路:
将8个7位寄存器按流水线的形式排列,即第一个寄存器的输出作为第二个寄存器的输入,第二个寄存器的输出作为第三个寄存器的输入,依此类推。每个寄存器的输出同时驱动七段数码管显示。请设计一个状态机对寄存器流水线进行以下控制:
(i) 在前8个时钟,FSM将字符“H,E,L,L,O, , , ”分别插入8个7位寄存器。
(ii) 第(i)步完成后,将寄存器流水线配置成循环模式,即最后一个寄存器的输出作为第一个寄存器的输入,使字符可以无限循环显示。
输入的时钟信号由可控分频器控制,频率范围1~10HZ。
(3) 将VHDL文件添加到工程中,编译工程并对电路进行仿真,确定其功能的正确性。
(4) 分配引脚。在HEX7~HEX0上循环显示“HELLO”。
(5) 重新编译工程,将电路下载到DE2平台上并测试其功能。
四.程序流程图
五.源程序
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY CNTBCD IS
PORT(CLK,RST,EN:IN STD_LOGIC;
COUNT:IN STD_LOGIC_VECTOR(7 DOWNTO 0);
LED7SA,LED7SB,LED7SC,LED7SD,LED7SE:OUT STD_LOGIC_VECTOR(6 DOWNTO 0));
END CNTBCD;
ARCHITECTURE behav OF CNTBCD IS
SIGNAL CLK2,FULL,FOUT:STD_LOGIC;
SIGNAL A,B,C,D,E:INTEGER;
SIGNAL TMP1,TMP2,TMP3,TMP4,TMP5:INTEGER;
BEGIN
CLK0:PROCESS(CLK)
VARIABLE CNT23:STD_LOGIC_VECTOR(23 DOWNTO 0);
BEGIN
IF CLK'EVENT AND CLK='1' THEN
CNT23:=CNT23+1;
END IF;
IF CNT23(10)='1' THEN
CLK2<='1';
ELSE CLK2<='0';
END IF;
END PROCESS CLK0;
P_REG:PROCESS(CLK2)
VARIABLE CNT8:STD_LOGIC_VECTOR(7 DOWNTO 0);
BEGIN
IF CLK2'EVENT AND CLK2='1' THEN
IF CNT8="11111111" THEN
CNT8:=COUNT;
FULL<='1';
ELSE CNT8:=CNT8+1;
FULL<='0';
END IF;
END IF;
END PROCESS P_REG;
P_DIV: PROCESS(FULL)
VARIABLE CNT2:STD_LOGIC;
BEGIN
IF FULL'EVENT AND FULL='1' THEN
CNT2:=NOT CNT2;
IF CNT2='1' THEN FOUT<='1';ELSE FOUT<='0';
END IF;
END IF;
END PROCESS P_DIV;
PROCESS(FOUT,RST,EN)
BEGIN
TMP1<=A;
TMP2<=B;
TMP3<=C;
TMP4<=D;
TMP5<=E;
IF RST='1' THEN A<=3;B<=2;C<=2;D<=1;E<=0;
ELSIF FOUT'EVENT AND FOUT='1' THEN
IF EN='1' THEN
A<=TMP2;
B<=TMP3;
C<=TMP4;
D<=TMP5;
E<=TMP1;
TMP1<=A;
TMP2<=B;
TMP3<=C;
TMP4<=D;
TMP5<=E;
END IF;
END IF;
END PROCESS;
PROCESS(A)
BEGIN
CASE A IS
WHEN 0 => LED7SA<="0001001";
WHEN 1 => LED7SA<="0000110";
WHEN 2 => LED7SA<="1000111";
WHEN 3 => LED7SA<="1000000";
WHEN OTHERS=>NULL;
END CASE;
END PROCESS;
PROCESS(B)
BEGIN
CASE B IS
WHEN 0 => LED7SB<="0001001";
WHEN 1 => LED7SB<="0000110";
WHEN 2 => LED7SB<="1000111";
WHEN 3 => LED7SB<="1000000";
WHEN OTHERS=>NULL;
END CASE;
END PROCESS;
PROCESS(C)
BEGIN
CASE C IS
WHEN 0 => LED7SC<="0001001";
WHEN 1 => LED7SC<="0000110";
WHEN 2 => LED7SC<="1000111";
WHEN 3 => LED7SC<="1000000";
WHEN OTHERS=>NULL;
END CASE;
END PROCESS;
PROCESS(D)
BEGIN
CASE D IS
WHEN 0 => LED7SD<="0001001";
WHEN 1 => LED7SD<="0000110";
WHEN 2 => LED7SD<="1000111";
WHEN 3 => LED7SD<="1000000";
WHEN OTHERS=>NULL;
END CASE;
END PROCESS;
PROCESS(E)
BEGIN
CASE E IS
WHEN 0 => LED7SE<="0001001";
WHEN 1 => LED7SE<="0000110";
WHEN 2 => LED7SE<="1000111";
WHEN 3 => LED7SE<="1000000";
WHEN OTHERS=>NULL;
END CASE;
END PROCESS;
END behav;
六.调试过程
根据上述的代码对引脚进行分配,可以得到和实验要求相吻合的结果。
同时在模拟器上进行波形的模拟可以得到的如下的波形。这里为了得到更能体现出实验的结果,将END TIME 设置为5S,时钟设置为20ns,其他的设置和上一次实验一样,这里不在赘述。得到的波形如下所示:
七.遇到的问题及解决方法
由于本次是基于上一次的实验的基础上进行的,所以没有遇到比较大的问题。就是模拟的时间太长了。将END TIME设置为50MS,模拟的时间也需要12分钟,这也太可怕了。
在模拟器上模拟波形时,所分频和在硬件上的分频是有区别的,在硬件上,应该让用户看到这种变化,一边就是20mS的停留时间以上,而在模拟器上尽量使得时间短一点,这样才不至于要一直等。
八.参考文献
EDA技术与VHDL(第二版) 潘松 黄继业 编著
- 移动速度可控的字符集自动循环显示 VHDL设计与实现
- VHDL 自动售货机设计与实现
- 七段数码显示字符 VHDL设计与实现
- 一位全加器 VHDL设计与实现
- jquery+select+ajax实现时间可控的自动刷新
- SDRAM控制器的设备与VHDL实现
- javascript 可控速度的上下拉菜单
- fpga的vhdl设计
- 状态机的VHDL设计
- 基于FPGA/CPLD设计与实现UART(VHDL)
- 【VHDL】VHDL设计n的全加器
- CPLD 八段数码管时钟显示的VHDL实现
- SPI的VHDL实现
- UART的VHDL实现
- 循环队列的设计与实现
- 视频图像传输与显示(5)——视频图像阵列VGA及其时序的VHDL实现
- 可控定时任务 框架设计实现
- react 不可控组件与可控组件的区别
- Windows界面样式
- js火狐取本地绝对路径的方法
- GemCraft Labyrinth:超耐玩的在线flash塔防游戏
- 智能车笔记2 总线时钟
- MFC GDI+ 绘图
- 移动速度可控的字符集自动循环显示 VHDL设计与实现
- 手机未来趋势图(中文完整版)
- Mysql 双向同步
- mysql基本命令
- java图形界面笔记
- 9.6例题:红与黑
- 智能车笔记5 SCI 串口
- Java socket接收出现中文乱码
- Horner规则的递归实现