1. 注意事项

  1. 代码中禁止使用 initial
  2. 代码中禁止使用 casex,casez
  3. 代码中禁止用 “#” 表示延迟。
  4. clock 只能出现在 always @(posedge clock)
  5. 触发器要么全部同步复位要么全部异步复位。
  6. 模块的输入必须是 wire 类型。
  7. 例化的输出必须是 wire 类型。

2. 模块声明与实例化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
module test #
(
parameter A_width=8,
parameter B_width=4,
parameter C_width=2
)
(
input wire [A_width-1:0] a,
input wire [B_width-1:0] b,
input wire [C_width-1:0] c,
output wire [3:0] y,
output reg [B_width-1:0] z
);
...
endmodule
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
wire [15:0] a;
wire [7:0] b;
wire [3:0] c;
wire [3:0] y;
wire [7:0] z;
test #(
.A_width=8 ( 16),
.B_width=4 ( 8),
.C_width=2 ( 4)
)
u_test(
.a ( a ),//I
.b ( b ),//I
.c ( c ),//I
.y ( y ),//O
.z ( z )//O
);

3. 简单器件的verilog描述

1. 3-8译码器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
module decoder_3_8(
input [2:0] in,
output [7:0] out
);

assign out[0] = (in == 3'd0);
assign out[1] = (in == 3'd1);
assign out[2] = (in == 3'd2);
assign out[3] = (in == 3'd3);
assign out[4] = (in == 3'd4);
assign out[5] = (in == 3'd5);
assign out[6] = (in == 3'd6);
assign out[7] = (in == 3'd7);

endmodule

2. 8-3编码器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
module encoder_8_3(
input [7:0] in,
output [2:0] out
);

assign out = ({3{in[0]}} & 3'd0)
| ({3{in[1]}} & 3'd1)
| ({3{in[2]}} & 3'd2)
| ({3{in[3]}} & 3'd3)
| ({3{in[4]}} & 3'd4)
| ({3{in[5]}} & 3'd5)
| ({3{in[6]}} & 3'd6)
| ({3{in[7]}} & 3'd7);

endmodule

3. 多路选择器

1
2
3
4
5
6
7
8
9
10
11
12
13
module mux5_8b(
input [7:0] in0, in1, in2, in3, in4,
input [2:0] sel,
output [7:0] out
);

assign out = ({8{sel==3'd0}} & in0)
| ({8{sel==3'd1}} & in1)
| ({8{sel==3'd2}} & in2)
| ({8{sel==3'd3}} & in3)
| ({8{sel==3'd4}} & in4);

endmodule

4. D触发器

1
2
3
4
5
6
7
8
9
10
11
12
//可带复位端与使能端
module dff (
input wire clk,
input wire d,
output reg q
);

always @(posedge clk) begin
q <= d;
end

endmodule