那位大侠帮我优化一下VHDL程序

那位大侠帮我优化一下VHDL程序,第1张

你的程序写的太复杂了,看看我两年前写的这个程序:

实现的功能是左转时左边三盏灯从右到左依次亮灭,指向左表示向左转;右转时右边三盏灯从左到右依次亮灭;故障(或定义为制动)时六盏灯同时闪烁。正常直线行驶时灯熄灭。没有区分白昼。

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语言将逻辑结构图“翻译”出来。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7854268.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-10
下一篇 2023-04-10

发表评论

登录后才能评论

评论列表(0条)

保存