74ls148编码器实现三人表决电路:从原理到FPGA实战

1次阅读
没有评论

共计 1724 个字符,预计需要花费 5 分钟才能阅读完成。

image.webp

背景痛点:为什么需要优先编码器

传统三人表决电路如果用基本门电路搭建,需要大量与非门组合。假设用最简的 2 / 3 多数表决逻辑,仅核心部分就需要 6 个与非门(3 个输入两两相与后再或),再加上去抖动和锁存电路,整体设计会变得非常复杂。这种设计存在几个明显问题:

74ls148 编码器实现三人表决电路:从原理到 FPGA 实战

  • 门电路数量随参与者增加呈指数级增长
  • 布线复杂度高容易引入干扰
  • 修改表决规则(如改为必须全票通过)需要重新设计整个电路

74ls148 芯片深度解析

74ls148 是 8 线 - 3 线优先编码器,其真值表如下:

输入 EO A2 A1 A0 GS
全 1 1 1 1 1 1
I0=0 1 1 1 0 0
I7=0 0 0 0 0 0

关键特性说明:

  1. 优先编码 :当多个输入有效时,只响应最高位输入(I7 优先级最高)
  2. EI/EO 级联 :允许扩展更多输入端口
  3. EI= 0 时芯片工作
  4. 当无有效输入时 EO=0,可驱动下一级芯片
  5. GS 标志位 :任何有效输入时变为 0

完整电路设计

三人表决系统框图:

[按键] -> [消抖电路] -> [74ls148] -> [表决逻辑] -> [锁存器] -> [LED 显示]

具体实现细节:

  1. 消抖电路 :采用典型的 RC 滤波 + 施密特触发器方案,时间常数取 10ms
  2. 编码器配置
  3. 只使用 I0-I2 三个输入端口
  4. EI 接地使能,EO 悬空
  5. 表决逻辑
  6. 通过观察真值表可知,当有两个及以上输入时,A1+A0≥2
  7. 用或门组合 A1 和 A0 即可得到多数表决结果
  8. 输出锁存 :使用 74ls373 在时钟上升沿锁存结果

FPGA 实现(Verilog)

module voter_3input(
    input clk,
    input [2:0] key_in,  // 消抖后的按键输入
    output reg result    // 表决结果
);

// 模拟 74ls148 行为
wire [1:0] enc_out;
wire active;

always @(*) begin
    casex(key_in)
        3'b000: {enc_out, active} = {2'b11, 1'b1};
        3'b001: {enc_out, active} = {2'b00, 1'b0};
        3'b010: {enc_out, active} = {2'b01, 1'b0};
        3'b100: {enc_out, active} = {2'b10, 1'b0};
        default: {enc_out, active} = {2'b00, 1'b0};
    endcase
end

// 多数表决逻辑
wire vote_pass = (enc_out[1] | enc_out[0]);

// 时钟域同步
always @(posedge clk) begin
    result <= vote_pass;
end

endmodule

测试平台代码:

module tb_voter();
reg clk;
reg [2:0] keys;
wire result;

voter_3input uut(.*);

initial begin
    clk = 0;
    forever #5 clk = ~clk;
end

initial begin
    // 边界测试
    keys = 3'b000; #10;
    keys = 3'b001; #10; // 单票应不通过
    keys = 3'b011; #10; // 两票应通过
    keys = 3'b111; #10; // 全票应通过
    // 竞争测试
    keys = 3'b001; #2;
    keys = 3'b010; #2; // 快速连续变化
    #20 $finish;
end
endmodule

避坑指南

  1. 按键消抖
  2. 实测机械按键抖动可达 20ms
  3. 推荐方案:FPGA 内用计数器实现,检测稳定 10ms 不变才认为有效

  4. 竞争冒险

  5. 组合逻辑输出可能产生毛刺
  6. 解决方法:所有输出必须用时钟同步
  7. 必要时插入流水线寄存器

  8. 时序约束

  9. 设置合理的时钟周期(建议 >20ns)
  10. 对锁存器输出设置 set_max_delay 约束

扩展思考

如何设计五人表决系统?两种实现方案对比:

  1. 级联编码器方案
  2. 使用两片 74ls148 级联
  3. 第一片 EO 接第二片 EI
  4. 表决逻辑变为 A2+A1+A0≥3

  5. ROM 查表法

  6. 将输入作为地址线
  7. 预存所有 32 种组合的结果
  8. 优点:修改规则无需改电路
  9. 缺点:响应速度稍慢

实际选择时需要考虑表决规则变更频率和响应速度要求。

实战心得

通过这个项目,我深刻体会到优先编码器在化简组合逻辑方面的优势。建议初学者先用 Multisim 等工具仿真电路,再过渡到 FPGA 实现。遇到问题时,要善用 SignalTap 逻辑分析仪观察中间信号。

正文完
 0
评论(没有评论)