前言
继续数字系统设计的学习,对QuartusII9的使用相对开始熟悉了很多,正好课程进度学习到了VHDL语言,尝试用VHDL语言完成板载测试,本次实现的功能是花式流水灯。
本文原创,创作不易,转载请注明!!!
本文链接
个人博客:https://ronglin.fun/?p=260
PDF链接:见博客网站
CSDN: https://blog.csdn.net/RongLin02/article/details/115432284
实现流水灯
创建project
用QuartusII 新建一个名为water_led的项目文件。
芯片照常选择FLEX10K
中的FLEX10K20TC144-4
,如果这里选错了后面也可以改的
接下来就是一路next就行了。
VHDL
新建文件
下面新建一个VHDL文件,菜单栏File
–New
–VHDL File
然后ok就行了。
效果设计和源码
首先我想的是实现一个8位led灯的流水灯,根据cp信号,从右到左,然后交替亮,最后变成全0,大概如下:
00000001
00000010
00000100
00001000
00010000
00100000
01000000
10000000
10101010
01010101
11111111
00000000
大概我想实现的效果就是这样,然后开始头秃敲源码
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
ENTITY water_led is --配置实体
port(
CLK,CLR : in std_logic;
res : out std_logic_vector(7 downto 0)
);
end ;
architecture func of water_led is --配置结构体
signal state : integer range 11 downto 0 := 0; --定义信号,全局量
begin
process(CLR,CLK) --监听时钟信号和清0信号
begin
if CLR = '1' then
res <= "00000000";
state <= 0;
elsif CLK'event and CLK = '1' then --时钟变化且上升沿
state <= state+1; --每次触发全局量自增
if state < 8 then
res <= conv_std_logic_vector(2**state,8);
elsif state = 8 then
res <= "10101010";
elsif state = 9 then
res <= "01010101";
elsif state = 10 then
res <= "11111111";
elsif state = 11 then
res <= "00000000";
state <= 0; --从头开始
end if;
end if;
end process;
end func;
简单的提示一下细节和可能出现的问题:
就说一下这句代码res <= conv_std_logic_vector(2**state,8);
,函数conv_std_logic_vector()的作用是将整型转化为位矢量,第一个参数为要转化的整数,第二个参数是转化的位矢量的位宽。
问题可能有:
1.没法输入中文。可能是QuartusII9太老了,没法输入中文,可以先用记事本,输入好中文,然后copy过去。
2.信号变量延迟问题。编程过程中,代码逻辑没问题,但是仿真在第一轮循环之后总会多一个cp周期之后才开始第二轮的循环。刚开始并没有留意,板载的时候才明显的感受到,后来查了资料才知道,信号的赋值是有延迟的,仔细分析分析我的代码,在最后state <= 0;
之后,第二次循环开始,执行到state <= state+1;
如果按照软件设计思想,现在的state的值应该是1,然后res应该输出的值是2的1次方,就应该第二轮第一个值是2,但是不论看仿真还是看板载测试,都是从1开始,说明信号的赋值是延迟的。有关更多这篇博客有详细的说明:https://blog.csdn.net/qijitao/article/details/50629305
编译
编译之前需要简单的配置一下,如果之前选错了芯片的话,可以在Assignments
–Setting
中,左侧选择Device,然后就可以修改芯片了,如果还想修改更详细的配置,例如配置文件格式啥的,可以在右侧中的Device and Pin Opinions
中修改。
同时,教材上还提供了选择编译模式的方法。就是在Assignments
–Setting
中,选择左侧的Compilation Process Settings
,然后在右侧勾选上Use smart compilation
和Preserve fewer node names to save disk space
,据说可以让每一次重复编译运行的更快。
之后就是编译了,可以直接点击快捷栏的start Compilation
的倒三角按钮,也可以在菜单栏中Processing
中选择start Compilation
,一样的。
编译成功成功之后,还可以看生成的寄存器传输级(RTL),菜单栏Tool
–Netlist Viewers
–RTL Viewer
,就可以看到了。
仿真与板载
仿真和之前的一样了,菜单栏File
–New
–Vector Waveform File
然后ok就行了。
有关仿真波形图的使用,我的另一篇博客中有详细的讲解:数字系统设计学习之QuartusII9下载程序
只需注意时钟信号的设置方法,全选中CLK信号,在左侧找到一个带有小钟表的图标,名为Overwrite Clock
然后就可以设置时钟信号了。时钟时长设为1us,间隔设为50ns一变
直接看结果
循环是1-2-4-8-16-32-64-128-170-85-255-0,和我设计的一样。
在Assignments
–Pins
中选好阵脚,然后一定要记得再编译一次,查看板载测试,板载的时候一定要注意重启设置禁用数字签名
成功了,=w=