You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让一个Verilog模块的7位输出同时驱动LED与Hex显示?

实现同一7位输出同时驱动LED和Hex显示器的解决方案

问题核心分析

你的代码当前存在两个关键问题:一是my21mux是单比特多路选择器,无法处理7位宽的输入输出;二是没有将多路选择器的输出同时连接到LEDR和HEX0。以下是修正后的完整解决方案:


1. 修正7位宽2选1多路选择器模块

将原单比特的my21mux改为支持7位数据的版本,两种实现方式可选:

module my21mux(sel, in0, in1, y);
    input sel;
    input [6:0] in0, in1;  // 匹配7位输入
    output [6:0] y;        // 匹配7位输出

    // 方式1:行为级实现(简洁易读,推荐)
    assign y = sel ? in1 : in0;

    // 方式2:门级实现(如果需要门级电路)
    // wire nsel;
    // not n(nsel, sel);
    // genvar i;
    // generate
    //     for(i=0; i<7; i=i+1) begin
    //         wire t0, t1;
    //         and a1(t0, in0[i], nsel);
    //         and a2(t1, in1[i], sel);
    //         or o(y[i], t0, t1);
    //     end
    // endgenerate
endmodule

2. 修改主模块,共享输出信号

在主模块中,将多路选择器的输出同时赋值给LEDR和HEX0,实现同一信号驱动两个外设:

module Majority(SW, LEDR, KEY, HEX0);
    input [16:0] SW;
    input [3:3] KEY;
    output [6:0] LEDR;
    output [6:0] HEX0;

    // 内部线网,用于传递多路选择器的输出
    wire [6:0] mux_out;

    // 实例化7位2选1多路选择器
    my21mux m21m_inst(
        .sel(KEY[3]),
        .in0(SW[6:0]),
        .in1(SW[16:10]),
        .y(mux_out)
    );

    // 将同一输出同时连接到LED和Hex显示器
    assign LEDR = mux_out;
    assign HEX0 = mux_out;
endmodule

3. 修正测试平台,测试顶层模块

原测试平台直接实例化了子模块,改为测试顶层Majority模块,并覆盖7位输入的测试场景:

`timescale 1 ns/1 ns

module TestBench();
    reg [3:3] KEY;
    reg [16:0] SW;
    wire [6:0] LEDR;
    wire [6:0] HEX0;

    // 实例化顶层模块
    Majority uut(
        .SW(SW),
        .LEDR(LEDR),
        .KEY(KEY),
        .HEX0(HEX0)
    );

    // 测试流程:覆盖选择信号和不同输入组合
    initial begin
        // 测试选择SW[6:0](sel=0)
        KEY[3] = 0;
        SW[6:0] = 7'b0000001; SW[16:10] = 7'b1111111; #5;
        SW[6:0] = 7'b0000111; SW[16:10] = 7'b0000000; #5;

        // 测试选择SW[16:10](sel=1)
        KEY[3] = 1;
        SW[6:0] = 7'b0000001; SW[16:10] = 7'b1111111; #5;
        SW[6:0] = 7'b0000111; SW[16:10] = 7'b0000000; #5;

        $finish;
    end

    // 可选:打印输出,便于观察测试结果
    initial begin
        $monitor("Time=%0t, sel=%b, SW_low=%b, SW_high=%b, LEDR=%b, HEX0=%b",
                 $time, KEY[3], SW[6:0], SW[16:10], LEDR, HEX0);
    end
endmodule

关键注意点

  • 确保所有信号位宽匹配:SW[6:0]、SW[16:10]、LEDR、HEX0和多路选择器的输入输出都是7位,避免位宽不匹配错误。
  • Verilog允许一个线网信号驱动多个负载,因此可以直接将mux_out同时赋值给LEDR和HEX0。

内容的提问来源于stack exchange,提问作者Daniel N.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 15:24:40