vhdl帮助,计数器编,不算数

时间:2015-05-30 06:36:23

标签: vhdl fpga intel-fpga quartus cyclone

所以这应该在fpga(旋风3)上从0到9999计数,好吧它不做T_T,  我可以找到它的错误,  我的意思是当我在活动的vhdl上进行模拟时,y从未从0 0 0 0传递,我在做模拟错误吗? (我不能把它放到fpga直到星期一:/) 编译显示没有错误。我愿意付钱给别人来完成这件事,PLZ,这决定了我是否通过了这门课程:(

文件 vhdl files

1 个答案:

答案 0 :(得分:0)

正如David Koontz所说,目前还不清楚你的实际问题是什么。

convert.vhd是一个7段显示的解码器,用于数字0到9。作为参考,你应该记录你的VHDL:

     6
    ---
1 |     | 5
  |     |
    ---
2 |  0  | 4
  |     |
    ---
     3

不要再使用ieee.std_logic_arith.allieee.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.allieee.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