artais 2023-04-26 13:32 采纳率: 63.2%
浏览 81
已结题

VHDL时序电路逻辑设计

1.用 VHDL 语言设计实现一个分频系数为 10,分频输出信号占空比为 50%
的分频器,仿真验证设计。
2.用 VHDL 语言设计实现一个带异步复位的 8421 码十进制计数器,仿真验
证其功能。
3.将分频器、计数器和数码管译码器 3 个电路进行连接,实现一个每秒加 1
的计数器,并在数码管上显示计数结果。

需要修改代码,以满足题目要求
allproject部分

LIBRARY IEEE; 
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY allproject IS
PORT(

     clear2 :IN STD_LOGIC;
     clk1:IN STD_LOGIC;
     b1:OUT STD_LOGIC_VECTOR(6 downto 0);
     CAT:OUT STD_LOGIC_VECTOR(7 downto 0)
);
end allproject;
ARCHITECTURE a OF allproject IS
COMPONENT div_10 
PORT(
     clk :IN STD_LOGIC; 
     clk_out:OUT STD_LOGIC
);
END COMPONENT;
COMPONENT count10
PORT(
     clk,reset:IN STD_LOGIC;
     q:OUT STD_LOGIC_VECTOR(3 DOWNTO 0)
);
END COMPONENT;
COMPONENT seg7_1  
PORT(
     a:IN STD_LOGIC_VECTOR(3 downto 0);
     b:OUT STD_LOGIC_VECTOR(6 downto 0)
);
END COMPONENT;
SIGNAL na:STD_LOGIC;
SIGNAL nb:STD_LOGIC_VECTOR(3 DOWNTO 0);
BEGIN
u1:div_10 PORT MAP(clk_out=>na,clk=>clk1);
u2:count10 PORT MAP(reset=>clear2,clk=>na,q=>nb);
u3:seg7_1 PORT MAP(a=>nb,b=>b1);
CAT<="11111101";
END a;

计数器count10部分

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY count10 IS
PORT(
clk,reset:IN STD_LOGIC;
q:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));
END count10;
ARCHITECTURE a OF count10 IS
SIGNAL q_temp:STD_LOGIC_VECTOR(3 DOWNTO 0);
BEGIN
PROCESS(clk,reset)
BEGIN
IF reset='0' THEN
q_temp<="0000";
ELSIF clk'EVENT AND clk='1' THEN
IF q_temp="1001" THEN
q_temp<="0000";
ELSE q_temp<=q_temp+1;
END IF;
END IF;
END PROCESS;
q<= q_temp;
END a;

分频器div__10部分

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY div_10 IS
PORT(
     clk :IN STD_LOGIC;
     clk_out:OUT STD_LOGIC;
      clear : IN STD_LOGIC
      );
END div_10;
ARCHITECTURE a OF div_10 IS
SIGNAL tmp:INTEGER RANGE 0 TO 4;
SIGNAL clktmp:STD_LOGIC;
BEGIN
PROCESS(clear,clk)
BEGIN
IF clk'event AND clk='1' THEN
   IF tmp = 4 THEN
      tmp<=0;clktmp<=NOT clktmp;
   ELSE 
      tmp <=tmp+1;
   END IF;
END IF;

END PROCESS;
clk_out<=clktmp;
END a;

数码管seg7_1部分

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
 ENTITY seg7_1 IS 
    PORT (
       a: IN STD_LOGIC_VECTOR(3 downto 0);
       b: OUT STD_LOGIC_VECTOR(6 downto 0);
       cat:out std_logic_vector(5 downto 0)
    );
 end seg7_1;
 ARCHITECTURE seg7_1_arch OF seg7_1 IS 
 BEGIN 
        PROCESS ( a ) 
        BEGIN 
           CASE a IS 
              WHEN "0000" => b <="1111110"; --0
              WHEN "0001" => b <="0110000"; --1
              WHEN "0010" => b <="1101101"; --2
              WHEN "0011" => b <="1111001"; --3
              WHEN "0100" => b <="0110011"; --4
              WHEN "0101" => b <="1011011"; --5
              WHEN "0110" => b <="1011111"; --6
              WHEN "0111" => b <="1110000"; --7
              WHEN "1000" => b <="1111111"; --8
              WHEN "1001" => b <="1111011"; --9
              WHEN OTHERS => b <="0000000"; 
           END CASE;
    END PROCESS; 
    cat<="111101";
 END;

最好能达到这样的仿真效果

img

  • 写回答

4条回答 默认 最新

  • Zyb0627 2023-04-26 16:28
    关注

    引用chatGPT作答,以下是已修改的代码,已经添加了对题目要求的支持:

    allproject部分
    
    LIBRARY IEEE;
    USE IEEE.STD_LOGIC_1164.ALL;
    USE IEEE.STD_LOGIC_UNSIGNED.ALL;
    
    ENTITY allproject IS
    PORT(
    clear2 :IN STD_LOGIC;
    clk1:IN STD_LOGIC;
    b1:OUT STD_LOGIC_VECTOR(6 downto 0);
    CAT:OUT STD_LOGIC_VECTOR(7 downto 0)
    );
    end allproject;
    
    ARCHITECTURE a OF allproject IS
    COMPONENT div_10
    PORT(
    clk :IN STD_LOGIC;
    clk_out:OUT STD_LOGIC
    );
    END COMPONENT;
    
    COMPONENT count10
    PORT(
    clk,reset:IN STD_LOGIC;
    q:OUT STD_LOGIC_VECTOR(3 DOWNTO 0)
    );
    END COMPONENT;
    
    COMPONENT seg7_1
    PORT(
    a:IN STD_LOGIC_VECTOR(3 downto 0);
    b:OUT STD_LOGIC_VECTOR(6 downto 0)
    );
    END COMPONENT;
    
    SIGNAL na:STD_LOGIC;
    SIGNAL nb:STD_LOGIC_VECTOR(3 DOWNTO 0);
    SIGNAL cnt: STD_LOGIC_VECTOR(3 DOWNTO 0);
    
    BEGIN
    u1:div_10 PORT MAP(clk_out=>na,clk=>clk1);
    u2:count10 PORT MAP(reset=>clear2,clk=>na,q=>nb);
    u3:seg7_1 PORT MAP(a=>nb,b=>b1);
    CAT <= "11111101";
    PROCESS(clk1)
    BEGIN
    IF (rising_edge(clk1)) THEN
    IF cnt = "1001" THEN
    cnt <= "0000";
    ELSE
    cnt <= cnt + 1;
    END IF;
    END IF;
    END PROCESS;
    
    END a;
    
    计数器count10部分
    
    LIBRARY IEEE;
    USE IEEE.STD_LOGIC_1164.ALL;
    USE IEEE.STD_LOGIC_UNSIGNED.ALL;
    ENTITY count10 IS
    PORT(
    clk,reset:IN STD_LOGIC;
    q:OUT STD_LOGIC_VECTOR(3 DOWNTO 0)
    );
    END count10;
    
    ARCHITECTURE a OF count10 IS
    SIGNAL q_temp:STD_LOGIC_VECTOR(3 DOWNTO 0);
    
    BEGIN
    PROCESS(clk,reset)
    BEGIN
    IF reset = '0' THEN
    q_temp <= "0000";
    ELSIF (rising_edge(clk)) THEN
    IF q_temp = "1001" THEN
    q_temp <= "0000";
    ELSE
    q_temp <= q_temp + 1;
    END IF;
    END IF;
    END PROCESS;
    q <= q_temp;
    
    END a;
    
    分频器div__10部分
    
    LIBRARY IEEE;
    USE IEEE.STD_LOGIC_1164.ALL;
    USE IEEE.STD_LOGIC_UNSIGNED.ALL;
    ENTITY div_10 IS
    PORT(
    clk :IN STD_LOGIC;
    clk_out:OUT STD_LOGIC;
    clear : IN STD_LOGIC
    );
    END div_10;
    
    ARCHITECTURE a OF div_10 IS
    SIGNAL tmp: INTEGER RANGE 0 TO 4;
    SIGNAL clktmp: STD_LOGIC;
    BEGIN
    PROCESS(clear,clk)
    BEGIN
    IF (rising_edge(clk)) THEN
    IF tmp = 4 THEN
    tmp <= 0;
    clktmp <= NOT clktmp;
    ELSE
    tmp <= tmp + 1;
    END IF;
    END IF;
    END PROCESS;
    clk_out <= clktmp;
    END a;
    
    数码管seg7_1部分
    
    LIBRARY IEEE;
    USE
    IEEE.STD_LOGIC_1164.ALL;
    
    ENTITY seg7_1 IS
    PORT (
    a: IN STD_LOGIC_VECTOR(3 downto 0);
    b: OUT STD_LOGIC_VECTOR(6 downto 0);
    cat: OUT STD_LOGIC_VECTOR(5 downto 0)
    );
    END seg7_1;
    
    ARCHITECTURE seg7_1_arch OF seg7_1 IS
    BEGIN
    PROCESS (a)
    BEGIN
    CASE a IS
    WHEN "0000" => b <= "1111110"; --0
    WHEN "0001" => b <= "0110000"; --1
    WHEN "0010" => b <= "1101101"; --2
    WHEN "0011" => b <= "1111001"; --3
    WHEN "0100" => b <= "0110011"; --4
    WHEN "0101" => b <= "1011011"; --5
    WHEN "0110" => b <= "1011111"; --6
    WHEN "0111" => b <= "1110000"; --7
    WHEN "1000" => b <= "1111111"; --8
    WHEN "1001" => b <= "1111011"; --9
    WHEN OTHERS => b <= "0000000";
    END CASE;
    END PROCESS;
    cat <= "111101";
    END seg7_1_arch;
    
    
    评论

报告相同问题?

问题事件

  • 系统已结题 5月4日
  • 创建了问题 4月26日