Verilog 4位比较器结构模型

问题描述 投票:0回答:3

我想设计一个4位比较器作为使用2位比较器的结构模型。

如附图所示,给Gt_I、Eq_I、Lt_I各自赋予初始值后,需要设计一个4位比较器作为2位比较器的结构模型。

我尝试过的代码在分配Gt_I、Eq_I和Lt_I的初始值时存在语法错误。我想知道解决办法。

<2bit>

module Comparator_new(a, b, Gt_I, Eq_I, Lt_I, Gt_O, Eq_O, Lt_O);

input [1:0] a;
input [1:0] b;
input Gt_I, Eq_I, Lt_I;
output Gt_O, Eq_O, Lt_O;

assign Gt_O = ~(a[1] & ~b[1] | ~a[1] & b[1]) & a[0] & ~b[0] | a[1] & ~b[1];
assign Eq_O = ~(a[0] & ~b[0] | ~a[0] & b[0]) & ~(a[1] & ~b[1] | ~a[1] & b[1]);
assign Lt_O = ~(a[1] & ~b[1] | ~a[1] & b[1]) & ~a[0] & b[0] | ~a[1] & b[1];
endmodule

<4bit>

module Comparator_stru(a, b, Gt_I, Eq_I, Lt_I, Gt, Eq, Lt);

input [3:0] a;
input [3:0] b;
input Gt_I = 2'b00;
input Eq_I = 2'b01;
input Lt_I = 2'b00;
output Gt, Eq, Lt;

wire x, y, z;

Comparator_new c0(.a(a), .b(b), .Gt_I(Gt_I), .Eq_I(Eq_I), .Lt_I(Lt_I), .Gt_O(x), .Eq_O(y), .Lt_O(z));
Comparator_new c1(.a(a), .b(b), .Gt_I(x), .Eq_I(y), .Lt_I(z), .Gt_O(Gt), .Eq_O(Eq), .Lt_O(Lt));

assign Gt_O = ~(a[3] & ~b[3] | ~a[3] & b[3]) & a[2] & ~b[2] | a[3] & ~b[3];
assign Eq_O = ~(a[2] & ~b[2] | ~a[2] & b[2]) & ~(a[3] & ~b[3] | ~a[3] & b[3]);
assign Lt_O = ~(a[3] & ~b[3] | ~a[3] & b[3]) & ~a[2] & b[2] | ~a[3] & b[3];
endmodule
`timescale 1ns/10ps

module tb_Comparator_stru;
reg a, b;
wire Gt, Eq, Lt;

Comparator_stru tb(.a(a), .b(b), .Gt(Gt), .Eq(Eq), .Lt(Lt));

initial
begin
    $dumpfile("test_Comparator_stru_out.vcd");
    $dumpvars(-1, tb);
    $monitor("%b", Gt);
    $monitor("%b", Eq);
    $monitor("%b", Lt);
end

initial
    begin
        a = 2'b00; b = 2'b00;
    #50 a = 2'b01; b = 2'b00;
    #50 a = 2'b01; b = 2'b01;
    #50 a = 2'b01; b = 2'b10;
    #50 a = 2'b10; b = 2'b10;
    #50 a = 2'b11; b = 2'b10;
    #50 a = 2'b11; b = 2'b11;
    #50;
    end
endmodule

diagram

verilog
3个回答
0
投票

Gt_I
Eq_I
Lt_I
为模块
Comparator_stru
的输入端口。他们由司机驾驶,并从司机那里获得价值。

在您的情况下,如果您想为它们分配初始值,您需要使用

initial
块,并在测试台中执行此操作。

<4bit>

module Comparator_stru(a, b, Gt_I, Eq_I, Lt_I, Gt, Eq, Lt);

input [3:0] a;
input [3:0] b;
input Gt_I;  // = 2'b00;
input Eq_I;  // = 2'b01;
input Lt_I;  // = 2'b00;

测试台

Comparator_stru tb(.a(a), .b(b), .Gt_I(Gt_I), .Eq_I(Eq_I), .Lt_I(Lt_I), .Gt(Gt), .Eq(Eq), .Lt(Lt));

initial begin
    Gt_I = 1'b0;
    Eq_I = 1'b1;
    Lt_I = 1'b0;
end

0
投票

1) 大于输入、等于输入、小于输入两个块都可以是单位。 不需要两位。 2) 4位模块的实例化是错误的 您可以像 a(1) 那样按位分配。 a(0); 第二个块 a(2) .a(0); 希望你明白我的意思


-1
投票

模块 Comparator_stru() 将分配变量为 Gt、Lt、Eq,而不是 Gt_O、Lt_O、Eq_O,因为该模块没有 Gt_O、Lt_O、Eq_O 作为输出。

© www.soinside.com 2019 - 2024. All rights reserved.