VHDL代码心得1-流水灯

本文分享了作者在重新实现流水灯项目过程中的编程经验,详细解析了VHDL语言中if语句的正确用法,避免多边缘触发错误,并介绍了同步清零与case语句的应用技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

耽误了许久才开始,都怪我太贪玩了,还好进入状态了之后进度还好,先写一下流水灯吧,这玩意儿可以说是最简单的入门项目了,重新写了一下,就当是复习。要说的是第一次写的时候,代码结构差不多忘光了,加上之前有些也没弄懂,所以磕磕绊绊的,成功之后写一下代码心得
1.一个进程只能有一个边缘触发,所以触发信号if clk’event…之后一定不可以马上end if又再起一个if,否则会报错cant infer register…因为系统会误以为是多边缘触发而无法识别。
2.我用的同步清零,所以清零语句放在触发语句之后,清零语句的end if可以紧跟清零语句之后,也可把之后的条件语句写为elsif再end。
3.不同信号对应不同的点亮状态,描述这个的时候一定不能直接对计数器用if+elsif,因为一个 elsif 执行成功,其他的 elsif 和 else 将不再被执行,应该是用if+elsif,将不同的计数对应不同的state,然后用case语句将不同的state与不同的点亮状态对应。
摘抄一下网上关于if语句的用法

一个 if 语句后可跟一个可选的 elsif 语句,然后再跟另一个 else 语句。
这种条件判断语句在多个条件的情况下非常有用。
在使用 if , elsif , else 语句时你需要注意以下几点。
if 语句后可以跟上 0 个 或 1 个 else 语句,但是 elsif 后面必须有 else 语句。
if 语句后可以跟上 0 个 或 1 个 elsif 语句,但它们必须写在 else 语句前。
如果其中的一个 elsif 执行成功,其他的 elsif 和 else 将不再被执行。
ELSE IF,ELSEIF都是错误的用法,正确的用法是ELSIF。
ELSE IF在编译器中之所以能正常显示,是因为编译器把他当做了ELSE。

事实上上面的有些错误,elsif后面没有else也不一定会报错
代码如下

Library ieee;
use ieee.std_logic_1164.all;
entity runninglamp is
port(clk,rst:in std_logic;
	  out1:out std_logic_vector(3 downto 0));
end runninglamp;
architecture behav of runninglamp is
signal sta:std_logic_vector(1 downto 0);
signal cnt:integer range 1 to 100000000;

begin
	process(clk)
	begin
		if clk'event and clk='1' then 
		cnt<=cnt+1;
		if rst='0' then 
		cnt<=1;
			elsif cnt=1 then
			sta<="00";
			elsif cnt=25000000 then
			sta<="01";
			elsif cnt=50000000 then
			sta<="10";
			elsif cnt=75000000 then
			sta<="11";
			elsif cnt=100000000 then
			cnt<=1;
			end if;
				case sta is
				when"00"=>out1<="0001";
				when"01"=>out1<="0010";
				when"10"=>out1<="0100";
				when"11"=>out1<="1000";
				end case;
			end if;
	end process;
end behav;
	
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值