• 牛客刷题<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

  • 相关阅读:
    透明度和透明贴图制作玻璃水杯
    定制SD-WAN以满足您的需求
    c++多态
    设计模式学习笔记(十四)责任链模式实现及在Filter中的应用
    【2023】从事务的特征以及解决方式上分析MySQL是如何保证事务的
    设计新鲜事(News Feed)系统
    nginx实现负载均衡(三)
    学习day59
    Tauri2 mobile development traps
    【Machine Learning in R - Next Generation • mlr3】
  • 原文地址:https://blog.csdn.net/mxh3600/article/details/126455113