【发布时间】: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 <= '0';使进程处于非标准时钟进程中,因此您的模拟永远不会匹配合成。 -
确切的错误信息会很有帮助,因为它还应该包含违规网络的名称。这些错误消息是来自模拟器还是综合工具?准确告诉我们工具和版本
-
我目前无法重现错误消息,因为我不能在家中进行合成程序。我使用了一个名为“Go with the flow”的程序来制作 VHDL 脚本。我使用“ModelSim”来模拟 VHDL 脚本和 Go With The Flow 中的合成代码。当我合成 VHDL 脚本时,所有带有“设置”的行都不存在。整个“设置”信号都不存在。