使用子模块实现三输入数的大小比较
题目描述
在数字芯片设计中,通常把完成特定功能且相对独立的代码编写成子模块。在需要的时候再在主模块中例化使用,以提高代码的可复用性和设计的层次性,方便后续的修改。
请编写一个子模块,将输入两个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));endmodulemodule 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)beginif(!rst_n)c_reg <= 8'b0;else if(a > b)c_reg <= b;else c_reg <= a;endassign c = c_reg;endmodule
知识点
模块例化可以理解成模块调用。对于一个FPGA工程,通常是由一个顶层模块与多个功能子模块组成,为了实现顶层模块与子模块的连接,需要进行模块间的例化(或说是调用)。
wire 连线a;
wire 连线b;
wire 连线out;
and_gata(模块本身的名字) my_andgate(我们例化的二输入与门的名字) (.模块的端口 a (连线a), .模块的端口 b (连线b), .模块的端口 out (连线out), );
注意:端口之间的位数匹配。
“.”表示相连。