1 Simple Wire
Create a module with one input and one output that behaves like a wire.
注:、
1 Verilog 中的线(和其他信号)是有方向的。
2 在 Verilog 的“连续赋值”( assign left_side = right_side;) 中,右侧的信号值被驱动到左侧的导线上。赋值是“连续的”,因为即使右侧的值发生变化,赋值也会一直继续。连续分配不是一次性事件。
模块和端口声明创建了电路的黑色部分。通过添加一条assign语句来连接in到out.
作业:创建一个具有一个输入和一个输出的模块,其中输入=输出
module top_module( input in, output out );
assign out = in;
endmodule
2 Four Wires
Create a module with 3 inputs and 4 outputs that behaves like wires that makes these connections:
a -> w
b -> x
b -> y
c -> z
注:
1 当您有多个赋值语句时,它们在代码中出现的顺序无关紧要。不同于编程语言,分配语句(“连续分配”)描述了连接东西之间,而不是动作复制从一件事到另一个值。
2 assign语句不是在创建连线,而是在已存在的线之间创建连接
3 模块的输入输出端口也同样是 wire
4 input a 实际等于 input wire a
图中的绿线代表的是 wire 之间的连接,而不是 wire 本身。即 wire 是连线两端的信号,而不是连线本身。
作业:完成上图设计
module top_module(
input a,b,c,
output w,x,y,z );
assign w = a;
assign x = b;
assign y = b;
assign z = c;
endmodule
或
module top_module(
input a,b,c,
output w,x,y,z );
assign w = a,x = b,y = b,z = c;
endmodule
3 NOT GATE
非门模块中 in 被连接到 out,相比 wire 模块,唯一的区别在于:输出信号 out 是将输入信号 in 取反得到。
我们在 assign 语句中增加的逻辑操作符为 ~(逐位取反),由于我们的信号位宽为 1 位,我们也可以使用!(逻辑取反)。二者的区别在于逻辑取反的结果时钟只有一位,而逐位取反结果的位宽和输入信号位宽相同,在每一个位上逐位(bitwise)取反。
作业:完成上述电路
module top_module( input in, output out );
assign out = ~in;
endmodule
4 AND GATE
题目给出的模块如下图,有三个 wire : a,b 以及 out。a,b 信号已经由模块的输入端口驱动,但图中黑色的部分中,wire out 还没有被任何信号驱动。本题要写一个 assign 语句,使 a,b 信号经过与门的输出驱动 wire out 信号。
注:
1 信号是被驱动(drive)的,被驱动的含义可以理解为,该信号的取值取决于另一个连接到它的信号的值,该信号的值随着另一个信号的值改变而改变。
2 一个 wire 信号不能被多个信号同时驱动(当一个信号说往东,另一个信号说往西,两个信号还要同时驱动我时,我到底该往哪?)。
3 另一个方面,一个没有驱动者(driver)的信号的值会处于未定义的状态,综合器一般会免费给他安排一个,将其信号值驱动为 0。
作业:完成上电路
module top_module(
input a,
input b,
output out );
assign out = a & b;
endmodule
注意: & 和 && 的区别,& 是逐位与,而 && 是逻辑与。
5 NOR GATE
本题要求使用 Verilog 实现一个或非门,或非门是或门的输出取反。
注:
assign 语句将某个值赋予 wire 信号,这个 value 可以是常量,也可以是一个复杂的逻辑表达式,综合器会综合出相应的逻辑门实现。assign 语句代表的始终是连续赋值,因为当输入信号改变时,输出信号会重新“计算”。和一个逻辑门的工作方式相同,输入改变,输出对应改变。
作业:完成上图电路
module top_module(
input a,
input b,
output out );
assign out = ~(a|b);
endmodule
6 XNOR GATE
同或门(英语:XNOR gate或equivalence gate)也称为异或非门,在异或门的输出端再加上一个非门就构成了异或非门,是数字逻辑电路的基本单元,有2个输入端、1个输出端。当2个输入端中有且只有一个是低电平(逻辑0)时,输出为低电平。亦即当输入电平相同时,输出为高电平(逻辑1)。
作业:完成上图电路
module top_module(
input a,
input b,
output out );
assign out = ~(a^b);
endmodule
8 Declaring wires
电路变得复杂的时候,我们需要一些中间信号来帮助我们简化描述电路的难度。
定义中间信号的语法格式为:
wire 信号名
注:
1 建议先定义信号,再使用信号.
2 原则上,你可以在任何位置定义你的信号,使用前使用后都可以,正如之前的课程中说的那样,语句的顺序对于 Verilog 来说没有关系。但有些仿真工具需要你在使用信号之前定义信号,
示例:
module top_module (
input in, // Declare an input wire named "in"
output out // Declare an output wire named "out"
);
wire not_in; // Declare a wire named "not_in"
assign out = ~not_in; // Assign a value to out (create a NOT gate).
assign not_in = ~in; // Assign a value to not_in (create another NOT gate).
endmodule // End of module "top_module"
作业:完成下图的电路
module top_module(
input a,
input b,
input c,
input d,
output out,
output out_n );
wire in_1, in_2;
assign in_1 = a & b;
assign in_2 = c & d;
assign out = in_1 | in_2, out_n = ~(in_1 | in_2);
endmodule
9 7458器件
作业:完成下图的设计
module top_module (
input p1a, p1b, p1c, p1d, p1e, p1f,
output p1y,
input p2a, p2b, p2c, p2d,
output p2y );
assign p2y = (p2a & p2b) | (p2c & p2d);
assign p1y = (p1a & p1b &p1c) | (p1d & p1e & p1f);
endmodule