首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为信号和常量警告找到1位锁存器

为信号和常量警告找到1位锁存器
EN

Stack Overflow用户
提问于 2012-02-21 18:56:22
回答 2查看 2.8K关注 0票数 2

我已经尝试调试这段VHDL代码两天了,但是我不知道哪里有错误。以下是代码:

代码语言:javascript
复制
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;


entity SSDDriver is
    Port ( cp : in std_logic;
              iin : in std_logic;
              an : buffer std_logic_vector (3 downto 0);
              --7=a, 6=b ...
              segments: out std_logic_vector (7 downto 0));
end SSDDriver;

architecture Behavioral of SSDDriver is
    signal cpo : std_logic;
    --broj BCD znamenki
    constant BCD_NUMBERS : integer := 4;
    --broj bitova ulaznog broja
    constant BITS : integer := 14;
    --broj kodiran BCD-om
    signal BCDNumber : std_logic_vector (BCD_NUMBERS*4-1 downto 0) := (others => '0');
    signal BCDForDecoder: std_logic_vector (3 downto 0);
    signal number: integer range  0 to 9999;
begin
    decoder: entity BCDToSSD port map (bcd => BCDForDecoder, segm => segments (7 downto 1));
    counter: entity djelitelj generic map (COUNTTO => 25000) port map (cpIn => cp, CpOut=> cpo);
    --tocka je uvijek ugasena
    segments(0) <= '1';

    process (iin)
    begin
        if iin='1' then
            number<=3245;
        else
            number<=1111;
        end if;
    end process;

    SwitchDisplay: process (cpo)
    begin
        if rising_edge(cpo) then
            if an="0111" then
                an<="1011";
                BCDForDecoder<=BCDNumber(11 downto 8);
            elsif an="1011" then
                an<="1101";
                BCDForDecoder<=BCDNumber(7 downto 4);
            elsif an="1101" then
                an<="1110";
                BCDForDecoder<=BCDNumber(3 downto 0);
            else
                an<="0111";
                BCDForDecoder<=BCDNumber(15 downto 12);
            end if;
        end if;
    end process SwitchDisplay;

    DoubleDabble: process (number)
        variable num : std_logic_vector (BITS-1 downto 0);
        variable bcd : std_logic_vector (BCD_NUMBERS*4-1 downto 0) := (others => '0');
        variable old_number: integer range 0 to 9999;
    begin
        if number/= old_number then
            num := conv_std_logic_vector(number, BITS);

            for i in 0 to BITS-1 loop
                bcd(BCD_NUMBERS*4-1 downto 1) := bcd(BCD_NUMBERS*4-2 downto 0);  
                bcd(0) := num(BITS-1);
                num(BITS-1 downto 1) := num(BITS-2 downto 0);
                num(0) :='0';

                if(i < BITS-1  and bcd(3 downto 0) > "0100") then 
                    bcd(3 downto 0) := bcd(3 downto 0) + "0011";
                end if;

                if(i < BITS-1 and bcd(7 downto 4) > "0100") then 
                    bcd(7 downto 4) := bcd(7 downto 4) + "0011";
                end if;

                if(i < BITS-1 and bcd(11 downto 8) > "0100") then 
                    bcd(11 downto 8) := bcd(11 downto 8) + "0011";
                end if;

                if(i < BITS-1 and bcd(15 downto 12) > "0100") then 
                    bcd(15 downto 12) := bcd(15 downto 12) + "0011";
                end if;
            end loop;
            BCDNumber <= bcd;
        else

        end if;

        old_number := number;
    end process DoubleDabble;
end Behavioral;

下面是生成的警告:

警告:Xst:2734-属性"use_dsp48“不适用于此技术。警告:Xst:1780-信号>从未使用或分配。警告:Xst:737-找到信号的1位锁存器.警告:Xst:737-找到信号的1位锁存器.警告:Xst:737-找到信号的1位锁存器.警告:Xst:737-找到信号的1位锁存器.警告:Xst:737-找到信号的1位锁存器.警告:Xst:737-找到信号的1位锁存器.警告:Xst:737-找到信号的1位锁存器.警告:Xst:737-找到信号的1位锁存器.警告:Xst:737-找到信号的1位锁存器.警告:Xst:737-找到信号的1位锁存器.警告:Xst:737-找到信号16位锁存器.警告:Xst:737-找到信号的1位锁存器.警告:Xst:737-找到信号的1位锁存器.警告:Xst:737-找到信号的1位锁存器.警告:Xst:737-找到信号的1位锁存器.警告:Xst:737-找到信号的1位锁存器.警告:Xst:2734-属性"use_dsp48“不适用于此技术。警告:Xst:1426年- FF/Latch bcd_0的值阻碍了块SSDDriver中的持续清洗。警告:Xst:1293-FF/Latch在块中的恒定值为0。警告:Xst:1293-FF/Latch在块中的恒定值为0。警告:Xst:1293-FF/Latch在块中的恒定值为0。警告:Xst:1293-FF/Latch在块中的恒定值为0。警告:Xst:1293-FF/Latch在块中的恒定值为0。警告:Xst:1293-FF/Latch在块中的恒定值为0。警告:Xst:1293-FF/Latch在块中的恒定值为0。警告:Xst:1293-FF/Latch在块中的恒定值为0。警告:Xst:1293-FF/Latch在块中的恒定值为0。警告:Xst:1293-FF/Latch在块中的恒定值为0。警告:Xst:1293-FF/Latch在块中的恒定值为0。警告:Xst:1293-FF/Latch在块中的恒定值为0。警告:Xst:1293-FF/Latch在块中的恒定值为0。警告:Xst:1293-FF/Latch在块中的恒定值为0。警告:Xst:1293-FF/Latch在块中的恒定值为0。警告:Xst:1293-FF/Latch在块中的恒定值为0。警告:Xst:1710-FF/舱口等等.

由于这些警告,当我实现该模块时,只有0000显示在4 7段显示上。

此VHDL代码应采用整数变量(范围从0到9999),并使用4 7段显示.

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-02-21 20:33:49

转换为同步设计的另一种选择是使逻辑真正异步。

在DoubleDabble过程中,只需注释最外层的if语句,这样您的BCD转换逻辑就会一直运行,并查看它会给您带来什么。您的逻辑不需要前一个整数值(old_number),它是"if number/= old_number“比较(不使用时钟信号和同步逻辑)使合成器适合。

票数 4
EN

Stack Overflow用户

发布于 2012-02-21 19:27:05

是否有任何理由决定以异步方式完成整个BCD转换过程?这是您所有的锁存问题都来自于(双接触进程)。

我几乎肯定,如果您将其转换为同步进程,您应该消除“不断清理”和“闩锁”警告。

“不断清洗”警告将你所有的锁锁修剪到它们的初始值,这就是为什么你总是看到零。

当您需要在事件或实例中注册某项内容时,您几乎应该始终使用时钟。你可能有一个纳秒的时间差,从什么时候这个信号变成真的,什么时候时钟变高,但是相信我,让它和时钟在一起会在将来给你省下这么多的问题。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9383429

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档