实现的功能是左转时左边三盏灯从右到左依次亮灭,指向左表示向左转;右转时右边三盏灯从左到右依次亮灭;故障(或定义为制动)时六盏灯同时闪烁。正常直线行驶时灯熄灭。没有区分白昼。
library ieee
use ieee.std_logic_1164.all
use ieee.std_logic_unsigned.all
entity wdkz is
port(clk,l,r:in std_logic
ledl,ledr:out std_logic_vector(2 downto 0))
end wdkz
architecture behave of wdkz is
signal count:std_logic_vector(1 downto 0):="00"
begin
process(clk,l,r)
variable check:std_logic_vector(1 downto 0):="00"
begin
if rising_edge(clk) then --设计三步时钟
count<=count+1
if count="10" then
count<="00"
end if
end if
check:=l&r--位合成
ledl<="000"
ledr<="000"--初始化
case check is
when "10" =>if count="00" then --左边灯依次开关
ledl<="001"ledr<="000"
elsif count="01" then
ledl<="011"ledr<="000"
else
ledl<="111"ledr<="000"
end if
when "01" =>if count="00" then --右边灯依次开关
ledr<="100"ledl<="000"
elsif count="01" then
ledr<="110"ledl<="000"
else
ledr<="111"ledl<="000"
end if
when "11" =>if count="00" then --六盏灯闪烁,亮的时间比熄灭的时间长一个时钟周期
ledl<="000"ledr<="000"
else
ledl<="111"ledr<="111"
end if
when others =>ledl<="000"ledr<="000"--不转向时灯熄灭
end case
end process
end behave
根据这个思路你可以定义四个std_logic变量:l,r,b,d(l:left,r:ringt,b:break,d,day_'1' or ningt_'0')
check<=l&r&b&d
case check is
when "1000"=>
when "1001"=>if clk='1' then
……
else light<=(others=>'0')
end if
when ……
end case
这样写就容易多了,而且条理清晰。
(可能有些是中文字符,自己注意更改)
很简单的问题,给你的输出复制加上时钟同步就可以消除毛刺。程序修改如下;
P2:PROCESS(clk)
BEGIN
if clk'event and clk='0' then
if count>10 then
full<='0'
else
full<='1'
end if
end if
clkout<=full
end PROCESS P2
count<=count+0--不知道楼主这句话是个什么意思、没有意义 给删除了
学习硬件描述语言,重要的是学会通过HDL去描述硬件电路的思想,这个思想远比别人直接给出代码跟重要。居然有了逻辑结构图了,完全可以撇下VHDL语言程序,直接用VerilogHDL语言将逻辑结构图“翻译”出来。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)