Может кто-нибудь помочь с 5х7 точечным матричным дисплеем простого кода VHDL для символа "R"?
Это код, который я использую, но мне нужно замедлить время, чтобы увидеть, как меняются столбцы и строки. Я думаю, что есть некоторые проблемы с моим тактированием:
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.STD_LOGIC_ARITH.all;
use IEEE.STD_LOGIC_UNSIGNED.all;
-- Uncomment the following library declaration if using
-- arithmetic functions with Signed or Unsigned values
--use IEEE.NUMERIC_STD.ALL;
-- Uncomment the following library declaration if instantiating
-- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;
entity dot_matrix is
port (main_clk, en : in std_logic;
switches : in std_logic_vector (3 downto 0);
rows : inout std_logic_vector (6 downto 0);
col : inout std_logic_vector (4 downto 0));
end dot_matrix;
architecture Behavioral of dot_matrix is
signal row_count : std_logic_vector(2 downto 0);
signal counter : integer range 0 to 25000000 := 0; -- to divide the clock down
signal slow_clock : std_logic := '0';
begin
clockdiv1 : process(main_clk)
begin
if main_clk'event and main_clk = '1' then
if counter = 24999999 then
counter <= 0;
slow_clock <= not slow_clock;
else
counter <= counter + 1;
end if;
end if;
end process clockdiv1;
SM : process (slow_clock)
begin
if (slow_clock'event and slow_clock = '1') then
if (en = '1') then
if (row_count = "100") then
row_count <= "000";
else
row_count <= row_count + 1;
end if;
else
row_count <= "000";
end if;
end if;
end process SM;
DIS : process (row_count)
begin
if row_count = "000" then --1st clock count
col <= "01111"; --selecting 1st column
rows <= "1111111"; -- putting the data on the 1st column
elsif row_count = "001" then -- 2nd clock count
col <= "10111"; -- selecting 2nd column
rows <= "1001000";
row_count = "010" then -- 3rd clock count
col <= "11011"; -- selecting 3rd column
rows <= "1001100";
elsif row_count = "011" then -- 4th clock count
col <= "11101"; -- selecting 4th column
rows <= "1001010";
elsif row_count = "100" then -- 5th clock count
col <= "11110"; -- selecting 5th column
rows <= "0110001";
-- 1 1 1 1 0
-- 1 0 0 0 1
-- 1 0 0 0 1
-- 1 1 1 1 0
-- 1 0 1 0 0
-- 1 0 0 1 0
-- 1 0 0 0 1
end if;
end process DIS;
end Behavioral;
РЕДАКТИРОВАТЬ: необходимо добавить текст после исправления отступа кода.
2 ответа
В строке отсутствует "elsif"
row_count = "010" then
возможно, это уже решает вашу проблему.
Вы используете начальное значение '0'
за ваши медленные часы. Вы должны проверить, поддерживает ли ваш синтезатор и целевая технология это. Некоторые FPGA делают, некоторые нет. Кроме того, вы можете добавить сигнал сброса и установить значение, когда сброс включен.
Другие комментарии:
- Как говорит твоя судьба: тебе нужен
elsif
на полпути в вашем коде. - Не используйте IEEE.STD_LOGIC_ARITH и IEEE.STD_LOGIC_UNSIGNED. Они не стандартные. Вместо этого используйте ieee.numeric_std. Более подробная информация на: http://www.sigasi.com/content/deprecated-ieee-libraries