VHDL

一. 四位加法计数器

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity cnt4b is 
    port (
            clk  : in std_logic;
            rst  : in std_logic;
            ena  : in std_logic;
            outy : out std_logic_vector(3 downto 0);
            cout : out std_logic
          );
    end entity cnt4b;

architecture behav of cnt4b is
    signal cqi :std_logic_vector(3 downto 0);
begin 
    process(clk,rst,ena)
    begin
      if    rst ='1' then  cqi <="0000";
      elsif clk'event and clk ='1' then
        if  ena='1' then cqi <= cqi+1;
        end if;
      end if;
        outy <=cqi;
    end process;
    cout <=cqi(0) and cqi(1) and cqi(2) and cqi(3);
end architecture behav;

二. 七段译码器

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
 ENTITY DecL7s IS
   PORT(A:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
       LED7S:OUT STD_LOGIC_VECTOR(6 DOWNTO 0) );
END ENTITY DecL7s;
ARCHITECTURE one OF DecL7S IS
BEGIN
   PROCESS(A)
   BEGIN
       CASE A(3 DOWNTO 0) IS
        WHEN "0000" => LED7S <= "0111111";
        WHEN "0001" => LED7S <= "0000110";
        WHEN "0010" => LED7S <= "1011011";
        WHEN "0011" => LED7S <= "1001111";
        WHEN "0100" => LED7S <= "1100110";
        WHEN "0101" => LED7S <= "1101101";
        WHEN "0110" => LED7S <= "1111101";
        WHEN "0111" => LED7S <= "0000111";
        WHEN "1000" => LED7S <= "1111111";
        WHEN "1001" => LED7S <= "1101111";
        WHEN "1010" => LED7S <= "1110111";
        WHEN "1011" => LED7S <= "1111100";
        WHEN "1100" => LED7S <= "0111001";
        WHEN "1101" => LED7S <= "1011110";
        WHEN "1110" => LED7S <= "1111001";
        WHEN "1111" => LED7S <= "1110001";
        WHEN OTHERS => NULL;
       END CASE;
   END PROCESS;
END ARCHITECTURE one;

三. 寄存器

LIBRARY IEEE;   
USE IEEE.STD_LOGIC_1164.ALL; 
ENTITY REG4B IS 
    PORT (   
            LK   : IN STD_LOGIC; 
            DIN  : IN STD_LOGIC_VECTOR(3 DOWNTO 0); 
            DOUT : OUT STD_LOGIC_VECTOR(3 DOWNTO 0) 
         ); 
END REG4B; 

ARCHITECTURE behav OF REG4B IS 
BEGIN 
    PROCESS(LK, DIN) 
    BEGIN 
      IF LK'EVENT AND LK = '1' THEN  DOUT <= DIN; 
      END IF; 
    END PROCESS; 
END behav; 

四. 频率计测控器(分频器待改进)

LIBRARY IEEE;  
USE IEEE.STD_LOGIC_1164.ALL; 
USE IEEE.STD_LOGIC_UNSIGNED.ALL; 
ENTITY FTCTRL IS 
    PORT (
            CLKK : IN STD_LOGIC;                  
          CNT_EN : OUT STD_LOGIC;                 
         RST_CNT : OUT STD_LOGIC;               
            Load : OUT STD_LOGIC   
          );              
END FTCTRL; 

ARCHITECTURE behav OF FTCTRL IS 
    SIGNAL Div2CLK : STD_LOGIC; 
BEGIN 
    PROCESS( CLKK ) 
    BEGIN 
      IF CLKK'EVENT AND CLKK = '1' THEN      
        Div2CLK <= NOT Div2CLK; 
      END IF; 
    END PROCESS; 

    PROCESS (CLKK, Div2CLK) 
    BEGIN 
      IF CLKK='0' AND Div2CLK='0' THEN RST_CNT<='1';
      ELSE RST_CNT <= '0';  END IF; 
    END PROCESS; 
    Load  <= NOT Div2CLK;    CNT_EN <= Div2CLK; 
END behav; 

五. 状态机

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; 
ENTITY SCHK IS
  PORT(DIN,CLK,CLR : IN STD_LOGIC;
       AB : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));
END SCHK;
ARCHITECTURE BEHAV OF SCHK IS 
  SIGNAL Q : INTEGER RANGE 0 TO 8;
  SIGNAL D : STD_LOGIC_VECTOR(7 DOWNTO 0); 
BEGIN
  D<="11110000"; 
  PROCESS(CLK,CLR) 
  BEGIN
IF CLR = '1' THEN Q<=0;
ELSIF CLK'EVENT AND CLK='1' THEN 
  CASE Q IS
  WHEN 0=> IF DIN=D(7) THEN Q<=1; ELSE Q<=0; END IF; 
  WHEN 1=> IF DIN=D(6) THEN Q<=2; ELSE Q<=0; END IF; 
  WHEN 2=> IF DIN=D(5) THEN Q<=3; ELSE Q<=0; END IF; 
  WHEN 3=> IF DIN=D(4) THEN Q<=4; ELSE Q<=0; END IF; 
  WHEN 4=> IF DIN=D(3) THEN Q<=5; ELSE Q<=0; END IF; 
  WHEN 5=> IF DIN=D(2) THEN Q<=6; ELSE Q<=0; END IF; 
  WHEN 6=> IF DIN=D(1) THEN Q<=7; ELSE Q<=0; END IF; 
  WHEN 7=> IF DIN=D(0) THEN Q<=8; ELSE Q<=0; END IF; 
  END CASE; 
END IF;
END PROCESS; 
PROCESS(Q) 
BEGIN
  IF Q=8 THEN AB<="1111"; 
  ELSE AB<="0101";
  END IF; 
END PROCESS;
END BEHAV;

状态机序列检测器(改进版)

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; 
ENTITY aaa IS
    PORT(
       CLK,CLR : IN STD_LOGIC;
           DIN : IN STD_LOGIC_VECTOR(7 DOWNTO 0);
            AB : OUT STD_LOGIC_VECTOR(3 DOWNTO 0)
        );
END aaa;

ARCHITECTURE BEHAV OF aaa IS 
    SIGNAL Q : INTEGER RANGE 0 TO 8;
    SIGNAL D : STD_LOGIC_VECTOR(7 DOWNTO 0); 
BEGIN
    D<="10110001"; 
    PROCESS(CLK,CLR) 
    BEGIN
      IF CLR = '1' THEN Q<=0;
      ELSIF CLK'EVENT AND CLK='1' THEN 
        IF    DIN(7)=D(7) AND DIN(6)=D(6) 
          AND DIN(5)=D(5) AND DIN(4)=D(4) 
          AND DIN(3)=D(3) AND DIN(2)=D(2) 
          AND DIN(1)=D(1) AND DIN(0)=D(0) THEN Q<=8; ELSE Q<=0; END IF;
      END IF;
    END PROCESS; 

    PROCESS(Q) 
      BEGIN
        CASE Q IS
          WHEN      8 => AB<="1111"; 
          WHEN OTHERS => AB<="0000";
       END CASE;
END PROCESS;
END BEHAV;

六. 数据选择器

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; 
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY MUX IS
    PORT(
            CLK,S0,S1 : IN STD_LOGIC;
                A,B,C : IN STD_LOGIC_VECTOR (7 DOWNTO 0);
                    Y : OUT STD_LOGIC_VECTOR (7 DOWNTO 0)
        );
END MUX;

ARCHITECTURE BEHAV OF MUX IS 
    SIGNAL S : STD_LOGIC_VECTOR(1 DOWNTO 0);
BEGIN
    S <= S1&S0;
    PROCESS(S)
    BEGIN
      IF CLK'EVENT AND CLK = '1' THEN
        CASE S IS 
          WHEN "00" => Y <= A;
          WHEN "01" => Y <= B;
          WHEN "10" => Y <= C;
        --WHEN "11" => Y <= D;
          WHEN OTHERS => NULL;
        END CASE;
      END IF;
    END PROCESS;
END BEHAV;

七. 各种波形
正弦波

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY SINGT IS
    PORT(
            CLK  : IN STD_LOGIC;         
            DOUT : OUT STD_LOGIC_VECTOR (7 DOWNTO 0)
        );
END ENTITY;

ARCHITECTURE DACC OF SINGT IS
COMPONENT SIN_ROM    
    PORT(
            address : IN STD_LOGIC_VECTOR (5 DOWNTO 0);
              clock : IN STD_LOGIC ;
                  q : OUT STD_LOGIC_VECTOR (7 DOWNTO 0)
        );
END COMPONENT;

    SIGNAL Q1 : STD_LOGIC_VECTOR (5 DOWNTO 0); 
    BEGIN
    PROCESS(CLK)                           
      BEGIN
        IF CLK'EVENT AND CLK = '1' THEN  Q1 <= Q1+1;
        END IF;
    END PROCESS;

U1 : SIN_ROM PORT MAP(address => Q1, q => DOUT,clock => CLK);

END DACC; 

方波(算法有待改进)

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY SQUARE IS
    --GENERIC (D : INTEGER := 4);
    PORT(
            CLK : IN STD_LOGIC;
            DIN : IN STD_LOGIC_VECTOR(1 DOWNTO 0);
            CIN : IN STD_LOGIC_VECTOR(1 DOWNTO 0);
              Q : OUT INTEGER RANGE 0 TO 250
        );
END SQUARE;

ARCHITECTURE BEHAV OF SQUARE IS
    SIGNAL     D : INTEGER;
    SIGNAL COUNT : INTEGER;

BEGIN
  PROCESS(DIN,CLK)
  BEGIN
    IF CLK'EVENT AND CLK = '1' THEN
      CASE(DIN) IS
        WHEN "00" =>  D <= 2;
        WHEN "01" =>  D <= 3;
        WHEN "10" =>  D <= 4;
        WHEN "11" =>  D <= 5;
      END CASE;
    END IF;
  END PROCESS;

  PROCESS(DIN,CLK)
  BEGIN
    IF CLK'EVENT AND CLK = '1' THEN
      CASE(CIN) IS
        WHEN "00" =>  COUNT <= 3;
        WHEN "01" =>  COUNT <= 2;
        WHEN "10" =>  COUNT <= 1;
        WHEN "11" =>  COUNT <= 0;
      END CASE;
    END IF;
  END PROCESS;

  PROCESS(CLK,D,COUNT)
    VARIABLE COUNT : INTEGER := 0;
    BEGIN
      IF CLK'EVENT AND CLK = '1' THEN
        IF COUNT >= D-1 THEN
          COUNT := 0;
          Q <= 0;
        ELSE
          COUNT := COUNT+1;
          Q <= 250;
        END IF;
      END IF;
    END PROCESS;
END BEHAV;

锯齿波

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY JUCHI IS
    PORT(
            CLK  : IN STD_LOGIC;         
            DOUT : OUT STD_LOGIC_VECTOR (7 DOWNTO 0)
        );
END ENTITY;

ARCHITECTURE DAC OF JUCHI IS
COMPONENT JUCHI_ROM    
    PORT(
            address : IN STD_LOGIC_VECTOR (5 DOWNTO 0);
              clock : IN STD_LOGIC ;
                  q : OUT STD_LOGIC_VECTOR (7 DOWNTO 0)
        );
END COMPONENT;

    SIGNAL Q1 : STD_LOGIC_VECTOR (5 DOWNTO 0); 
    BEGIN
    PROCESS(CLK)                           
      BEGIN
        IF CLK'EVENT AND CLK = '1' THEN  Q1 <= Q1+1;
        END IF;
    END PROCESS;

J1 : JUCHI_ROM PORT MAP(address => Q1, q => DOUT,clock => CLK);

END DAC; 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值