• 数字IC手撕代码--投票表决器


    题目

    设计一个投票表决器,输入为一个5bit的向量,为1表示赞同,为0表示不赞同,当赞同人数大于非赞同人数时,表决器输出为1,否则为0。
    思路:一种方法是统计向量中1的个数,若大于等于3,则输出1,否则输出0。另一种方法是考虑所有可能的情况,事实上,只要有三个位的值为1,则表决器就输出1,因此可据此进行枚举( C 5 3 = 10 C_5^3=10 C53=10),得到最终的结果。

    代码

    `timescale 1ns / 1ps
    //
    // Company: 
    // Engineer: 
    // 
    // Create Date: 2022/07/01 15:19:05
    // Design Name: 
    // Module Name: top
    // Project Name: 
    // Target Devices: 
    // Tool Versions: 
    // Description: 
    // 
    // Dependencies: 
    // 
    // Revision:
    // Revision 0.01 - File Created
    // Additional Comments:
    // 
    //
    
    
    module top(
    input logic clk,
    input logic rst,
    input [4:0] vote,
    output logic r1,
    output logic r2
        );
    //1
    always@(posedge clk,posedge rst)
    if(rst)
       r1<=0;
    else
       r1<=(vote[0]&vote[1]&vote[2])
          |(vote[0]&vote[1]&vote[3])
    	  |(vote[0]&vote[1]&vote[4])
    	  |(vote[0]&vote[2]&vote[3])
    	  |(vote[0]&vote[2]&vote[4])
    	  |(vote[0]&vote[3]&vote[4])
    	  |(vote[1]&vote[2]&vote[3])
    	  |(vote[1]&vote[2]&vote[4])
    	  |(vote[1]&vote[3]&vote[4])
    	  |(vote[2]&vote[3]&vote[4]);
    //2
    logic s1;
    logic c1;
    logic s2;
    logic c2;
    logic [2:0] sum;
    assign {c1,s1}=vote[0]+vote[1]+vote[2];
    assign {c2,s2}=vote[3]+vote[4];
    assign sum={c1,s1}+{c2,s2};
    always@(posedge clk,posedge rst)
    if(rst)
       r2<=0;
    else if(sum>=3)
       r2<=1;
    else
       r2<=0;
    endmodule
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62

    测试平台

    module test;
    logic clk;
    logic rst;
    logic [4:0] vote;
    logic r1;
    logic r2;
    logic error;
    //clk
    initial
    begin
       clk=0;
       forever
          #5 clk=~clk;
    end
    //rst
    initial
    begin
       rst=1;
       #100
       rst=0;
    end
    //
    always@(posedge clk,posedge rst)
    if(rst)
       vote<=0;
    else 
       vote<=$urandom%32;
    //
    assign error=(r1!=r2)?1:0;
    
    top U(.*
    /*
    input logic clk,
    input logic rst,
    input [4:0] vote,
    output logic r1,
    output logic r2
    */
        );
    endmodule
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    结果

    在这里插入图片描述

    总结

    对于N输入的表决器(N为奇数),我们同样可以采用类似的方法:
    1.通过加法器求1的个数,若和大于(N-1)/2,则输出为1
    2.枚举这N个输入的(N+1)/2组合(共 C N ( N + 1 ) / 2 C_N^{(N+1)/2} CN(N+1)/2项),然后将它们或起来。

  • 相关阅读:
    怎么他们都有开源项目经历|手把手教你参与开源
    通过WSL2搭建Pytorch1.10+CUDA11.4+NVIDIA Driver深度学习框架
    Flink SQL解析嵌套Json数据测试过程调研
    人工智能数学课高等数学线性微积分数学教程笔记(7. 最优化)
    信息安全管理体系认证对企业的好处
    xtrabackup全备 增备
    543. 二叉树的直径
    彻底搞懂MySql的B+Tree
    Android描边外框stroke边线、rotate旋转、circle圆形图的简洁通用方案,基于Glide与ShapeableImageView,Kotlin
    consul--基础--04--命令
  • 原文地址:https://blog.csdn.net/qq_40268672/article/details/125559869