描述
在数字芯片设计中,通常把完成特定功能且相对独立的代码编写成子模块,在需要的时候再在主模块中例化使用,以提高代码的可复用性和设计的层次性,方便后续的修改。
请编写一个子模块,将输入两个8bit位宽的变量data_a,data_b,并输出data_a,data_b之中较小的数。并在主模块中例化,实现输出三个8bit输入信号的最小值的功能。
子模块的信号接口图如下:
主模块的信号接口图如下:
使用Verilog HDL实现以上功能并编写testbench验证。
输入描述:
clk:系统时钟
rst_n:异步复位信号,低电平有效
a,b,c:8bit位宽的无符号数
输出描述:
d:8bit位宽的无符号数,表示a,b,c中的最小值
解题分析:
本次代码使用了三个比较器完成。此外,还有一种解法放在了简析中。
sub_mod0
:比较器0,a
和b
比较得到较小的值tmp0
;
sub_mod1
:比较器1,a
和c
比较得到较小的值tmp1
;
sub_mod2
:比较器2,tmp0
和tmp1
比较得到最小的值d
。
代码如下:
cs
`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] tmp0, tmp1;
sub_mod sub_mod0(.clk(clk), .rst_n(rst_n), .a(a), .b(b), .c(tmp0));
sub_mod sub_mod1(.clk(clk), .rst_n(rst_n), .a(a), .b(c), .c(tmp1));
sub_mod sub_mod2(.clk(clk), .rst_n(rst_n), .a(tmp0), .b(tmp1), .c(d) );
endmodule
module sub_mod(
input clk,
input rst_n,
input [7:0] a,
input [7:0] b,
output [7:0] c
);
reg [7:0] c_r;
always@(posedge clk or negedge rst_n) begin
if(~rst_n)
c_r <= 8'b0;
else
c_r <= a < b? a:b;
end
assign c = c_r;
endmodule
波形图: