在数字芯片设计中,通常把完成特定功能且相对独立的代码编写成子模块,在需要的时候再在主模块中例化使用,以提高代码的可复用性和设计的层次性,方便后续的修改。
请编写一个子模块,将输入两个8bit位宽的变量data_a,data_b,并输出data_a,data_b之中较小的数。并在主模块中例化,实现输出三个8bit输入信号的最小值的功能。
子模块的信号接口图如下:
主模块的信号接口图如下:
使用Verilog HDL实现以上功能并编写testbench验证。
在数字芯片设计中,通常把完成特定功能且相对独立的代码编写成子模块,在需要的时候再在主模块中例化使用,以提高代码的可复用性和设计的层次性,方便后续的修改。
请编写一个子模块,将输入两个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中的最小值
有大佬可以解释一下为什么12,13行报错吗。我感觉我的语法没出现啥问题。 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]w1; compare_1(.clk(clk),.rst_n(rst_n),.a(a),.b(b),.c(w1)); compare_2(.clk(clk),.rst_n(rst_n),.a(w1),.b(c),.c(d)); endmodule module compare( input clk, input rst_n, input [7:0]a, input [7:0]b, output [7:0]c ); always @(posedge clk&nbs***bsp;negedge rst_n) begin if(~rst_n) c=0; else if (a<b) c=a; else c=b; end endmodule
`timescale 1ns/1ns module sub_mod ( input clk, input rst_n, input [7:0] a, input [7:0] b, output reg [7:0] c ); wire [8:0] less; wire [7:0] d; wire [7:0] e; generate genvar i; assign less[0] = 0; for(i=7;i>=0;i=i-1)begin // assign less[i+1]= (a[i]^b[i])?a[i]:less[i]; assign e[i] = a[i]^b[i]; assign less[i+1]= (e[i]&a[i])|((~e[i])&less[i]); assign d[i] = (less[8]&b[i])|((~less[8])&a[i]); end endgenerate always@(posedge clk&nbs***bsp;negedge rst_n) begin if(!rst_n) c <= 8'b0; else c <= d; end endmodule module main_mod( input clk, input rst_n, input [7:0]a, input [7:0]b, input [7:0]c, output wire [7:0]d ); wire [7:0] min_ab; wire [7:0] min_ac; wire [7:0] min_abc; sub_mod sub_mod_U0( .clk (clk), .rst_n (rst_n), .a (a), .b (b), .c (min_ab) ); sub_mod sub_mod_U1( .clk (clk), .rst_n (rst_n), .a (a), .b (c), .c (min_ac) ); sub_mod sub_mod_U2( .clk (clk), .rst_n (rst_n), .a (min_ab), .b (min_ac), .c (min_abc) ); assign d = min_abc; endmodule
`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]temp,temp1; min2 u1(clk,rst_n,a,b,temp); min2 u2(clk,rst_n,b,c,temp1); min2 u3(clk,rst_n,temp,temp1,d); endmodule module min2( input clk, input rst_n, input [7:0]a, input [7:0]b, output reg [7:0]d ); always@(posedge clk&nbs***bsp;negedge rst_n)begin if(!rst_n) d <= 8'd0; else if(a<=b) d<=a; else d<=b; end endmodule
`timescale 1ns/1ns module main_mod( input clk, input rst_n, input [7:0]a, input [7:0]b, input [7:0]c, output reg [7:0]d ); wire [7:0] c_temp; sub_mod u_sub_mod( .clk (clk), .rst_n (rst_n), .data_a (a), .data_b (b), .data_c (c_temp) ); always@(posedge clk&nbs***bsp;negedge rst_n)begin if(~rst_n)begin d <= 8'b0; end else begin if(c_temp > c)begin d <= c; end else begin d <= c_temp; end end end 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&nbs***bsp;negedge rst_n)begin if(~rst_n)begin data_c <= 8'b0; end else begin if(data_a > data_b)begin data_c <= data_b; end else begin data_c <= data_a; end end end endmodule