给定一个输入,求从最高位开始第一个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