题解 | #优先编码器电路①#
优先编码器电路①
https://www.nowcoder.com/practice/0594ed5303ad48a19aed90bc48839d00
本题的要求是优先编码,观察真值表可知,其输出值和输入值的0和1的位置有关,存在着阶梯状的关系,即随着1的增大,输出也在变化中,故本题的解题思路可以为探寻第一个0的位置,故只需采用并语句并结合for操作,即可实现查找0的位置,查找到以后需要进行for循环的退出,即采用disable,之后在beginend的顺序块中在执行case语句实现对0位置的对应输出 `timescale 1ns/1ns module encoder_0( input [8:0] I_n , output reg [3:0] Y_n ); reg I_n_temp; reg [3:0] posi_0; integer i; always@(I_n) begin I_n_temp = 1'b1; begin: find0 for(i = 8 ; i >= 0 ; i = i - 1) begin I_n_temp = I_n_temp & I_n[i]; if(!I_n_temp) //最好这个地方还是检测当轮的数据,防止出现低位0时直接结束而没有值的情况 begin posi_0 = i; disable find0; //注意这个的disable就是break,跳出当前循环,这个要注明跳出的是哪一个beginend,所以需要的是刚好包含for的那一个 end else posi_0 = 4'b1111; //这个地方是为了给默认值做的准备,其实其值只要不为那几个可选值就行 end end case(posi_0) 4'd0 : Y_n = 4'b1110; 4'd1 : Y_n = 4'b1101; 4'd2 : Y_n = 4'b1100; 4'd3 : Y_n = 4'b1011; 4'd4 : Y_n = 4'b1010; 4'd5 : Y_n = 4'b1001; 4'd6 : Y_n = 4'b1000; 4'd7 : Y_n = 4'b0111; 4'd8 : Y_n = 4'b0110; default : Y_n = 4'b1111; endcase end endmodule