【问题标题】:VHDL Saving input value into another signalVHDL 将输入值保存到另一个信号中
【发布时间】:2013-12-18 14:02:15
【问题描述】:

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

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

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

所以我的两个问题:

  • 这是否确实解决了设置违规问题?
  • 如果是这样:为什么信号设置没有价值。它的值未定义。我做错了什么?
  • 如果不是:为什么不,那我该如何解决?

代码:

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 个 case 语句;这是因为输入信号不是二进制编码的;他们被颠倒了。除此之外:不计算 1、2、4、8、16 等;计数:1,2,4,8,10,20 等。

编辑

我现在把整个架构放进去。 我收到的错误消息类似于:“发生设置时间违规(?)”。所以我相信当我收到分钟时我不能立即保存输入的分钟。这就是为什么我试图在设置信号中编程。希望大家能帮忙。这个错误已经让我很头疼,也很沮丧:(

编辑 2

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

【问题讨论】:

  • 您能否复制并粘贴您在计时报告中看到的实际计时错误?
  • 就像:“设置时间违规”。够了吗?
  • 这一行setup &lt;= '0'; 使进程处于非标准时钟进程中,因此您的模拟永远不会匹配合成。
  • 确切的错误信息会很有帮助,因为它还应该包含违规网络的名称。这些错误消息是来自模拟器还是综合工具?准确告诉我们工具和版本
  • 我目前无法重现错误消息,因为我不能在家中进行合成程序。我使用了一个名为“Go with the flow”的程序来制作 VHDL 脚本。我使用“ModelSim”来模拟 VHDL 脚本和 Go With The Flow 中的合成代码。当我合成 VHDL 脚本时,所有带有“设置”的行都不存在。整个“设置”信号都不存在。

标签: counter vhdl clock


【解决方案1】:

你的代码真的是一团糟,而且很难调试... :-( 我认为问题在于您对信号设置有多个定义。此外,第一次是在时钟进程内定义的(即使setup &lt;= '0' 在 if 语句之外)。第二次是在另一个没有计时的进程中定义的。我认为综合工具不知道如何进行。在 RTL 代码的仿真中,您通常会在设置信号上看到一些毛刺。我也认为设置的类型是set_logic。尝试将其更改为 std_ulogic。仿真工具不会编译您的代码,因为此类型未解析。修复代码,然后返回 std_logic。 另一件事:你写了if setup &lt; '1' then:这对我来说听起来很奇怪(我不知道它被接受了)。我更喜欢写if setup /= '1' then:这样的代码读起来容易多了……

【讨论】:

  • 嗯,首先。在合成过程中我根本没有设置信号。如果没有设置信号,模拟器会给出错误:setup_violation。这是我的第一个问题:为什么会出现这个错误?我认为是因为节省了输入。我想我应该将储蓄延迟 2 个时钟周期。这就是设置信号的来源。你知道我如何实现这个设置信号,所以它计算 2 个时钟周期,然后他保存输入?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多