HDLBITS笔记16:组合电路A和B(combine circuits A and B)、响铃或震动、恒温器设计以及计算输入向量中1的个数

该博客介绍了如何将逻辑表达式转化为硬件电路设计,包括手机振铃与振动电机控制、加热/冷却恒温器控制及3位输入向量计数电路的实现。通过Verilog代码展示了如何使用与门、或门、非门等逻辑门来构建这些电路,并强调了在硬件设计中从输出反推输入的重要性。
摘要由CSDN通过智能技术生成

接下来的这三类题目均是关于应用类的设计,以生活中的产品为题,考察我们的硬件语言描述应用到产品的能力。

题目1:顶层设计由子电路 A 和 B 各两个实例化组成,如下所示:

分析:其中IA1和IA2的表示的逻辑表达式由前面的练习可知为:z = (x^y) & x;IB1和IB2所表示的逻辑表达式为:z = (!x & !y) | (x&y)。

代码如下:

module top_module (input x, input y, output z);
wire in1,in2,in3,in4;
    wire in5,in6;
    assign in1 = (x^y)&x;
    assign in2 = (!x & !y) | (x&y);
    assign in3 = (x^y)&x;
    assign in4 = (!x & !y) | (x&y);
    assign in5 = in1 | in2;
    assign in6 = in3 & in4;
    assign z = in5^in6;
endmodule

仿真结果如下:

题目2:假设您正在设计一个电路来控制手机的振铃器和振动电机。每当电话需要从来电 (input ring) 响铃时,您的线路必须打开铃声 (output ringer = 1) 或电机 (output motor = 1),但不能同时打开两者。如果手机处于振动模式 (input vibrate_mode = 1),请打开电机。否则,请打开铃声。

设计提示:在设计电路时,人们通常必须“向后”考虑问题,从输出开始,然后向后工作到输入。这通常与人们如何看待(顺序,命令式)编程问题相反,在编程问题上,人们会首先查看输入,然后决定操作(或输出)。对于顺序程序,人们经常会认为“如果(输入是___)那么(输出应该是___)”。另一方面,硬件设计人员经常认为“(输出应该是___)当(输入是___)”。

 上面的问题描述是以适合软件编程的命令式形式编写的(如果响铃然后这样做),因此您必须将其转换为适合硬件实现的更声明性的形式(assign ringer = ___)。能够在两种风格之间思考和转换是硬件设计所需的最重要的技能之一。

分析:通过上述题目可知:当电路响铃时,很明显是与非门;当电路震动时,很明显是与门。

代码如下:

module top_module (
    input ring,
    input vibrate_mode,
    output ringer,       // Make sound
    output motor         // Vibrate
);
    assign ringer = ring & !vibrate_mode; //响铃
    assign motor = ring & vibrate_mode;//震动
endmodule

题目3:加热/冷却恒温器控制加热器(冬季)和空调(夏季)。实施一个电路,该电路将根据需要打开和关闭加热器、空调和鼓风机风扇。

恒温器可以处于以下两种模式之一:加热 (mode = 1) 和冷却 (mode = 0)。在加热模式下,当加热器太冷时打开(too_cold = 1),但不要使用空调。在冷却模式下,当空调过热时打开(too_hot = 1),但不要打开加热器。当加热器或空调打开时,还要打开风扇以循环空气。此外,用户还可以要求风扇打开(fan_on = 1),即使加热器和空调关闭。​​​​​​​​​​​​​​

尝试仅使用assign语句,看看是否可以将问题描述转换为逻辑门的集合。

分析:加热器模式下(output=heater),三输入很明显是与非门;在空调模式下(output = aircon),三输入很明显也是与非门,只是非门的位置有所不同;在风扇模式下(output = fan),三输入很明显是先与非后或的关系。

代码如下:

module top_module (
    input too_cold,
    input too_hot,
    input mode,
    input fan_on,
    output heater,
    output aircon,
    output fan
); 
assign heater = mode&too_cold&!aircon;
    assign aircon = !mode&too_hot&!heater;
    assign fan = ((mode&too_cold) | (!mode&too_hot)) |fan_on;
endmodule

输出结果如下:

题目4:计算输入向量中“1”的数量。为 3 位输入向量构建总体计数电路。

代码如下(采用for循环)

module top_module( 
    input [2:0] in,
    output [1:0] out );
    integer i;
    always@(in)
    begin
        out = 2'b00;

        for(i=0;i<3;i=i+1)
            if(in[i] == 1)
            out = out+2'b01;
        else
            out = out;
    end
endmodule

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值