描述
在数字芯片设计中,通常把完成特定功能且相对独立的代码编写成子模块,在需要的时候再在主模块中例化使用,以提高代码的可复用性和设计的层次性,方便后续的修改。
请编写一个子模块,将输入两个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 logic clk,
input logic rst_n,
input logic [7:0]a,
input logic [7:0]b,
input logic [7:0]c,
output logic [7:0]d
);
logic [7:0] c1;
logic [7:0] c2;
comple u1_comple(
.clk (clk),
.rst_n (rst_n),
.a (a),
.b (b),
.c (c1)
);
always@ (posedge clk) begin
c2 <= c;
end
comple u2_comple(
.clk (clk),
.rst_n (rst_n),
.a (c1),
.b (c2),
.c (d)
);
endmodule
module comple(
input logic clk,
input logic rst_n,
input logic [7:0] a,
input logic [7:0] b,
output logic [7:0] c
);
always@(posedge clk or negedge rst_n) begin
if (!rst_n) begin
c <= 'd0;
end else begin
c <= (a > b) ? b : a;
end
end
endmodule