赞
踩
在数字芯片设计中,通常把完成特定功能且相对独立的代码编写成子模块,在需要的时候再在主模块中例化使用,以提高代码的可复用性和设计的层次性,方便后续的修改。
请编写一个子模块,将输入两个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
。
代码如下:
- `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
波形图:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。