搜索
bottom↓
回复: 4

大家帮我看看这个VHDL代码,分析分析

[复制链接]

出0入0汤圆

发表于 2010-4-2 15:08:24 | 显示全部楼层 |阅读模式
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity jicunqi is
--generic (n : natural := 32);
port (
Din           : in std_logic_vector(0 to 7);
Qaddr         : in std_logic_vector(7 downto 0);
Clock,Enable  : in std_logic;
Xdir          : out std_logic_vector(7 downto 0);
Xdata         : out std_logic_vector(23 downto 0));
end entity jicunqi;

architecture behavioural of jicunqi is
begin
process (Clock,Enable) is
begin
if rising_edge(Clock) then
        if (Enable = '1')then
                if (Qaddr = 32) then
                                Xdir     <= (others => '0');
                                Xdata    <= (others => '0');
                end if;
                -------------------------------------------
                if (Qaddr = 1) then
                        Xdir(7 downto 0) <= Din;
                end if;
                ------------------------------------
                if (Qaddr = 2) then
                Xdata(23 downto 16) <= Din;
                end if;
                if (Qaddr = 3) then
                Xdata(15 downto 8) <= Din;
                end if;
                if (Qaddr = 4) then
                Xdata(7 downto 0) <= Din;
                end if;       

        end if;       
end if;
end process ;
end;

我写的这几行代码
大概意思就是Enable=1,Clock下降沿判断Qaddr值 将数据Din 寄存并输出,
请问这样写有没有隐患?

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2010-4-2 15:25:35 | 显示全部楼层
可以是可以的,但是……
1、代码没有缩进,看起来麻烦
2、代码实现的,和你的意图不一样:不是Clock下降沿,而是上升沿;不是锁存,而是寄存
3、没有异步复位,导致上电后的输出状态不确定,毕竟你有一个 Enable 使能的

出0入0汤圆

发表于 2010-4-2 16:41:54 | 显示全部楼层
多谢!
学习了!! 我要的是寄存,但是下降沿吧?异步复位具体是怎么个事回?

出0入0汤圆

 楼主| 发表于 2010-4-2 16:57:38 | 显示全部楼层
多谢,学习了!是寄存。 但是下降沿吧?我用这个和MCU通信,上电时确实有点问题。因为上电引脚会跳变!怎么解决啊?

出0入0汤圆

发表于 2010-4-2 23:45:54 | 显示全部楼层
你代码中是 if rising_edge(clk) 那就是上升沿(这也是绝大部分场合使用的方式啊)

异步复位:

process(nRst, Clk)
begin
    if nRst=0 then
        dout <= '0';  -- initial value
    else if rising_edge(Clk) then
        dout <= din;
    end if
end process;
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 19:31

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表