数字IC手撕代码--投票表决器
生活随笔
收集整理的這篇文章主要介紹了
数字IC手撕代码--投票表决器
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目
設計一個投票表決器,輸入為一個5bit的向量,為1表示贊同,為0表示不贊同,當贊同人數大于非贊同人數時,表決器輸出為1,否則為0。
思路:一種方法是統計向量中1的個數,若大于等于3,則輸出1,否則輸出0。另一種方法是考慮所有可能的情況,事實上,只要有三個位的值為1,則表決器就輸出1,因此可據此進行枚舉(C53=10C_5^3=10C53?=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; elser1<=(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; elser2<=0; endmodule測試平臺
module test; logic clk; logic rst; logic [4:0] vote; logic r1; logic r2; logic error; //clk initial beginclk=0;forever#5 clk=~clk; end //rst initial beginrst=1;#100rst=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結果
總結
對于N輸入的表決器(N為奇數),我們同樣可以采用類似的方法:
1.通過加法器求1的個數,若和大于(N-1)/2,則輸出為1
2.枚舉這N個輸入的(N+1)/2組合(共CN(N+1)/2C_N^{(N+1)/2}CN(N+1)/2?項),然后將它們或起來。
總結
以上是生活随笔為你收集整理的数字IC手撕代码--投票表决器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 三人表决器程序c语言,“三人表决器”逻辑
- 下一篇: c#对Aspose.Word替换书签内容