【问题标题】:problems on simple process for writing number on seven segment display七段显示器上写数字的简单过程的问题
【发布时间】:2014-09-27 18:03:55
【问题描述】:

我是初学者,但仍然不敢相信我无法编写如此简单的代码来工作。 我有 Digilent Nexys2 FPGA,编程 xilinx ISE 我的目标是在两个不同的七段显示器上打印数字“2”和“1”(我想用眼睛看到“21”。A、B、C、D、E、F、G、P 是显示器的led(kathodes),AN0和AN1是显示器的阳极,0亮)。

我试图在那里投资的逻辑是,FPGA 将如此快速地重复这个“过程”,以至于我的眼睛只能检测到灯亮。 我认为我应该将 clk 放入进程敏感度列表的原因是每次时钟发生变化时,它都会进入进程并执行我的命令,对吗? 我在这里犯了什么逻辑错误? 我试图做出 if else 语句,其中 IFrising_edge (clk) then "1" 将显示 else "2" 但它仍然导致一些错误.. 到底是什么?我应该让这个过程计时吗?

这是我想合成它时收到的警告

WARNING:Xst:647 - Input <clk> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved. 

这是我在尝试生成编程位文件时收到的警告

WARNING:PhysDesignRules:367 - The signal <clk_IBUF> is incomplete. The signal does not drive any load pins in the design.
WARNING:Par:288 - The signal clk_IBUF has no load.  PAR will not attempt to route this signal.
WARNING:Par:283 - There are 1 loadless signals in this design. This design will cause Bitgen to issue DRC warnings.
WARNING:PhysDesignRules:367 - The signal <clk_IBUF> is incomplete. The signal does not drive any load pins in the design.

这是 UCF- 文件:

NET "clk" LOC = B8;
NET "A" LOC = L18;
NET "B" LOC = F18;
NET "C" LOC = D17;
NET "D" LOC = D16;
NET "E" LOC = G14;
NET "F" LOC = J17;
NET "G" LOC = H14;
NET "P" LOC = C17;
NET "AN0" LOC = F17;
NET "AN1" LOC = H17;
NET "AN2" LOC = C18;
NET "AN3" LOC = F15;

这里是代码本身:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity disp is
    Port ( 
        clk : in STD_LOGIC;
        A : out  STD_LOGIC;
      B : out  STD_LOGIC;
      C : out  STD_LOGIC;
      D : out  STD_LOGIC;
      E : out  STD_LOGIC;
      F : out  STD_LOGIC;
        G : out  STD_LOGIC;
        P : out  STD_LOGIC;
        AN0 : out  STD_LOGIC;
        AN1 : out  STD_LOGIC;
        AN2 : out  STD_LOGIC;
        AN3 : out  STD_LOGIC
    );
end disp;
-- main idea: writing "21" on seven segment display.
architecture BEHAV of disp is
begin
    process (clk)
    begin
        --writing '1' ( AN0 is on )
        AN0 <='0';
        AN1 <='1';
        AN2 <='1';
        AN3 <='1';
        A <='1';
        B <='0';
        C <='0';
        D <='1';
        E <='1';
        F <='1';
        G <='1';
        P <='1';
        --writing '2' ( AN1 is on )
        AN0 <='1';
        AN1 <='0';
        AN2 <='1';
        AN3 <='1';
        A <='0';
        B <='0';
        C <='1';
        D <='0';
        E <='0';
        F <='1';
        G <='0';
        P <='1';
    end process;
end BEHAV;

【问题讨论】:

    标签: vhdl


    【解决方案1】:

    仅将时钟放在敏感度列表中是不够的。你需要一个 if 语句

    If rising_edge (clk) then --where all assingments here End if;

    但这还不够。您还需要更好地弄清楚七段的刷新逻辑。我没有时间,否则我也会告诉你的。

    【讨论】:

    • 你是对的,'1' 和 '2' 相互干扰/相互叠加。就像这两个数字的所有 LED 同时亮起一样。为什么是这样?因为在分配完成之前,FPGA 会再次进入流程吗?所以还没完?或者到底是什么:D我应该为此设置某种延迟(在分配之后(可能使用计数器)。或者类似“在我完成此分配之前不要继续”命令?)?如何? @Morten Zilmer
    【解决方案2】:

    所以, Morten 先生和 Adeel 是对的。 Morten 的代码是正确的,但它“发生”得如此之快,以至于眼睛无法检测到,所以看起来 2 放在了 1 上。所以我添加了计数器,这是代码。

    显示数字的速度取决于常数“速度”

    这里是主要代码本身,等待您的回复(我还能做些什么来让这更简单?)

    library IEEE;
    use IEEE.STD_LOGIC_1164.ALL;
    
        entity disp is
        Port ( 
            SW : in STD_LOGIC; 
            rst : in STD_LOGIC;
            clk : in STD_LOGIC;
            led : out STD_LOGIC;
            A : out  STD_LOGIC;
            B : out  STD_LOGIC;
            C : out  STD_LOGIC;
            D : out  STD_LOGIC;
            E : out  STD_LOGIC;
            F : out  STD_LOGIC;
            G : out  STD_LOGIC;
            P : out  STD_LOGIC;
            AN0 : out  STD_LOGIC;
            AN1 : out  STD_LOGIC;
            AN2 : out  STD_LOGIC;
            AN3 : out  STD_LOGIC
        );
        end disp;
    
    architecture BEHAV of disp is
    
        constant bitwidth : integer := 32; 
        constant Speed : integer := 10; 
        signal   carry : std_logic_vector (bitwidth downto 0);
        signal   counter, counter_reg : std_logic_vector (bitwidth-1 downto 0) :=(others => '0');
        constant value_one : std_logic_vector (bitwidth-1 downto 0) :="00000000000000000000000000000001";
        signal drive_an : std_logic :='0';
    
        component adder is
            Port ( 
                C_in : in  STD_LOGIC;
                A : in  STD_LOGIC;
                B : in  STD_LOGIC;
                C_out : out  STD_LOGIC;
                Sum : out  STD_LOGIC;
                SW : in STD_LOGIC);
        end component; 
    
    begin
    
        carry(0) <= '0';
        g_counter: for N in 0 to bitwidth-1 
        generate    FOUR_ADDER: adder port map (
            C_in => carry(N),   A => counter_reg(N), B => value_one(N), C_out => carry(N+1), Sum => counter(N), SW => SW);
        end generate;     
        led <= carry(bitwidth);
    
        process (clk,rst) begin 
            if rst = '1' then 
                counter_reg <= (others => '0'); 
            elsif rising_edge(clk) then
                counter_reg <= counter; 
                if counter_reg (Speed)= '1' then
                    drive_an <= not drive_an; 
                    counter_reg <= (others => '0'); 
                    if drive_an = '0' then
                        AN0 <= '0';         
                        AN1 <= '1';         
                        AN2 <= '1';         
                        AN3 <= '1';         
                        A   <= '1';         
                        B   <= '0'; 
                        C   <= '0';         
                        D   <= '1';         
                        E   <= '1';         
                        F   <= '1';         
                        G   <= '1';         
                        P   <= '1';
                    else
                        AN0 <= '1';         
                        AN1 <= '0';         
                        AN2 <= '1';         
                        AN3 <= '1';         
                        A   <= '0';         
                        B   <= '0';         
                        C   <= '1';         
                        D   <= '0';         
                        E   <= '0';         
                        F   <= '1';         
                        G   <= '0';         
                        P   <= '1';
                    end if;
                end if;     
            end if;
        end process; 
    end BEHAV;
    

    如果有人需要测试它: 这是加法器的代码

    library IEEE;
    use IEEE.STD_LOGIC_1164.ALL;
    
    entity adder is
        Port ( 
            C_in : in  STD_LOGIC;
            A : in  STD_LOGIC;
            B : in  STD_LOGIC;
            C_out : out  STD_LOGIC;       
            Sum : out  STD_LOGIC;     
            SW : in STD_LOGIC
        );
    end adder;
    
    
    architecture Behavioral of adder is
    begin
        Sum <= C_in xor (a xor (b xor SW));
        C_out <= (a and (b xor SW)) or (C_in and (a xor (b xor SW)));
    end Behavioral;
    

    这是 UCF 文件

    NET "clk" LOC = B8;
    NET "A" LOC = L18;
    NET "B" LOC = F18;
    NET "C" LOC = D17;
    NET "D" LOC = D16;
    NET "E" LOC = G14;
    NET "F" LOC = J17;
    NET "G" LOC = H14;
    NET "P" LOC = C17;
    NET "AN0" LOC = F17;
    NET "AN1" LOC = H17;
    NET "AN2" LOC = C18;
    NET "AN3" LOC = F15;
    NET "led" LOC = J14;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-14
      相关资源
      最近更新 更多