个人思路:
主要考察模块例化、以及识别模块框图的能力。
根据图片信息例化三个my_dff模块就行,中间的两根连线可以采用寄存器,或者用wire变量保存中间变量。
关键点:
Verilog的实例化灵活应用。
解法①:
module top_module ( input clk, input d, output q );
reg q1,q2,q3;
my_dff dff1(.clk(clk),.d(d),.q(q1));
my_dff dff2(.clk(clk),.d(q1),.q(q2));
my_dff dff3(.clk(clk),.d(q2),.q(q3));
assign q = q3;
endmodule
解法②:
module top_module ( input clk, input d, output q );
wire q1,q2;
my_dff inst1(
.clk (clk),
.d (d),
.q (q1)
);
my_dff inst2(
.clk (clk),
.d (q1),
.q (q2)
);
my_dff inst3(
.clk (clk),
.d (q2),
.q (q)
);
endmodule
注意:
1、如果有矢量且多个wire变量定义的时候,那么可以定义[最高位:最低位]变量名,或者分开定义多次变量。即:
##第一种表示
wire [7:0] var1, var2;
##第二种表示
wire [7:0] var1;
wire [7:0] var2;
##错误的表达方式:
wire [7:0] var1, [15:0] var2;
2、case语句的使用要配合always@()。
module top_module (
input clk,
input [7:0] d,
input [1:0] sel,
output [7:0] q
);
wire [7:0]q1;
wire [7:0]q2;
wire [7:0]q3;
my_dff8 dff1 (.clk(clk),.d( d),.q(q1));
my_dff8 dff2 (.clk(clk),.d(q1),.q(q2));
my_dff8 dff3 (.clk(clk),.d(q2),.q(q3));
always@(*)begin
case(sel)
2'b00 : q=d;
2'b01 : q=q1;
2'b10 : q=q2;
default : q=q3;
endcase
end
endmodule