网站链接:Hdibits.
定义一根有方向的导线。
module top_module( input in, output out );
assign out = in;
endmodule
创建一个具有 3 个输入和 4 个输出的模块,对应关系如下图。
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
创建一个实现 NOT 门的模块。
module top_module( input in, output out );
not(out, in);
endmodule
创建实现 AND 门的模块。
module top_module(
input a,
input b,
output out );
and (out ,a ,b);
endmodule
创建实现 NOR (或非) 门的模块。
module top_module(
input a,
input b,
output out );
nor (out ,a ,b);
endmodule
创建实现 XNOR (同或) 门的模块。
module top_module(
input a,
input b,
output out );
xnor (out,a ,b);
endmodule
实现以下电路。创建两根中间导线(命名为您想要的任何名称)以将 AND 和 OR 门连接在一起。请注意,馈送 NOT 栅极的导线实际上是导线,因此您不一定需要在此处声明第三根导线。请注意,导线只有一个源(门的输出),但可以有多个输入供电。
如果遵循图中的电路结构,则最终应得到四个赋值语句,因为有四个信号需要赋值。
`default_nettype none //禁用隐式网络
module top_module(
input a,
input b,
input c,
input d,
output out,
output out_n );
wire net_1 ,net_2;
assign net_1 = a & b;
assign net_2 = c & d;
assign out = net_1 | net_2;
assign out_n = ~out;
endmodule
创建具有与 7458 芯片相同功能的模块。它有 10 个输入和 2 个输出。您可以选择使用语句来驱动每根输出导线,也可以选择声明(四根)导线用作中间信号,其中每根内部导线由其中一个AND门的输出驱动。要进行额外的练习,请尝试两种方式。
module top_module (
input p1a, p1b, p1c, p1d, p1e, p1f,
output p1y,
input p2a, p2b, p2c, p2d,
output p2y );
wire left_1 ,left_2 ,right_1 , right_2;
assign left_1 = p2a & p2b;
assign left_2 = p2c & p2d;
assign p2y = left_1 | left_2;
assign right_1 = p1a & p1c & p1b;
assign right_2 = p1f & p1e & p1d;
assign p1y = right_1 | right_2;
endmodule
第二种方法:
module top_module (
input p1a, p1b, p1c, p1d, p1e, p1f,
output p1y,
input p2a, p2b, p2c, p2d,
output p2y );
wire left_1 ,left_2 ,right_1 , right_2;
and (left_1, p2a, p2b);
and (left_2, p2c, p2d);
or (p2y, left_1, left_2);
and (right_1, p1a, p1c, p1b);
and (right_2, p1f, p1e, p1d);
or (p1y, right_1, right_2);
endmodule
构建一个具有一个3位输入的电路,然后输出相同的矢量,并将其拆分为三个单独的1位输出。将输出连接到输入矢量的位置 0、位置 1 等。
在图中,旁边带有数字的刻度线表示矢量(或“总线”)的宽度,而不是为矢量中的每个位绘制单独的线。
module top_module (
input wire [2:0] vec,
output wire [2:0] outv,
output wire o2,
output wire o1,
output wire o0 ); // Module body starts after module declaration
assign outv = vec[2:0];
assign o2 = vec[2];
assign o1 = vec[1];
assign o0 = vec[0];
endmodule
构建一个组合电路,将输入半字(16 位,[15:0])拆分为下部 [7:0] 和上部 [15:8] 字节。
`default_nettype none // Disable implicit nets. Reduces some types of bugs.
module top_module(
input wire [15:0] in,
output wire [7:0] out_hi,
output wire [7:0] out_lo );
assign out_lo = in[7:0];
assign out_hi = in[15:8];
endmodule
32 位向量可以被视为包含 4 个字节(位 [31:24]、[23:16]等)。构建一个电路,该电路将反转 4 字节字的字节顺序。
AaaaaaaaBbbbbbbbCcccccccDddddddd => DdddddddCcccccccBbbbbbbbAaaaaaaa
当需要交换一段数据的字节序时,例如在小端 x86 系统和许多 Internet 协议中使用的大字节序格式之间,通常使用此操作。
`default_nettype none // Disable implicit nets. Reduces some types of bugs.
module top_module(
input wire [15:0] in,
output wire [7:0] out_hi,
output wire [7:0] out_lo );
assign out_lo = in[7:0];
assign out_hi = in[15:8];
endmodule
构建一个具有两个 3 位输入的电路,用于计算两个向量的按位 OR、两个向量的逻辑 OR 以及两个向量的反 (NOT)。将 的逆数放在 的上半部分(即位 [5:3]),将 的逆数放在下半部分。bout_nota
module top_module(
input [2:0] a,
input [2:0] b,
output [2:0] out_or_bitwise,
output out_or_logical,
output [5:0] out_not
);
assign out_or_bitwise[2:0] = a[2:0] | b[2:0];
assign out_or_logical = a || b; //向量计算如果只有一个输出,则用双重逻辑符
assign out_not[5:3] = ~b[2:0];
assign out_not[2:0] = ~a[2:0];
endmodule
构建一个具有两个 3 位输入的电路,用于计算两个向量的按位 OR、两个向量的逻辑 OR 以及两个向量的反 (NOT)。将 的逆数放在 的上半部分(即位 [5:3]),将 的逆数放在下半部分。bout_nota
module top_module(
input [2:0] a,
input [2:0] b,
output [2:0] out_or_bitwise,
output out_or_logical,
output [5:0] out_not
);
assign out_or_bitwise[2:0] = a[2:0] | b[2:0];
assign out_or_logical = a || b; //向量计算如果只有一个输出,则用双重逻辑符
assign out_not[5:3] = ~b[2:0];
assign out_not[2:0] = ~a[2:0];
endmodule
给定多个输入向量,将它们连接在一起,然后将它们拆分为多个输出向量。有六个 5 位输入向量:a、b、c、d、e 和 f,总共 30 位输入。有四个 8 位输出向量:w、x、y 和 z,用于 32 位输出。输出应该是输入向量的串联,后跟两个 1 位:
module top_module (
input [4:0] a, b, c, d, e, f,
output [7:0] w, x, y, z );
//二种方法
wire [31:0] sum;
assign sum[31:0]={a[4:0], b[4:0], c[4:0], d[4:0], e[4:0], f[4:0],2'b11};
assign {w[7:0], x[7:0], y[7:0], z[7:0]} = sum[31:0];
// assign {w[7:0], x[7:0], y[7:0], z[7:0]} = {a[4:0], b[4:0], c[4:0], d[4:0], e[4:0], f[4:0],2'b11};
endmodule
给定一个 8 位输入向量 [7:0],反转其位排序。
module top_module(
input [7:0] in,
output [7:0] out
);
//高位为最左边第一位
assign out = {in[0], in[1], in[2], in[3], in[4], in[5], in[6], in[7]};
endmodule
构建一个将 8 位数字符号扩展到 32 位的电路。这需要符号位的24个副本(即复制位[7]24次)的串联,后跟8位数字本身。
module top_module (
input [7:0] in,
output [31:0] out );//双层花括号可以让同样的向量成倍拼接
assign out = {{24{in[7]}},in};
endmodule
给定五个 1 位信号(a、b、c、d 和 e),计算 25 位输出向量中的所有 25 个成对一位比较。如果要比较的两位相等,则输出应为 1。
out[24] = ~a ^ a; // a == a, so out[24] is always 1.
out[23] = ~a ^ b;
out[22] = ~a ^ c;
…
out[ 1] = ~e ^ d;
out[ 0] = ~e ^ e;
module top_module (
input a, b, c, d, e,
output [24:0] out );//
assign out = ~ {{5{a}} ,{5{b}} ,{5{c}} ,{5{d}} ,{5{e}}} ^ {5{a,b,c,d,e}};
endmodule