一、实验题目
题目十九:复印机逻辑控制电路设计★
1)用按键输入复印的次数,用三个数码管显示,最大555,初始为0;(使用六个按键表示0-5数字键);
2)用另外按键开关作为启动复印的“开始”开关,开始后连续复印,每复印一次,数字减1,直到0,停机,回复初始状态;
3)如果发生缺纸,用另外一个拨码开关给出缺纸信号,则立即停止复印,提示缺纸(用LED灯指示),复印暂停,加纸后,缺纸的拨码开关回复,则继续复印;
4)复印过程中可以取消复印,用最后一个按键开关给出取消复印信号,则立即回复到初始状态。
二、实验环境
EPF10K20TC144-3
Quartus II 9.0 (32-Bit)
三、实验目的
- 学习VHDL语言
- 学习模块化设计思想实现内容
- 学习利用开发板进行板载测试
四、总体设计
五、详细设计
① - 分频器(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时,才可以更新数据的值,即除第一次赋值之外,重新赋值需要在重置处理之后
在所有信号处理完毕后,通过判断开始信号的变量判断是否已经开始递减,若已经递减,则传输递减的数据与为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;
六、实验结果分析
|