Text VHDL-在7段显示器上滚动文本

Text VHDL-在7段显示器上滚动文本,text,scroll,vhdl,shift,segment,Text,Scroll,Vhdl,Shift,Segment,我的项目快结束了,但在某个时候卡住了。我不能解决这个问题 在确定VHDL很难改变数组的索引之后,我决定改变我的移位器模块。现在它已经被正确编译,RTL原理图似乎是正确的,但不幸的是,我使用了一种非创新的方式来转换扫描代码 我定义了一个64位的std_logic_向量,它最多可以容纳8个扫描码,然后解析该向量中最高位的4个字节,并将它们定向到七段控制器,该控制器对输入进行多路复用,并决定启用哪个七段。我想我的时钟有问题,但在显示器上看不到任何东西让我觉得设备的某些部分出现了故障。我确信我的键盘控制

我的项目快结束了,但在某个时候卡住了。我不能解决这个问题

在确定VHDL很难改变数组的索引之后,我决定改变我的移位器模块。现在它已经被正确编译,RTL原理图似乎是正确的,但不幸的是,我使用了一种非创新的方式来转换扫描代码

我定义了一个64位的std_logic_向量,它最多可以容纳8个扫描码,然后解析该向量中最高位的4个字节,并将它们定向到七段控制器,该控制器对输入进行多路复用,并决定启用哪个七段。我想我的时钟有问题,但在显示器上看不到任何东西让我觉得设备的某些部分出现了故障。我确信我的键盘控制器工作得很好,因为我单独尝试过,移位器看起来也很好(我也在FPGA上尝试过这个,但没有减慢时钟,但我能够看到我输入的最后一个扫描代码),我没有想到任何方法/方法来尝试7段控制器,但这似乎也很好。我不知道问题是什么,文本没有滚动:(

移位器

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
use IEEE.numeric_std.all;

entity my_shifter is
        port(clk      : in  std_logic;
                Scan_Dav : in  std_logic;
                Data_in  : in  std_logic_vector (7 downto 0);
                O1 : out std_logic_vector(7 downto 0);
                O2 : out std_logic_vector(7 downto 0);
                O3 : out std_logic_vector(7 downto 0);
                O4 : out std_logic_vector(7 downto 0)
                );
end my_shifter;

architecture bhv of my_shifter is

signal bytes : std_logic_vector(63 downto 0);
begin
    process (clk) begin
        if rising_edge(clk) then
                if Scan_Dav = '1' then
                    bytes <= bytes (bytes'high-8 downto 0) & Data_in;
                end if;
          end if;
    end process;
     O1 <= bytes(63 downto 56);
     O2 <= bytes(55 downto 48);
     O3 <= bytes(47 downto 40);
     O4 <= bytes(39 downto 32);
end bhv;
IEEE库;
使用IEEE.STD_LOGIC_1164.ALL;
使用IEEE.STD_LOGIC_UNSIGNED.ALL;
使用IEEE.numeric_std.all;
实体我的移位器是
端口(时钟:在标准逻辑中;
扫描Dav:在标准逻辑中;
数据输入:标准逻辑向量(7到0);
O1:输出标准逻辑向量(7到0);
O2:输出标准逻辑向量(7到0);
O3:输出标准逻辑向量(7到0);
O4:输出标准逻辑向量(7到0)
);
结束我的移动;
我的换档杆的结构bhv为
信号字节:标准逻辑向量(63至0);
开始
进程(clk)开始
如果上升沿(clk),则
如果Scan_Dav='1',则
字节段);

DecoderInput我们不知道七段解码器的接口协议,但是看起来很有趣,你只有两个输入,但没有时钟。解码器如何知道何时解释信号?

“我还没有想到任何方法来尝试7段控制器”

除非您使用的是非常旧的ISE版本,当然比ISE10旧,否则它内置了一个相当不错的模拟器(ISIM)。(ISIM的历史可以追溯到ISE10之前,但它实际上并不可用,甚至ISIM 10也有它的问题……)


如果您编写了一个简单的测试台,并在运行过程中对这些模块进行了单元测试,您将节省大量时间。

您在物理显示器或模拟显示器上看不到数字吗?您是否单独测试了显示器?什么是七段解码器?七段解码器是将扫描码转换为g段到a段的组件。实际上,我在物理显示器(BASYS2 FPGA)上看到数字,它也在移动,但我无法同时看到它们,我按下的最后一个键显示在显示器上。我想我最终会遇到时钟问题…7段解码器通常是组合(和或阵列)或FPGA中的ROM或LUT,不需要时钟。相信我,解码器不是错误源。不过我解决了一些错误。现在我确实在7段显示器上看到了文字,但例如,当我按下P和O键时,我看到的文字是这样的:“PPPOO…”我真的无法确定如何在这里继续前进。我脑海中的一个想法是移位器模块中的if语句。我开始认为它们不适合我的使用,但也没有更好的解决方案。关于“错误”移位,另一个需要注意的重要问题是,它似乎与时钟优化有关,尽管我几乎可以肯定所有的时钟都适合各自的模块。键盘控制使用50 mHz的时钟,并将其在模块内部划分为1/8。移位器使用clkdivide输出,7SegmentController使用2kHz,这足以让我们不区分每个显示单元。如果您看到每个按钮按下都有多个数字,您是否要取消按钮抖动?此外,如果你在不同的时钟下运行电路的不同部分,你会为自己积累更多的问题。使用单个时钟,“添加时钟”可以使电路的某些部分运行得更慢。我正在键盘接口模块中消除抖动是的,当我单独尝试时,无论我按多长时间,我只能得到1个扫描码。至于时钟,我有一个用于移位器模块的分频器(我必须有一个,以调整向右移位的速度?),FPGA(50 MHz)时钟直接进入键盘控制,因为它单独与该时钟工作良好,我还将FPGA的时钟定向到SevenSegmentController(内部有一个预分频器),为了能够以不同的方式显示每个数字。我正在使用ISE12.4,也知道测试工作台,但随着我的进步,我手工测试了这些模块。我没有抽出时间测试七段控制器的原因是我在另一个项目中也使用了它,所以我相信它不会出现故障。
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity clkdivide is
    Port (clkin: in std_logic;
            clkout:out std_logic );
end clkdivide;

architecture Behavioral of clkdivide is
    signal int_clock:std_logic;
    begin
        clkout<=int_clock;
    process(clkin)
        variable var:integer range 0 to 12500 :=0;
        begin
            if (clkin'event and clkin = '1') then
                if var = 12500 then
                    int_clock <= not int_clock; 
                    var:=0;
                else 
                    var:=var+1;
                end if;
            end if;
    end process;
end Behavioral;
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;

entity SevenSegmentController is
    port (
        CLK: in std_logic;
        DEC1, DEC2, DEC3, DEC4: in std_logic_vector(7 downto 0);
        SEGMENTS: out std_logic_vector(6 downto 0);
        ANODES: out std_logic_vector(3 downto 0)
    );
end SevenSegmentController;

architecture Behavioral of SevenSegmentController is
   signal DecoderInput: std_logic_vector(7 downto 0);
    signal CurrentDisplay: std_logic_vector(1 downto 0) := "00";
    signal Prescaler: std_logic_vector(15 downto 0) := (others => '0');
begin

    Multiplex: process(CLK)
    begin
        if rising_edge(CLK) then
            if Prescaler(15) = '0' then
                Prescaler <= Prescaler + 1;
            else
                CurrentDisplay <= CurrentDisplay + 1;
                Prescaler <= (others => '0');
            end if;
        end if;
    end process Multiplex;

    SevenSegmentDecoder: entity work.SevenSegment_Decoder(Behavioral)
        generic map ( INVERT_OUTPUT => '1' )
        port map ( number => DecoderInput, segment => SEGMENTS );   

    DecoderInput <= DEC1 when CurrentDisplay = "00" else
                        DEC2 when CurrentDisplay = "01" else
                         DEC3 when CurrentDisplay = "10" else
                         DEC4 when CurrentDisplay = "11";

   ANODES <= "0111" when CurrentDisplay = "00" else
                 "1011" when CurrentDisplay = "01" else
                 "1101" when CurrentDisplay = "10" else
                 "1110" when CurrentDisplay = "11";              

end Behavioral;