题解 | #优先编码器电路①#

优先编码器电路①

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

全部评论
佬,这里disable为什么不能用break呢
点赞 回复 分享
发布于 2022-09-24 21:53 上海

相关推荐

06-03 15:32
点赞 评论 收藏
分享
吴offer选手:学到了,下次面试也放张纸在电脑上,不然老是忘记要说哪几个点
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务