⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stopwatch.txt

📁 1.高精度数字秒表(0.01秒的vhdl语言实现) 2.具有定时
💻 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 + -