1. 程式人生 > 實用技巧 >一個週期算出所有高電平的個數

一個週期算出所有高電平的個數

一、題目

  在一個時鐘週期內算出輸入的13路脈衝訊號中,高電平的個數。

二、程式碼

 1 //**************************************************************************
 2 // *** 描述 : 在一個時鐘週期內算出13路脈衝訊號為高電平的個數
 3 // *** 出處 : 特權《深入淺出》20頁
 4 //**************************************************************************
 5 
 6 module test
 7 //========================< 埠 >==========================================
8 ( 9 input wire clk , 10 input wire rst_n , 11 input wire [12:0] data , 12 output wire [15:0] num 13 ); 14 //========================< 訊號 >========================================== 15 reg [ 3
:0] i ; 16 17 /* 18 //========================================================================== 19 //== 1拍 疊加之前的num 20 //========================================================================== 21 always @(posedge clk or negedge rst_n) begin 22 if(!rst_n) begin
23 num = 0; 24 end 25 else begin 26 for(i=0;i<13;i=i+1) 27 if(data[i]) 28 num = num + 1; //注意是阻塞賦值 29 end 30 end 31 //========================================================================== 32 //== 1拍 不疊加之前的num 33 //========================================================================== 34 always @(posedge clk or negedge rst_n) begin 35 if(!rst_n) begin 36 num = 0; 37 end 38 else begin 39 num = 0; //注意清0 40 for(i=0;i<13;i=i+1) 41 if(data[i]) 42 num = num + 1; //注意是阻塞賦值 43 end 44 end 45 */ 46 //========================================================================== 47 //== 0拍 不疊加之前的num 48 //========================================================================== 49 assign num = data[12] + data[11] + data[10] + data[9] + 50 data[ 8] + data[ 7] + data[ 6] + data[5] + 51 data[ 4] + data[ 3] + data[ 2] + data[1] + data[0]; 52 53 endmodule

三、說明

1、第 1 種是特權《深入淺出》書中給出的辦法,計算的結果會不斷累加;

2、第 2 種是基於第 1 種方法的更改,計算的結果不會累加,更加符合題意;

3、第 3 種是百度而來的邪門法,一拍都不用,直接就出結果了;