• 数字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项),然后将它们或起来。

  • 相关阅读:
    三维数模(.obj .stl)转化为点云
    qt调用python脚本中的函数
    vite中配置@路径
    精研科技融入汽车内饰 Laedana打造车内空间新生态
    【微服务技术】微服务技术栈/各模块介绍
    [论文工具] LaTeX常见错误及解决方法汇总笔记(eps2pdf失败 | 特殊符号 | 参考文献未显示或越界)
    openalyers 实现蒙版图层
    vue-springboot 前后端传参的形式
    提示工程101|与 AI 交谈的技巧和艺术
    【Scala专栏】走进Scala
  • 原文地址:https://blog.csdn.net/qq_40268672/article/details/125559869