使用子模块实现三输入数的大小比较

描述

在数字芯片设计中,通常把完成特定功能且相对独立的代码编写成子模块,在需要的时候再在主模块中例化使用,以提高代码的可复用性和设计的层次性,方便后续的修改。

请编写一个子模块,将输入两个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 

  • 7
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值