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

  • 相关阅读:
    UniApp 解决 style 绑定 css 变量,支持 var() 使用
    latex表格内容换行
    项目文章:oxBS揭示复发性膀胱癌的DNA甲基化和羟甲基化变化并鉴定预测PD-L1表达标记物
    无胁科技-TVD每日漏洞情报-2022-11-24
    npm 清缓存
    用nginx作反向代理时,请求头中含波浪线无法转发请求的解决方法
    JavaWeb -- MySQL
    spring-boot-starter和spring-boot-starter-web的关联
    数据库与数据库管理系统 MySQL的安装 SQL语言学习:DDL、DML
    【Git】IDEA 集成 Git
  • 原文地址:https://blog.csdn.net/mxh3600/article/details/126455113