使用子模块实现三输入数的大小比较
题目描述
在数字芯片设计中,通常把完成特定功能且相对独立的代码编写成子模块。在需要的时候再在主模块中例化使用,以提高代码的可复用性和设计的层次性,方便后续的修改。
请编写一个子模块,将输入两个8bit位宽的变量data_a,data_b,并输出data_a,data_b之中较小的数。并在主模块中例化,实现输出三个8bit输入信号的最小值的功能。
子模块的信号接口图如下
主模块的信号接口图吐下
输入描述
clk:系统时钟
rst_n:异步复位信号,低电平有效
a,b,c:8bit位宽的无符号数
输出描述:
d:8bit位宽的无符号数,表示a,b,c中的最小值
`timescale 1ns/1ns
module main_mod(
input clk,
input rst_n,
input [7:0]a,
input [7:0]b,
input [7:0]c,
output [7:0]d
);
wire[7:0] a_b_min;
wire[7:0] a_c_min;
savel_mod u1(
.clk(clk),
.rst_n(rst_n),
.a(a),
.b(b),
.c(a_b_min)
);
savel_mod u2(
.clk(clk),
.rst_n(rst_n),
.a(a),
.b(c),
.c(a_c_min)
);
savel_mod u3(
.clk(clk),
.rst_n(rst_n),
.a(a_b_min),
.b(a_c_min),
.c(d)
);
endmodule
module savel_mod(
input clk,
input rst_n,
input [7:0] a,
input [7:0] b,
output[7:0] c
);
reg[7:0] c_reg;
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
c_reg <= 8'b0;
else if(a > b)
c_reg <= b;
else
c_reg <= a;
end
assign c = c_reg;
endmodule
知识点
模块例化可以理解成模块调用。对于一个FPGA工程,通常是由一个顶层模块与多个功能子模块组成,为了实现顶层模块与子模块的连接,需要进行模块间的例化(或说是调用)。
wire 连线a;
wire 连线b;
wire 连线out;
and_gata(模块本身的名字) my_andgate(我们例化的二输入与门的名字) (
.模块的端口 a (连线a),
.模块的端口 b (连线b),
.模块的端口 out (连线out),
);
注意:端口之间的位数匹配。
“.”表示相连。