校招Verilog——一个周期算出所有高电平的个数
一、题目
在一个时钟周期内算出输入的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 种是百度而来的邪门法,一拍都不用,直接就出结果了;