HDLBits CircuitsCombinational

LogicBasic Gates

module top_module (
    input in1,
    input in2,
    input in3,
    output out);
    wire temp1;
    assign temp1=~(in1^in2);
    assign out=temp1^in3;

endmodule

module top_module ( 
    input p1a, p1b, p1c, p1d,
    output p1y,
    input p2a, p2b, p2c, p2d,
    output p2y );
    
    assign p1y=~(p1a&p1b&p1c&p1d);
    assign p2y=~(p2a&p2b&p2c&p2d);

endmodule

在前面的练习中,我们使用了简单的逻辑门和几个逻辑门的组合。这些电路都是组合电路的例子。组合电路意味着电路的输出是其输入的函数(数学意义上)。这意味着对于任何给定的输入值,都只有一个可能的输出值。因此,描述组合函数行为的一种方法是明确列出每种可能的输入值的输出。这就是真值表。

对于 N 个输入的布尔函数,有 2N 种可能的输入组合。真值表的每一行都列出一种输入组合,因此总有 2N 行。输出列显示了每个输入值的输出结果。

真值表和布尔表达式转换:

module top_module( 
    input x3,
    input x2,
    input x1,  // three inputs
    output f   // one output
);
    assign f=((~x3)&(x2))|(x3&x1);

endmodule

module top_module ( input [1:0] A, input [1:0] B, output z ); 
    
    assign z=(A==B)?1'b1:1'b0;

endmodule

module top_module (input x, input y, output z);
    
    assign z=(x^y)&x;

endmodule

module top_module ( input x, input y, output z );
    
    assign z=~(x^y);

endmodule

module top_module (input x, input y, output z);
    
    wire a,b;
    
    assign a=(x^y)&x;
    assign b=~(x^y);
    assign z=(a|b)^(a&b);
    
endmodule

文章提示根据结果反推,那么输出ringer的时候是v_m等于0,输出motor的时候是输入v_m为1且ring有输入(为1)

module top_module (
    input ring,
    input vibrate_mode,
    output ringer,       // Make sound
    output motor         // Vibrate
);
    assign ringer = (vibrate_mode==1'b1)? 1'b0:ring;
    assign motor = ((vibrate_mode==1'b1)&(ring==1))? vibrate_mode:1'b0;

endmodule

module top_module (
    input too_cold,
    input too_hot,
    input mode,
    input fan_on,
    output heater,
    output aircon,
    output fan
); 
    assign heater = ((mode==1'b1)&(too_cold==1'b1))? 1'b1:1'b0;  
    assign aircon = ((mode==1'b0)&(too_hot==1'b1))? 1'b1:1'b0;
    assign fan = ((((too_cold==1'b1)&(mode==1))|((too_hot==1'b1)&(mode==0)))|(fan_on==1))? 1'b1:1'b0;


endmodule

module top_module( 
    input [2:0] in,
    output [1:0] out );
    
    assign out=in[2]+in[1]+in[0];


endmodule

module top_module( 
    input [3:0] in,
    output [2:0] out_both,
    output [3:1] out_any,
    output [3:0] out_different );
    
    assign out_both[2:0]={in[2]&in[3],in[1]&in[2],in[0]&in[1]};
    assign out_any[3:1]={in[3]|in[2],in[2]|in[1],in[1]|in[0]};
    assign out_different[3:0]={in[0]^in[3],in[3]^in[2],in[2]^in[1],in[1]^in[0]};
    

endmodule

module top_module( 
    input [99:0] in,
    output [98:0] out_both,
    output [99:1] out_any,
    output [99:0] out_different );
    
    always@(*)begin
        integer sel;
        for(sel=98;sel>=0;sel=sel-1)begin
            out_both[sel]<=in[sel]&in[sel+1];
        end
        for(sel=99;sel>=1;sel=sel-1)begin
            out_any[sel]<=in[sel]|in[sel-1]; 
        end
        for(sel=98;sel>=0;sel=sel-1)begin
            out_different[sel]<=in[sel]^in[sel+1];
        end
        out_different[99]<=in[0]^in[99];
    end  

endmodule

这里涉及到使用<=和=

引用自:

Verilog中<=和=的区别

一般情况下使用<=,组合逻辑使用=赋值,时序逻辑使用<=赋值:

举个例子:初始化m=1,n=2,p=3;分别执行以下语句

1、begin

m=n;n=p;p=m;

end

2、begin

m<=n; n<=p; p<=m;

end

结果分别是:1、m=2,n=3,p=2;(在给p赋值时m=2已经生效)

2、m=2,n=3,p=1;(在begin-end过程中,m=2一直无效而是在整体执行完后才生效)

这两种赋值“=”用于阻塞式赋值;“<=”用于非阻塞式赋值中。

阻塞赋值:阻塞赋值语句是在这句之后所有语句执行之前执行的,即后边的语句必须在这句执行完毕才能执行,所以称为阻塞,实际上就是顺序执行。

非阻塞赋值:非阻塞赋值就是与后边相关语句同时执行,即就是并行执行。

所以一般时序电路使用非阻塞赋值,assign语句一般使用=阻塞赋值;

组合逻辑电路使用阻塞赋值;

PS:仿真是initial中用=,always中用<=

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值