HNUST - 复印机逻辑控制电路设计

一、实验题目

题目十九:复印机逻辑控制电路设计★
1)用按键输入复印的次数,用三个数码管显示,最大555,初始为0;(使用六个按键表示0-5数字键);
2)用另外按键开关作为启动复印的“开始”开关,开始后连续复印,每复印一次,数字减1,直到0,停机,回复初始状态;
3)如果发生缺纸,用另外一个拨码开关给出缺纸信号,则立即停止复印,提示缺纸(用LED灯指示),复印暂停,加纸后,缺纸的拨码开关回复,则继续复印;
4)复印过程中可以取消复印,用最后一个按键开关给出取消复印信号,则立即回复到初始状态。

二、实验环境

EPF10K20TC144-3

Quartus II 9.0 (32-Bit)

三、实验目的

  1. 学习VHDL语言
  2. 学习模块化设计思想实现内容
  3. 学习利用开发板进行板载测试

四、总体设计

  • 设计思路:通过六个按键来接收用户输入的复印的数量,再利用剩下两个按键来接收重置信号和开始信号。最后利用一个拨码开关实现缺纸信号的输入。

  • 设计方案:通过VHDL语言实现题目所述功能,设计四个低层次元件,并通过一个高层次元件安装四个低层次元件到设计实体内部。

  • 低层次元件的功能介绍:

    1. 分频器(driver):接收一个开发板的时钟信号(1000hz),输出一个500hz的时钟信号,再输出一个4hz的时钟信号
    2. 输入模块(input):对按键进行防抖处理,输出防抖后的结果 —— 一个整型信号代表用户输入的复印数量,两个逻辑位分别代表开始和重置状态
    3. 递减模块(degression):获取input模块的输出与拨码开关的缺纸信号,通过时钟信号实现递减功能,最后输出递减后的结果与给缺纸信号灯的缺纸信号
    4. 输出模块(output):将从degression获取的数字通过数码管输出

五、详细设计

① - 分频器(driver)
entity driver is
    generic(freq: integer:=1000);  
    port(
        clk_1000hz:in std_logic;        -- 板载信号:1000hz
        clk_4hz:out std_logic;          -- 输出信号:4hz
        clk_500hz:out std_logic         -- 输出信号:500hz
    );
end entity driver;

通过接收系统的clk信号,利用计数信号计数,当计数达到某一个定值时,清零计数信号并输出对应的clk信号,从而达到分频的效果

② - 输入模块(input)
entity input is
    port(
        clk_500hz:in std_logic;                       -- 时钟信号
        num_btn:in std_logic_vector(5 downto 0);         -- 数字按键信号
        start_btn:in std_logic;                         -- 开始按键信号
        init_btn:in std_logic;                          -- 置0按键信号
        start_signal:out std_logic;                      -- 开始信号
        init_signal:out std_logic;                       -- 置0信号
        number:out integer range 0 to 555:=0             -- 数字按键读取的输入
    );
end entity input;

防抖处理:因为输入的信号会因为物理原因产生毛刺,所以需要过滤信号 —— 当且仅当按键按压信号(低电平)持续时间达到20ms时,看作一次按压处理,输出对应信号

输入到input模块的按键信号,经过防抖处理,将数字信号以integer的方式输出,将置0信号和开始信号以std_logic的方式输出。通过时钟信号启用进程,每当收到一个按压的脉冲信号,将其经过防抖处理后,将输出信号实时更新,这里需要注意的点是,收到置0信号的同时将开始信号设置为低电平,即置0;同理,收到开始信号的同时,将置0信号改为低电平,而数字按键信号的输入直接实时更新输出的数字信号,使按键时的数据实时显示

③ - 递减模块(degression)
entity degression is
    port(
        number:in integer range 0 to 555:=0;                  -- 递减的数据
        lack:in std_logic;                                  -- 缺纸信号
        clk_4hz:in std_logic;                               -- 递减时钟信号
        start_signal:in std_logic;                            -- 开始信号
        init_signal:in std_logic;                             -- 置0信号
        print_signal:out integer range 0 to 555:=0;              -- 输出信号
        print_position:out std_logic;						    -- 输出位置信号
        lack_light:out std_logic                             -- 缺纸亮灯的信号
    );
end entity degression;

使用进程同时监听多个信号

  1. 当读取到时钟信号的时候,递减复印的剩余次数
  2. 当读取到缺纸信号的时候,暂停递减,并亮起缺纸信号灯
  3. 当读取到开始信号的时候,因为输入模块的信号是恒定的高电平,而不是一个脉冲,所以需要使用一个辅助变量来记录是否已经开始,若已经开始,则不做处理;若尚未开始,则将接收到的数据来更新数据
  4. 当读取到重置信号的时候,因为开始信号的缺闲,所以重置信号需要改变记录是否开始的信号的值,从而导致之后在开始信号重新置为1时,才可以更新数据的值,即除第一次赋值之外,重新赋值需要在重置处理之后

在所有信号处理完毕后,通过判断开始信号的变量判断是否已经开始递减,若已经递减,则传输递减的数据与为1的位置信号;若没有开始递减,则将input模块的输入通过数码管实时显示出来,位置信号置0

④ - 输出信号(output)
entity output is
    port(
        input_signal:in integer range 0 to 555:=0;
        input_position:in std_logic;
        clk_500hz:in std_logic;
        pos:out std_logic_vector(7 downto 0);
        num:out std_logic_vector(7 downto 0)
    );
end entity output;

通过扫描模块控制刷新的位置,通过刷新模块刷新对应数码管显示的数字,通过位置信息搭配扫描模块可以控制数码管显示位置的信息,通过编码函数实现编码转换


顶层文件设计
architecture work of printer is
signal t1,t2,s1,s2,s3: std_logic;  -- t:时间信号 -- s:控制信号
signal n1,n2: integer range 0 to 555;  -- n:数字信号
begin
    dri: driver port map(clk_1000hz=>clk, clk_500hz=>t1, clk_4hz=>t2);
    ipt: input port map(clk_500hz=>t1,num_btn=>amount,start_btn=>start,
                        start_signal=>s1,init_signal=>s2,init_btn=>initial,number=>n1);
    deg: degression port map(number=>n1,lack=>lack_signal,clk_4hz=>t2,
							start_signal=>s1,init_signal=>s2,print_position=>s3,
							print_signal=>n2,lack_light=>light_signal);
							opt: output port map(input_signal=>n2,input_position=>s3,
							clk_500hz=>t1,pos=>position,num=>number);
end architecture work;

六、实验结果分析

  • 针脚连接如下:

在这里插入图片描述

  • 编译图:

EDA编译图

  • 3
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值