耽误了许久才开始,都怪我太贪玩了,还好进入状态了之后进度还好,先写一下流水灯吧,这玩意儿可以说是最简单的入门项目了,重新写了一下,就当是复习。要说的是第一次写的时候,代码结构差不多忘光了,加上之前有些也没弄懂,所以磕磕绊绊的,成功之后写一下代码心得
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;