在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 2404|回复: 6

[原创] VHDL程序仿真求教

[复制链接]
发表于 2011-9-29 11:45:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
本帖最后由 venom 于 2011-9-29 15:44 编辑

大家好,下面是我写的一个简单的可逆计数器,以及测试程序,用modelsim仿真一直出问题,不知道原因在何处,希望大家给予指正,谢谢!
BCD码q(7 downto 0)可以表示0到99,前四位是个位,后四位是十位。
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
entity counter is
    port(
        clk : in std_logic;
        reset : in std_logic;
        sl  : in std_logic;
        q   : out std_logic_vector(7 downto 0));
end counter;
architecture counter_arc of counter is
    signal cnt : std_logic_vector(7 downto 0);
begin
    process(clk,reset,cnt)
    begin
        if reset = '1' then
            cnt <= (others => '0');
        elsif clk = '1' and clk'event then
            if sl = '0' then                          -- 加计数
              if cnt /= "10011001" then
                if cnt(3 downto 0) = "1001" then      
                   cnt(3 downto 0) <= (others => '0');      -- 个位
                   cnt(7 downto 4) <= cnt(7 downto 4) + '1';  -- 十位
                end if;
                else
                 cnt <= cnt;
  end if;
            else                                            -- 减计数
                if cnt /= "00000000" then
                    if cnt(3 downto 0) = "0000" then
                        cnt(3 downto 0) <= "1001";                -- 个位
                        cnt(7 downto 4) <= cnt (7 downto 4) - '1';  -- 十位
                        
                    else
                        cnt(3 downto 0) <= cnt (3 downto 0) - '1';
                   end if;
              end if;
  end if;
            q <= cnt;
        end if;
    end process;
end counter_arc;
--test
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity counter_tb is
end counter_tb;
architecture behave of counter_tb is
component counter
port(   clk : in std_logic;
        reset : in std_logic;
        sl  : in std_logic;
        q   : out std_logic_vector(7 downto 0));
end component;
signal clk :  std_logic := '0';
signal reset :  std_logic := '0';
signal sl  :  std_logic := '0';
signal q   :  std_logic_vector(7 downto 0);
constant clk_period :time   :=20 ms;
begin
U2: counter port map(clk => clk,
                     reset => reset,
                     sl => sl,
                     q => q
                     );
  clk_gen:process  
     begin  
     clk<='1';  
     wait for clk_period/2;
     clk<='0';  
     wait for clk_period/2;
    end process;
tb1:process      
       begin  
       reset<='0';
        wait for 1000 ms;
        reset<='1';
        wait for 1000 ms;  
  end process;
  tb2:process
       begin  
       sl<= '0';
        wait for 1000 ms;
        sl<= '1' ;
        wait for 1000 ms;   
  end process;
end behave;
新建位图图像.bmp
发表于 2011-9-29 13:27:36 | 显示全部楼层
好难看得懂,有注释吗
发表于 2011-9-29 13:31:25 | 显示全部楼层
好歹说说怎么不对了或者贴个波形图出来
发表于 2011-9-29 14:33:51 | 显示全部楼层
本帖最后由 jackertja 于 2011-9-29 14:55 编辑

1. process(clk,reset,cnt) 应该是 process(clk,reset)
2. sl='0'的逻辑应该有问题,cnt走不了。你自己查不出问题,是因为不写注释,自己都不知道逻辑会怎样。
    reset也有问题,里面是=1复位,外面一开始是0,后面改成1,数据都没有初始化。
 楼主| 发表于 2011-9-29 16:12:26 | 显示全部楼层
回复 4# jackertja


    还是没弄好,仿真图在上面,q需要赋初值嘛?
发表于 2011-9-29 17:01:24 | 显示全部楼层
就像4楼说的, sl=0的时候,如果cnt = "00000000",你没有做任何操作。估计就卡在这里了
发表于 2011-9-29 17:05:48 | 显示全部楼层
回复 5# venom

q没reset值,这个习惯不好。
复位完是逻辑问题,sl=0 and cnt=0时cnt的值不会变。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条


小黑屋| 手机版| 关于我们| 联系我们| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2025-1-16 13:03 , Processed in 0.027368 second(s), 12 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表