所以这应该在fpga(旋风3)上从0到9999计数,好吧它不做T_T, 我可以找到它的错误, 我的意思是当我在活动的vhdl上进行模拟时,y从未从0 0 0 0传递,我在做模拟错误吗? (我不能把它放到fpga直到星期一:/) 编译显示没有错误。我愿意付钱给别人来完成这件事,PLZ,这决定了我是否通过了这门课程:(
文件 vhdl files
答案 0 :(得分:0)
正如David Koontz所说,目前还不清楚你的实际问题是什么。
convert.vhd
是一个7段显示的解码器,用于数字0到9。作为参考,你应该记录你的VHDL:
6
---
1 | | 5
| |
---
2 | 0 | 4
| |
---
3
不要再使用ieee.std_logic_arith.all
和ieee.std_logic_unsigned
了!删除那些的使用条款。
我认为你对std_logic的使用不关心(“ - ”)是有效的。除了缺少文档和在这里使用非常旧的库之外,我没有看到任何其他问题。
cont11.vhd
是一个从00000到40000的简单递增计数器。它不会溢出,因此必须定期异步复位。如果这是您的问题,请确保您不会意外断言重置(即在整个模拟过程中重置='0')。
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all; -- problematic
use ieee.std_logic_unsigned.all; -- problematic
use ieee.numeric_std.all;
不要再使用ieee.std_logic_arith.all
和ieee.std_logic_unsigned
了!删除那些的使用条款。请特别注意ieee.numeric_std和ieee.std_logic_unsigned的类型定义冲突!
您应该相应地更改您的代码:
architecture count1 of cont11 is
signal count1: unsigned(13 downto 0):= to_unsigned(0, count1'length);
begin
process (clk, reset)
begin
if (reset = '0') then
count1 <= to_unsigned(0, count1'length);
elsif (rising_edge(clk)) then
if (count1 <= 39999) then
count1 <= count1 + 1;
end if;
end if;
end process;
q <= std_logic_vector(count1);
end architecture count1;
通常,尽量避免异步重置。在适当的地方使用unsigned
。如果您必须转换回std_logic_vector
,请在最后执行此操作。
control.vhd
是4:1多路复用器。我看到的唯一问题是Señal
不是有效的VHDL标识符。 VHDL标识符只能使用字母数字字符(A-Za-z0-9_)。其他规则也适用。 ñ
不是字母数字字符。
frecuencia.vhd
是时钟预分频器。 clk_out = clk_in / 20000000
。我想这可以为你的7段显示器提供1 Hz的clk_out,20 MHz clk_in。
通常,尽量避免异步重置。在适当的地方使用unsigned
。使用integer
可能会产生比计数器所需更多的位。不过,这对我来说还不错。
binbcd.vhd
是一个14位二进制到4位二进制编码的十进制转换器。我假设您在问题中引用的输出是“0 0 0 0”。
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
不要再使用ieee.std_logic_unsigned
了!删除它的use子句。如果您需要签名/未签名数学,请替换为ieee.numeric_std
。
除此之外,它是双重算法的并行实现(移位一,加三)。您可以查看Wikipedia,因为它包含使用unsigned
的问题的另一种解决方案。
我认为你的指数范围很奇怪(29下降0,2下降0未使用?),但除此之外,它应该在模拟中起作用。合成后的工作将在很大程度上取决于您的时钟频率,因为您的设计不是流水线。
结论:所以我认为你想要以20 Mhz运行Cyclone 3,从0到9999计数4次(cont11.vhd
),每秒计数一次({{1} }),在7段显示器(frecuencia.vhd
)上显示转换的BCD编号(bcdbin.vhd
),一次一个数字(convert.vhd
)。
我认为你使用0到40000计数器的最低位来复用显示哪个数字,所以第一秒你会看到数字,第二秒你看到几十,第三秒你看到数百,第四秒你看到数千。
对代码的分析使我得出结论,模拟期间的问题出现在您未显示的模块中:顶层,连接所有这些子模块或用于测试的测试平台。在您的设计或测试平台中,主要候选者将是倒置的control.vhd
。