• 牛客刷题<14>键盘编码电路


    题目:用优先编码器①实现键盘编码电路_牛客题霸_牛客网

    思路:

    1. 首先确定电路输出L是8421BCD码,即是高电平有效的,而题目中给出的优先编码器输出Y_n是低电平有效的,故应当明确L和Y_n两者的状态是恰好相反的;

    2. 注意:键盘有10个按键,而所给的优先编码器是只有9个输入的;

    3. 此题关键在于着重理解: “键盘编码电路要有工作状态标志,以区分没有按键按下和按键0按下两种情况。” : 这句话的潜台词是 按键按下和按键0按下时,电路的输出L的状态是一样的,因此在这种情况下可以通过GS信号来区分键盘是否处在工作状态,对应的真值表如下;

    键盘状态S[9:0]L[3:0]GS
    无按键按下1_1111_111100000
    按键0按下1_1111_111000001
    1. `timescale 1ns/1ns
    2. module encoder_0(
    3. input [8:0] I_n ,
    4. output reg [3:0] Y_n
    5. );
    6. always @(*)begin
    7. casex(I_n)
    8. 9'b111111111 : Y_n = 4'b1111;
    9. 9'b0xxxxxxxx : Y_n = 4'b0110;
    10. 9'b10xxxxxxx : Y_n = 4'b0111;
    11. 9'b110xxxxxx : Y_n = 4'b1000;
    12. 9'b1110xxxxx : Y_n = 4'b1001;
    13. 9'b11110xxxx : Y_n = 4'b1010;
    14. 9'b111110xxx : Y_n = 4'b1011;
    15. 9'b1111110xx : Y_n = 4'b1100;
    16. 9'b11111110x : Y_n = 4'b1101;
    17. 9'b111111110 : Y_n = 4'b1110;
    18. default : Y_n = 4'b1111;
    19. endcase
    20. end
    21. endmodule
    22. module key_encoder(
    23. input [9:0] S_n ,
    24. output wire[3:0] L ,
    25. output wire GS
    26. );
    27. wire [3:0] L_temp;
    28. encoder_0 encoder(
    29. S_n[9:1],L_temp
    30. );
    31. assign GS = ~((&(~L)) & S_n[0]);
    32. assign L = ~L_temp;
    33. endmodule

    解法二

    1. `timescale 1ns/1ns
    2. module encoder_0(
    3. input [8:0] I_n ,
    4. output reg [3:0] Y_n
    5. );
    6. always @(*)begin
    7. casex(I_n)
    8. 9'b111111111 : Y_n = 4'b1111;
    9. 9'b0xxxxxxxx : Y_n = 4'b0110;
    10. 9'b10xxxxxxx : Y_n = 4'b0111;
    11. 9'b110xxxxxx : Y_n = 4'b1000;
    12. 9'b1110xxxxx : Y_n = 4'b1001;
    13. 9'b11110xxxx : Y_n = 4'b1010;
    14. 9'b111110xxx : Y_n = 4'b1011;
    15. 9'b1111110xx : Y_n = 4'b1100;
    16. 9'b11111110x : Y_n = 4'b1101;
    17. 9'b111111110 : Y_n = 4'b1110;
    18. default : Y_n = 4'b1111;
    19. endcase
    20. end
    21. endmodule
    22. module key_encoder(
    23. input [9:0] S_n ,
    24. output wire[3:0] L ,
    25. output wire GS
    26. );
    27. wire [3:0] Y_n;
    28. encoder_0 u0(
    29. .I_n(S_n[9:1]),
    30. .Y_n(Y_n)
    31. );
    32. assign L = ~Y_n;
    33. assign GS = ~(S_n[0] & Y_n[0] & Y_n[1] & Y_n[2] & Y_n[3]);
    34. endmodule

    解法三

    1. `timescale 1ns/1ns
    2. module encoder_0(
    3. input [8:0] I_n ,
    4. output reg [3:0] Y_n
    5. );
    6. always @(*)begin
    7. casex(I_n)
    8. 9'b111111111 : Y_n = 4'b1111;
    9. 9'b0xxxxxxxx : Y_n = 4'b0110;
    10. 9'b10xxxxxxx : Y_n = 4'b0111;
    11. 9'b110xxxxxx : Y_n = 4'b1000;
    12. 9'b1110xxxxx : Y_n = 4'b1001;
    13. 9'b11110xxxx : Y_n = 4'b1010;
    14. 9'b111110xxx : Y_n = 4'b1011;
    15. 9'b1111110xx : Y_n = 4'b1100;
    16. 9'b11111110x : Y_n = 4'b1101;
    17. 9'b111111110 : Y_n = 4'b1110;
    18. default : Y_n = 4'b1111;
    19. endcase
    20. end
    21. endmodule
    22. module key_encoder(
    23. input [9:0] S_n ,
    24. output wire[3:0] L ,
    25. output wire GS
    26. );
    27. wire [3:0] Y_n;
    28. encoder_0 u0(
    29. .I_n(S_n[9:1]),
    30. .Y_n(Y_n)
    31. );
    32. assign L = ~Y_n;
    33. assign GS = ~&S_n;
    34. endmodule

  • 相关阅读:
    python基础语法
    [ 笔记 ] 计算机网络安全_3_Web安全
    外网打点(信息收集)
    【云原生专题】基于Docker+Neo4j图数据库搭建企业级分布式应用拓扑图
    使用D435i+Avia跑Fast-LIVO
    springboot整合其它项目
    【mac前端开发环境】
    使用 compose 的 Canvas 自定义绘制实现 LCD 显示数字效果
    Date常用格式转换
    【RocketMQ】事务的实现原理
  • 原文地址:https://blog.csdn.net/mxh3600/article/details/126455113