IC基础:找第一个1的位置

给定一个输入,求从最高位开始第一个1所在的位置,第一反应是用计数器寻找,那么怎么用组合逻辑在一个周期内完成呢?

二分译码

module first(
    input [7 : 0] din,
    output [3 : 0] pos
);
    wire d0, d1, d2;
    wire [3 : 0] temp0;
    wire [1 : 0] temp1;
    assign d0 = | din[7 : 4];
    assign temp0 = d0 ? din[7 : 4] : din[3 : 0];
    assign d1 = | temp0[3 : 2];
    assign temp1 = d1 ? temp0[3 : 2] : temp0[1 : 0];
    assign d2 = | temp1[1];
    assign pos = {d0, d1, d2};
endmodule

module tb_gcd_lcm();
    //===================parameter
    parameter PERIOD = 20;
    //===================defination
    reg clk, clkd, rst_n;
    reg [7 : 0] din;
    wire [2 : 0] pos;

    //===================logic
    initial begin
        rst_n = 0;
        #200 rst_n = 1;
    	#1500 $finish;
    end
    initial begin
        clk = 0;
        #3;
        forever #(PERIOD / 5) clk = ~clk;
    end
    initial begin
        clkd = 0;
        forever #(PERIOD / 2) clkd = ~clkd;
    end
    initial begin
        @(rst_n);
        @(posedge clk);
        din = 'd1;
        @(posedge clk);
        din = 8'b01101001;
        @(posedge clk);
        din = 8'b10000000;
    end

    //===================task


    //===================instance
    first(
        .din(din),
        .pos(pos)

    ); 
    
    
    `ifdef FSDB
initial begin
	$fsdbDumpfile("gcd_lcm.fsdb");
	$fsdbDumpvars;
    	$fsdbDumpMDA();
end
`endif
endmodule 

在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值