题意整理

题目要求编写子模块实现两个输入数的大小比较并输出较小值,可以使用if-else语句实现。同时要求在主模块中实现三个输入数值的大小比较,假设三个输入变量为a,b,c。则可以先比较得到a,b中的较小值m,再得到b,c之中的较小值n。最后比较m,n的大小,输入较小值,即可得到a,b,c的最小值。

题解主题

Verilog HDL中,在声明过程中,主模块和子模块在声明方式上没有差别,都是以module开始,endmodule结束。当在一个模块中例化另外一个模块,则后者成为前者的子模块。题目要求编写一个模块,比较两个数值的大小,并输出较小值,该模块本身可以独立完成功能,通过在主模块中例化可以配合其他语句完成更丰富的功能。

module sub_mod(

       input clk,

       input rst_n,

       input [7:0]data_a,

       input [7:0]data_b,

       output  reg [7:0]data_c

);

always @(posedge clk or negedge rst_n)

       if(!rst_n)

              data_c <= 0;

       else if(data_a > data_b)

              data_c <= data_b;

       else

              data_c <= data_a;

endmodule

 模块的例化需要指定例化的模块名称和端口连接关系,对于没有使用的端口,可以不列出。例化模板如下:

       module_a a_inst(

              .data_a(data_m),

              .data_b(data_n)

);

module_a是子模块的模块名,a_inst是例化之后的子模块名,当多次例化同一个模块,需要使用不同的例化模块名称。端口列写于括号之中,.data_a(data_a),前一个data_a是子模块的端口名称,括号中的data_m是存在于主模块的信号名,表示子模块的data_a连接到主模块的data_m。题目要求实现输出三个输入的最小值。以a,b,c为例,可以先比较a.b,得到其中的较小值d,再比较得到c,d的较小值e。最后比较d,e的大小,得到最小值。可以按照如下的方式例化。

wire [7:0]m,n;

//先得到ab之中的较小值m

sub_mod mod_ab(

       .clk(clk),

       .rst_n(rst_n),

       .data_a(a),

       .data_b(b),

       .data_c(m)

       );

//先得到ac之中的较小值n

sub_mod mod_bc(

       .clk(clk),

       .rst_n(rst_n),

       .data_a(b),

       .data_b(c),

       .data_c(n)

       );

//最后对比mn的大小

sub_mod mod_mn(

       .clk(clk),

       .rst_n(rst_n),

       .data_a(m),

       .data_b(n),

       .data_c(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]m,n;
//先得到ab之中的较小值m
sub_mod mod_ab(
	.clk(clk),
	.rst_n(rst_n),
	.data_a(a),
	.data_b(b),
	.data_c(m)
	);
//先得到ac之中的较小值n
sub_mod mod_bc(
	.clk(clk),
	.rst_n(rst_n),
	.data_a(b),
	.data_b(c),
	.data_c(n)
	);
//最后对比mn的大小
sub_mod mod_mn(
	.clk(clk),
	.rst_n(rst_n),
	.data_a(m),
	.data_b(n),
	.data_c(d)
	);	
endmodule



module sub_mod(
	input clk,
	input rst_n,
	input [7:0]data_a,
	input [7:0]data_b,

	output  reg [7:0]data_c
);
always @(posedge clk or negedge rst_n)
	if(!rst_n)
		data_c <= 0;
	else if(data_a > data_b)
		data_c <= data_b;
	else 
		data_c <= data_a;	
endmodule