📄 stopwatch.txt
字号:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
ENTITY WATCH IS
PORT(CLK,SCANCLK,CLR,DISPLAY:IN STD_LOGIC; --sconcode为外接的扫描信号;display为翻页回放键;purse为随机存储控制 --时钟;clk为未分频的主频
ROW:OUT STD_LOGIC_VECTOR(2 DOWNTO 0); --位选信号
Beginstop:in std_logic; --beginstop 开始计时标志
LED:OUT STD_LOGIC_VECTOR(6 DOWNTO 0));
END WATCH;
ARCHITECTURE BEHAVEIORAL OF WATCH IS
SIGNAL CNTER:INTEGER range 0 TO 9999; --主频分频比
SIGNAL CLKNEW:STD_LOGIC; --记数时钟的最小单位
SIGNAL MS0,MS1,S0,S1,M0,M1:STD_LOGIC_VECTOR(3 DOWNTO 0); --显示刷新用buffer
SIGNAL DISPCNT:STD_LOGIC_VECTOR(2 DOWNTO 0);
SIGNAL NUM:STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL MS0_1,MS1_1,M1_1,M0_1,S1_1,S0_1:STD_LOGIC_VECTOR (3 DOWNTO 0); --做位存储寄存器buffer
SIGNAL MS0_2,MS1_2,M1_2,M0_2,S1_2,S0_2:STD_LOGIC_VECTOR (3 DOWNTO 0);
SIGNAL MS0_3,MS1_3,M1_3,M0_3,S1_3,S0_3:STD_LOGIC_VECTOR (3 DOWNTO 0);
SIGNAL MS0_4,MS1_4,M1_4,M0_4,S1_4,S0_4:STD_LOGIC_VECTOR (3 DOWNTO 0);
SIGNAL MS0_5,MS1_5,M1_5,M0_5,S1_5,S0_5:STD_LOGIC_VECTOR (3 DOWNTO 0);
SIGNAL COUNTB:INTEGER RANGE 1 TO 11; --翻页记数器
SIGNAL LMS0,LMS1,LS0,LS1,LM0,LM1:STD_LOGIC_VECTOR(3 DOWNTO 0); --存储回放信号时的bhffer
SIGNAL ROWSIG:STD_LOGIC_VECTOR(2 DOWNTO 0);
BEGIN
P1: PROCESS(CLK)
BEGIN
IF CLK'EVENT AND CLK='1'THEN
IF CNTER=9999 THEN CNTER<=0;
ELSE CNTER<=CNTER+1;
END IF;
END IF;
END PROCESS P1;
P2: PROCESS(CNTER)
BEGIN
IF CNTER=9999 THEN CLKNEW<='1';
ELSE CLKNEW<='0';
END IF;
END PROCESS P2;
process(CLKNEW)
begin
if clr ='1' then
ms0(3 downto 0) <="0000";
ms1(3 downto 0) <="0000";
s0(3 downto 0) <="0000";
s1(3 downto 0) <="0000";
m0(3 downto 0) <="0000";
m1(3 downto 0) <="0000";
else if CLKNEW' event and CLKNEW='1' then
if beginstop='1' then ms0<=ms0+1;
if ms0 (3 downto 0)="1001" then
ms0 (3 downto 0)<="0000"; ms1<= ms1+1;
if ms1 (3 downto 0)="1001" then
ms1 (3 downto 0)<="0000"; s0<= s0+1;
if s0 (3 downto 0)="1001" then
s0 (3 downto 0)<="0000"; s1<= s1+1;
if s1 (3 downto 0)="0101" then
s1 (3 downto 0)<="0000"; m0<= m0+1;
if m0 (3 downto 0)="1001" then
m0 (3 downto 0)<="0000"; m1<= m1+1;
if m1 (3 downto 0)="0101" then
m1(3 downto 0)<="0000";
end if; end if; end if; end if; end if; end if; end if;
end if; end if;
end process;
P6: PROCESS(SCANCLK) --扫描基准时钟,实际扫描为其6分频
BEGIN
IF SCANCLK'event and scanclk='1'THEN
IF DISPCNT="110"THEN
DISPCNT<="000";
ELSE DISPCNT<=DISPCNT+'1';
END IF;
END IF;
END PROCESS P6;
P8:PROCESS(DISPLAY) --purse为存储信号控制使能
BEGIN
IF DISPLAY'EVENT AND DISPLAY='0'THEN
IF(COUNTB=1)THEN
MS0_1<=MS0;MS1_1<=MS1;S0_1<=S0;S1_1<=S1;M0_1<=M0;M1_1<=M1;
ELSIF(COUNTB=2)THEN
MS0_2<=MS0;MS1_2<=MS1;S0_2<=S0;S1_2<=S1;M0_2<=M0;M1_2<=M1;
ELSIF(COUNTB=3)THEN
MS0_3<=MS0;MS1_3<=MS1;S0_3<=S0;S1_3<=S1;M0_3<=M0;M1_3<=M1;
ELSIF(COUNTB=4)THEN
MS0_4<=MS0;MS1_4<=MS1;S0_4<=S0;S1_4<=S1;M0_4<=M0;M1_4<=M1;
ELSIF(COUNTB=5)THEN
MS0_5<=MS0;MS1_5<=MS1;S0_5<=S0;S1_5<=S1;M0_5<=M0;M1_5<=M1;
END IF;
END IF;
END PROCESS P8;
P10:PROCESS(DISPLAY) --回放控制使能
BEGIN
IF DISPLAY'EVENT AND DISPLAY ='0'THEN
IF(COUNTB=6)THEN
LMS0<=MS0_1;LMS1<=MS1_1;LS0<=S0_1;LS1<=S1_1;LM0<=M0_1;LM1<=M1_1;
ELSIF(COUNTB=7)THEN
LMS0<=MS0_2;LMS1<=MS1_2;LS0<=S0_2;LS1<=S1_2;LM0<=M0_2;LM1<=M1_2;
ELSIF(COUNTB=8)THEN
LMS0<=MS0_3;LMS1<=MS1_3;LS0<=S0_3;LS1<=S1_3;LM0<=M0_3;LM1<=M1_3;
ELSIF(COUNTB=9)THEN
LMS0<=MS0_4;LMS1<=MS1_4;LS0<=S0_4;LS1<=S1_4;LM0<=M0_4;LM1<=M1_4;
ELSIF(COUNTB=10)THEN
LMS0<=MS0_5;LMS1<=MS1_5;LS0<=S0_5;LS1<=S1_5;LM0<=M0_5;LM1<=M1_5;
END IF;
END IF;
END PROCESS P10;
P11:PROCESS(DISPLAY)
BEGIN
IF DISPLAY'EVENT AND DISPLAY ='0' THEN
IF COUNTB=11 THEN
COUNTB<=1;
ELSE COUNTB<=COUNTB+1;
END IF;
END IF;
END PROCESS P11;
P12: PROCESS(DISPCNT)
begin
if(COUNTB=6 OR COUNTB=7 OR COUNTB=8 OR COUNTB=9 OR COUNTB=10 )then
case DISPCNT is
when "101"=>ROW<="101";NUM<=LMS0;
when "100"=>ROW<="100";NUM<=LMS1;
when "011"=>ROW<="011";NUM<=LS0;
when "010"=>ROW<="010";NUM<=LS1;
when "001"=>ROW<="001";NUM<=LM0;
when "000"=>ROW<="000";NUM<=LM1;
when others=>null;
end case;
else
case DISPCNT is
when "101"=> ROW<="101";NUM<=MS0;
when "100"=> ROW<="100";NUM<=MS1;
when "011"=> ROW<="011";NUM<=S0;
when "010"=> ROW<="010";NUM<=S1;
when "001"=> ROW<="001";NUM<=M0;
when "000"=> ROW<="000";NUM<=M1;
when others=>null;
end case;
end if;
END PROCESS P12;
WITH NUM SELECT
LED<="0000110" WHEN "0001",
"1011011" WHEN "0010",
"1001111" WHEN "0011",
"1100110" WHEN "0100",
"1101101" WHEN "0101",
"1111101" WHEN "0110",
"0000111" WHEN "0111",
"1111111" WHEN "1000",
"1101111" WHEN "1001",
"0111111" WHEN OTHERS;
END BEHAVEIORAL;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -