数字系统设计学习之VHDL输入设计

前言

继续数字系统设计的学习,对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文件,菜单栏FileNewVHDL 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

编译

编译之前需要简单的配置一下,如果之前选错了芯片的话,可以在AssignmentsSetting中,左侧选择Device,然后就可以修改芯片了,如果还想修改更详细的配置,例如配置文件格式啥的,可以在右侧中的Device and Pin Opinions中修改。
在这里插入图片描述
同时,教材上还提供了选择编译模式的方法。就是在AssignmentsSetting中,选择左侧的Compilation Process Settings,然后在右侧勾选上Use smart compilationPreserve fewer node names to save disk space,据说可以让每一次重复编译运行的更快。
在这里插入图片描述
之后就是编译了,可以直接点击快捷栏的start Compilation的倒三角按钮,也可以在菜单栏中Processing中选择start Compilation,一样的。
编译成功成功之后,还可以看生成的寄存器传输级(RTL),菜单栏ToolNetlist ViewersRTL Viewer,就可以看到了。
在这里插入图片描述

仿真与板载

仿真和之前的一样了,菜单栏FileNewVector Waveform File然后ok就行了。
有关仿真波形图的使用,我的另一篇博客中有详细的讲解:数字系统设计学习之QuartusII9下载程序
只需注意时钟信号的设置方法,全选中CLK信号,在左侧找到一个带有小钟表的图标,名为Overwrite Clock
在这里插入图片描述
然后就可以设置时钟信号了。时钟时长设为1us,间隔设为50ns一变
在这里插入图片描述
直接看结果
在这里插入图片描述
循环是1-2-4-8-16-32-64-128-170-85-255-0,和我设计的一样。
AssignmentsPins中选好阵脚,然后一定要记得再编译一次,查看板载测试,板载的时候一定要注意重启设置禁用数字签名
在这里插入图片描述
成功了,=w=

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值