跳到主要内容

13.响铃或振动?

假设你正在设计一个电路来控制手机的响铃器和振动马达。每当手机有来电需要响铃(输入ring)时,你的电路必须要么打开响铃器(输出ringer = 1),要么打开马达(输出motor = 1),但不能同时打开两者。如果手机处于振动模式(输入vibrate_mode = 1),则打开马达。否则,打开响铃器。

尝试仅使用assign语句来设计这个电路,看看你是否能将问题描述转化为一系列逻辑门的集合。

设计提示: 在设计电路时,人们常常需要“反向”思考问题,从输出开始,再逐步回溯到输入。这通常与人们解决(顺序的、命令式的)编程问题的方式相反,在编程问题中,人们通常先看输入,然后再决定采取什么行动(或输出什么)。对于顺序程序,人们常常这样思考:“如果(输入是___)则(输出应为___)”。另一方面,硬件设计师常常这样思考:“(输出应为___)当(输入是___)”。

上述问题描述采用了适合软件编程的命令式形式(如果ring则执行此操作),因此你必须将其转换为更适合硬件实现的更声明式的形式(assign ringer = ___)。能够在这两种思维方式之间思考并转换,是硬件设计所需的一项最重要的技能。

alt text

模块声明

module top_module (
input ring,
input vibrate_mode,
output ringer, // Make sound
output motor // Vibrate
);

做题区