如何让一个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.
相关产品推荐
相关产品推荐

