VHDL将输入值保存到另一个信号中

时间:2013-12-02 18:42:55

标签: counter vhdl clock

我对我的VHDL代码有疑问。我的整个代码必须执行以下操作:

  • 输入=分钟+小时+ clk
  • 输出= 1分钟后:分钟=分钟+ 1(如果需要小时+ = 1)

所以我建立了一个计数器,它计算(很好的模拟容易度为1/10秒而不是一分钟)时钟周期,直到一分钟结束。然后它将分钟提高1,并将其发送到输出。但是我遇到了一个问题:由于设置违规,我无法很好地模拟合成。我认为这违规行为是:min_save =分钟。我认为不可能立即保存输入分钟,所以我想:让我们构建另一个计数器,计数1个时钟周期,然后保存它。

所以我的两个问题:

  • 这确实解决了设置违规吗?
  • 如果是这样的话:为什么信号设置没有价值。它的值为undefined。我做错了什么?
  • 如果没有:为什么不呢,我怎么解决呢?

CODE:

architecture behaviour of internclk_u is
begin
process (minuten)
begin                -- switching input minutes to binary. 
  minintern(6) <= minuten(0);
  minintern(5) <= minuten(1);
  minintern(4) <= minuten(2);
  minintern(3) <= minuten(3);
  minintern(2) <= minuten(4);
  minintern(1) <= minuten(5);
  minintern(0) <= minuten(6);
end process;

process (uren)
begin                        -- switching input hours to binary
  uurintern(5) <= uren(0);
  uurintern(4) <= uren(1);
  uurintern(3) <= uren(2);
  uurintern(2) <= uren(3);
  uurintern(1) <= uren(4);
  uurintern(0) <= uren(5);
end process;
process (clk)
begin   
    setup <= '0';
    if(clk'event and clk = '1') then
            if(setup < '1') then
                    setup <= '1';
            else
                    setup <= setup;
                    if(min_save = minutes) then
                    count <= new_count;
                    else
                    min_save <= minutes;
                    count <= (others => '0');       
                    end if;
            end if;
    end if;
end process;

process (count, minintern)
begin                   -- count one minute (now its 0.1 second)
if(count < F/10 ) then
    new_count <= count + 1;
    intern_out <= minintern;
    uurintern_out <= uurintern;
else
    case minintern is               -- Calculate new value for output
    when "0001001" => intern_out    <= "0010000";
                      uurintern_out <= uurintern;
    when "0011001" => intern_out    <= "0100000";
                      uurintern_out <= uurintern;
    when "0101001" => intern_out    <= "0110000";
                      uurintern_out <= uurintern;
    when "0111001" => intern_out    <= "1000000";
                      uurintern_out <= uurintern;
    when "1001001" => intern_out    <= "1010000";
                      uurintern_out <= uurintern;
    when "1011001" => intern_out    <= "0000000";
                      case uurintern is
                        when "001001" => uurintern_out <= "010000";
                        when "011001" => uurintern_out <= "100000";
                        when others   => uurintern_out <= uurintern + 1;
                        end case;
    when others       => intern_out    <= minintern + 1;
                      uurintern_out <= uurintern;
    end case;
    new_count <= count;
    setup <= '0';
end if;
end process;

process (intern_out)   -- Reversing signals for next blocks in system
begin
  interne_tijd_m(6) <= intern_out(0);
  interne_tijd_m(5) <= intern_out(1);
  interne_tijd_m(4) <= intern_out(2);
  interne_tijd_m(3) <= intern_out(3);
  interne_tijd_m(2) <= intern_out(4);
  interne_tijd_m(1) <= intern_out(5);
  interne_tijd_m(0) <= intern_out(6);
end process;

process (uurintern_out)
begin                     -- Reversing signals for next blocks in system
  interne_tijd_u(5) <= uurintern_out(0);
  interne_tijd_u(4) <= uurintern_out(1);
  interne_tijd_u(3) <= uurintern_out(2);
  interne_tijd_u(2) <= uurintern_out(3);
  interne_tijd_u(1) <= uurintern_out(4);
  interne_tijd_u(0) <= uurintern_out(5);
end process;
end behaviour;

说明:

  • 忽略2个案例陈述;这是因为输入信号不是二进制编码的;他们是逆转的。除此之外:它不算1,2,4,8,16等;它数:1,2,4,8,10,20等。

修改

我现在整个架构。 我收到的错误消息是:“安装时间违规发生(?)”。所以我相信当我收到分钟时我不能立即保存输入分钟。这就是我尝试在设置信号中编程的原因。希望你们能帮忙。这个错误使我头疼并且已经感到很沮丧:(

编辑2

忘掉整个“设置”信号。一名学生助理向我指出,输入的保存没有任何意义。所以我更新的问题是:如何将输入信号/值正确保存到另一个信号中?

1 个答案:

答案 0 :(得分:0)

你的代码实在是一团糟,调试起来非常困难...... :-( 我认为问题是由于你有一个信号设置的多重定义。此外,第一次在时钟进程内定义(即使setup <= '0'在if语句之外)。第二次是在另一个没有计时的进程中定义的。我认为综合工具不知道如何准确地进行。在模拟RTL代码时,通常应该在设置信号上看到一些毛刺。我还认为安装类型是set_logic。尝试将其更改为std_ulogic。模拟工具将无法编译您的代码,因为此类型尚未解析。修复代码,然后返回std_logic。 另一件事:你写了if setup < '1' then:这对我来说听起来很奇怪(我不知道它被接受了)。我更喜欢写if setup /= '1' then:阅读这种代码要容易得多......