新到手了一片FPGA,花了两天时间,看了一些书,算是懂了VHDL最基础的一点点。总算是把这份24进制计数器做出来了。现在我分以下几个部分总结:
- 程序代码
- 对于软件操作的总结
- 对于VHDL语言的总结
----------------------------------------------------------------------------------
-- Company:
-- Engineer:
--
-- Create Date: 14:40:39 09/27/2016
-- Design Name:
-- Module Name: Module01 - Behavioral
-- Project Name:
-- Target Devices:
-- Tool versions:
-- Description:
--
-- Dependencies:
--
-- Revision:
-- Revision 0.01 - File Created
-- Additional Comments:
--
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.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 Module01 is
Port ( cp : in STD_LOGIC;
rst : in STD_LOGIC;
Wela : out STD_LOGIC_VECTOR (7 downto 0);
Dula : out STD_LOGIC_VECTOR (5 downto 0));
end Module01;
architecture Behavioral of Module01 is
signal i : integer range 0 to 15;
signal Count : integer range 0 to 65535;
signal Timer0Value : integer range 0 to 65535;
signal Timer0IntSt : STD_LOGIC;
--BCD码
TYPE BCD IS ARRAY (NATURAL RANGE <>) OF
STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL DATA : BCD (1 DOWNTO 0);
--数码管数据类型
TYPE SMG_Buff_Type IS ARRAY (NATURAL RANGE <>) OF
STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL SMG_Buff : SMG_Buff_Type (5 DOWNTO 0) := (X"ff",X"ff",X"ff",X"ff",X"ff",X"ff");
CONSTANT SMG_Code : SMG_Buff_Type (0 to 9) :=
(X"c0", X"f9", X"a4", X"b0", X"99", X"92", X"82", X"f8", X"80", X"90");
begin
--cp处理进程
process(cp)
begin
if cp='1' and cp'event then
if rst='0' then
Timer0Value <= 0;
Timer0IntSt <= '0';
else
if Timer0Value = 24999 then
Timer0Value <= 0;
Timer0IntSt <= not Timer0IntSt;
else
Timer0Value <= Timer0Value + 1;
end if;
end if;
end if;
end process;
--数码管刷新进程
process(Timer0IntSt)
begin
if rst='0' then
Count <= 0;
DATA <= (X"0", X"0");
SMG_Buff <= (X"ff",X"ff",X"ff",X"ff",X"ff",X"ff");
else
if Timer0IntSt='1' and Timer0IntSt'event then
if Count=999 then
Count <= 0;
if DATA(0)="1001" then
DATA(0) <= "0000";
DATA(1) <= DATA(1) + 1;
elsif DATA(0)="0011" and DATA(1)="0010" then
DATA(0) <= "0000";
DATA(1) <= "0000";
else
DATA(0) <= DATA(0) + 1;
end if;
SMG_Buff(0) <= SMG_Code(CONV_INTEGER(DATA(0)));
SMG_Buff(1) <= SMG_Code(CONV_INTEGER(DATA(1)));
else
Count <= Count + 1;
end if;
Dula <= "111111";
Wela <= SMG_Buff(i);
Dula <= "111111" - (2**i);
if i=5 then
i <= 0;
else
i <= i+1;
end if;
end if;
end if;
end process;
end Behavioral;
Save 每次进行软件操作前要先保存。
Check Syntax 每次拿不准的时候,可以通过这一项进行语法检测。
Generate Programming File 这一项可以完成所有的检测项,但要注意进程中间是否有占用CPU的进程,一般这一项计算速度并不算慢,拖慢速度的一般是有其他进程占用CPU。特别提醒:打开了iMPACT就不要关闭了,这玩意儿经常关不掉,会有几个占用CPU的进程遗留。
--BCD码
TYPE BCD IS ARRAY (NATURAL RANGE <>) OF
STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL DATA : BCD (1 DOWNTO 0);
--数码管数据类型
TYPE SMG_Buff_Type IS ARRAY (NATURAL RANGE <>) OF
STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL SMG_Buff : SMG_Buff_Type (5 DOWNTO 0) := (X"ff",X"ff",X"ff",X"ff",X"ff",X"ff");
CONSTANT SMG_Code : SMG_Buff_Type (0 to 9) :=
(X"c0", X"f9", X"a4", X"b0", X"99", X"92", X"82", X"f8", X"80", X"90");
Timer0IntSt <= not Timer0IntSt;
作者 [Antony]
2016 年 09月 27日