📄 led_scan.vhd
字号:
--BIT SCAN CLK 1M
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
ENTITY LED_SCAN IS
PORT(
CLK_50M :IN STD_LOGIC;
---TO RAM
DGIN :IN STD_LOGIC_VECTOR(7 DOWNTO 0);
DRIN :IN STD_LOGIC_VECTOR(7 DOWNTO 0);
READCLK_RAM:OUT STD_LOGIC;
READADDR_RAM:OUT STD_LOGIC_VECTOR(13 DOWNTO 0);
---LED DISPLAY BOARD
OE :OUT STD_LOGIC;
-- OER :OUT STD_LOGIC;
DG :OUT STD_LOGIC;
DR :OUT STD_LOGIC;
CLK :OUT STD_LOGIC; --移位时钟
STB :OUT STD_LOGIC; --595锁存
SC :OUT STD_LOGIC_VECTOR(3 DOWNTO 0));
----addr :OUT STD_LOGIC_VECTOR(10 DOWNTO 0));
END;
ARCHITECTURE LIN OF LED_SCAN IS
SIGNAL iSC :STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL iDG :STD_LOGIC;
SIGNAL iDR :STD_LOGIC;
SIGNAL BIT_SHIFT_COUNT :INTEGER RANGE 0 TO 260;
SIGNAL DIV_COUNT :INTEGER RANGE 0 TO 24;
SIGNAL CLK_1M :STD_LOGIC;
SIGNAL CLK_SHIFT_EN:STD_LOGIC;
SIGNAL GRAY_COUNT:STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL addcon :INTEGER range 0 to 1024:=0;
signal zhen :STD_LOGIC_VECTOR(1 DOWNTO 0);
--------- signal zhenadd :INTEGER range 0 to 16384:=0;
BEGIN
DG<=iDG;
DR<=iDR;
SC<=iSC;
READCLK_RAM<=CLK_50M;
----位移位时钟生成----------------------------------------------------
PROCESS(CLK_50M,DIV_COUNT,CLK_1M)
BEGIN
IF CLK_50M'EVENT AND CLK_50M='1' THEN
IF DIV_COUNT>=1 THEN
DIV_COUNT<=0;
CLK_1M<=NOT CLK_1M;
ELSE
DIV_COUNT<=DIV_COUNT+1;
END IF;
END IF;
END PROCESS;
----图象数据读取------------------------------------------------------
process(zhen)
begin
READADDR_RAM(13 downto 12)<=zhen;
----case zhen is
-----when"00"=> READADDR_RAM(13 downto 12)<="00";
-----when"01"=> READADDR_RAM(13 downto 12)<="01";
-----when"10"=> READADDR_RAM(13 downto 12)<="10";
-----when"11"=> READADDR_RAM(13 downto 12)<="11";
-----end case;
end process;
PROCESS(CLK_1M,BIT_SHIFT_COUNT)
BEGIN
IF CLK_1M'EVENT AND CLK_1M='1' THEN
if isc="1111" then
if BIT_SHIFT_COUNT>=192 THEN
READADDR_RAM(11 downto 0)<=CONV_STD_LOGIC_VECTOR( BIT_SHIFT_COUNT-192+3072,12);
ELSif BIT_SHIFT_COUNT>=128 THEN
READADDR_RAM(11 downto 0)<=CONV_STD_LOGIC_VECTOR( BIT_SHIFT_COUNT-128+2048,12);
elsIF BIT_SHIFT_COUNT>=64 THEN
READADDR_RAM(11 downto 0)<=CONV_STD_LOGIC_VECTOR( BIT_SHIFT_COUNT-64+1024,12);
else
READADDR_RAM(11 downto 0)<=CONV_STD_LOGIC_VECTOR( BIT_SHIFT_COUNT+4096,12);
end if;
end if;
if isc<="1110" then
if BIT_SHIFT_COUNT>=192 THEN
READADDR_RAM(11 downto 0)<=CONV_STD_LOGIC_VECTOR( BIT_SHIFT_COUNT-192+3072+addcon+64,12);
ELSif BIT_SHIFT_COUNT>=128 THEN
READADDR_RAM(11 downto 0)<=CONV_STD_LOGIC_VECTOR( BIT_SHIFT_COUNT-128+2048+addcon+64,12);
elsIF BIT_SHIFT_COUNT>=64 THEN
READADDR_RAM(11 downto 0)<=CONV_STD_LOGIC_VECTOR( BIT_SHIFT_COUNT-64+1024+addcon+64,12);
else
READADDR_RAM(11 downto 0)<=CONV_STD_LOGIC_VECTOR( BIT_SHIFT_COUNT+addcon+64,12);
END IF;
END IF;
END IF;
END PROCESS;
----位移输出----------------------------------------------------------
----process(clk_1m,gray_count,BIT_SHIFT_COUNT)
---- begin
-----IF CLK_1M'EVENT AND CLK_1M='0' THEN
-----if gray_count="11111111"and BIT_SHIFT_COUNT=258 then
----zhen<=zhen+1;
----end if;
----end if;
-----end process;
PROCESS(CLK_1M,BIT_SHIFT_COUNT)
BEGIN
IF CLK_1M'EVENT AND CLK_1M='0' THEN
IF BIT_SHIFT_COUNT>=258 THEN
BIT_SHIFT_COUNT<=0;
CLK_SHIFT_EN<='0';
iSC<=iSC+1;
addcon<=addcon+64;
IF iSC="1111" THEN
GRAY_COUNT<=GRAY_COUNT+1;
addcon<=0;
if gray_count="11111111"then
zhen<=zhen+1;
end if;
END IF;
ELSIF BIT_SHIFT_COUNT=257 THEN
BIT_SHIFT_COUNT<=BIT_SHIFT_COUNT+1;
CLK_SHIFT_EN<='0';
ELSIF BIT_SHIFT_COUNT=256 THEN
BIT_SHIFT_COUNT<=BIT_SHIFT_COUNT+1;
STB<='1';
CLK_SHIFT_EN<='0';
ELSIF BIT_SHIFT_COUNT>=255 THEN
OE<='1';
--OER<='1';
BIT_SHIFT_COUNT<=BIT_SHIFT_COUNT+1;
ELSIF BIT_SHIFT_COUNT=0 THEn
CLK_SHIFT_EN<='1';
BIT_SHIFT_COUNT<=BIT_SHIFT_COUNT+1;
ELSE
STB<='0';
OE<='0';
--OER<='0';
BIT_SHIFT_COUNT<=BIT_SHIFT_COUNT+1;
CLK_SHIFT_EN<='1';
END IF;
END IF;
END PROCESS;
-----位移时钟给出-----------------------------------------
PROCESS(CLK_SHIFT_EN,CLK_1M)
BEGIN
IF CLK_SHIFT_EN='1' THEN
CLK<=CLK_1M;
ELSE
CLK<='0';
END IF;
END PROCESS;
----位移数据给出------------------------------------------------------
PROCESS(CLK_1M,BIT_SHIFT_COUNT)
BEGIN
IF CLK_1M'EVENT AND CLK_1M='0' THEN
IF DGIN>GRAY_COUNT THEN
iDG<='0';
ELSE
iDG<='1';
END IF;
IF DrIN>GRAY_COUNT THEN
iDR<='0';
ELSE
iDR<='1';
END IF;
END IF;
END PROCESS;
----addr<=CONV_STD_LOGIC_VECTOR(addcon,11);
--完---------------------------------------------------------------
END LIN;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -