我对我的VHDL代码有疑问。我的整个代码必须执行以下操作:
所以我建立了一个计数器,它计算(很好的模拟容易度为1/10秒而不是一分钟)时钟周期,直到一分钟结束。然后它将分钟提高1,并将其发送到输出。但是我遇到了一个问题:由于设置违规,我无法很好地模拟合成。我认为这违规行为是:min_save =分钟。我认为不可能立即保存输入分钟,所以我想:让我们构建另一个计数器,计数1个时钟周期,然后保存它。
所以我的两个问题:
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
忘掉整个“设置”信号。一名学生助理向我指出,输入的保存没有任何意义。所以我更新的问题是:如何将输入信号/值正确保存到另一个信号中?
答案 0 :(得分:0)
你的代码实在是一团糟,调试起来非常困难...... :-(
我认为问题是由于你有一个信号设置的多重定义。此外,第一次在时钟进程内定义(即使setup <= '0'
在if语句之外)。第二次是在另一个没有计时的进程中定义的。我认为综合工具不知道如何准确地进行。在模拟RTL代码时,通常应该在设置信号上看到一些毛刺。我还认为安装类型是set_logic。尝试将其更改为std_ulogic。模拟工具将无法编译您的代码,因为此类型尚未解析。修复代码,然后返回std_logic。
另一件事:你写了if setup < '1' then
:这对我来说听起来很奇怪(我不知道它被接受了)。我更喜欢写if setup /= '1' then
:阅读这种代码要容易得多......