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中用<=