我一直试图将这个VHDL代码调试两天,但我只是看不出错误在哪里。这是代码:
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 - 信号&gt;永远不会使用或 分配。警告: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的值init 阻止块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 in 块。警告:Xst:1293 - FF / Latch有一个常数 块中的值为0。警告:Xst:1293 - FF / Latch 块中的常量值为0。警告:Xst:1293 - FF / Latch在块中的常量值为0。 警告:Xst:1293 - FF / Latch的常数值为0 in 块。警告:Xst:1293 - FF / Latch有一个常数 块中的值为0。警告:Xst:1293 - FF / Latch 块中的常量值为0。警告:Xst:1293 - FF / Latch在块中的常量值为0。 警告:Xst:1293 - FF / Latch的常数值为0 in 块。警告:Xst:1293 - FF / Latch有一个 块中的常量值为0。警告:Xst:1293 - FF / Latch 块中的常量值为0。 警告:Xst:1293 - FF / Latch的常数值为0 in 块。警告:Xst:1710 - FF / Latch
依旧......
作为这些警告的结果,当我实施该模块时,我只在4个7段显示器上显示0000。
此VHDL代码应采用整数变量(范围从0到9999)并使用4个7段显示器显示该数字......
答案 0 :(得分:4)
您是否有任何理由决定异步进行整个BCD转换过程?这是所有锁定问题的来源(Double Dabble Process)。
我几乎肯定的是,如果你将它转换为同步过程,你应该摆脱“持续清理”和“锁定”警告。
“持续清洁”警告会将所有锁存器修剪为初始值,因此您始终会看到零。
当您需要在活动或实例中注册时,您几乎应该总是使用时钟。你可能有一个纳秒的时间差,从信号何时变为真,时钟变高,但相信我,及时使用它将为你节省很多问题。
答案 1 :(得分:4)
转换为同步设计的另一种方法是使您的逻辑真正异步。
在DoubleDabble过程中,只需注释最外层的if语句,以便BCD转换逻辑始终运行,并查看它的位置。您的逻辑不需要先前的整数值(old_number),并且它是“if number / = old_number”比较(不使用时钟信号和同步逻辑),使合成器适合。