【verilog开发博客(二)】verilog实现找到最低位1(Least Significant One) 输入:一个固定位宽的二进制序列,例如0100_0100输出:一个同输入位宽的独热码,标记处最低位1(Least Significant One),例如0011_1100的输入,希望输出0000_0100的输出,以标记出最低位的1算法逻辑:因为输出是独热码,因此可以认为输入与某个值相与或相异或之后,可以得到独热码输出假设操作为 与则与输入相与的数据为XX00_01XX,X可为0也可为1,但是可以看到,重点是其他为1的部分必须为0,而原本为0的可以为1,那我可以先将输入取反得到1100_0011,但是要得到1100_01XX即可相与得到结果,那便+1即可,因此,可以得出结论:输入与其自身补码按位与,即可找到LSO;代码见ONE_HOT_LSO.v,因为是flop一拍输出,所以在波形里是错一拍对齐的。Tips:在GTKWave中查看波形时,可以将拉出的信号Ctrl+S存储位signal.gtkw文件,在代码更新后,要拉取同一文件的话,可以直接Ctrl+O读取该文件。module ONE_HOT_LSO#( parameter DW = 8 ) ( input clk, input rst_n, input [DW-1:0] din, output reg [DW-1:0] one_hot ); wire [DW-1:0] din_add_one = (~din+1); wire [DW-1:0] ont_hot_tmp = din din_add_one; always @(posedge clk or negedge rst_n) begin if(~rst_n) one_hot = 'b0; else one_hot = ont_hot_tmp; end endmoduletb_ONE_HOT_LSO.sv