利用补码的原理可以取出最低为1的位,其他位置零;
例如a=0101_1010,补码b=(~a+1)=1010_0110;
结果:c=a^b=0000_0010;
取最高位:
1、先取a的逆序a*;
2、c=(a*)^(~a*+1)
3、d=c*;对c取逆序
上代码:
`timescale 1ns/1ps
module highbit1();
reg clk;
reg rstn;
parameter perd = 20;
reg [5:0] din;
reg [5:0] dout_up;
reg [5:0] dout_down;
wire [5:0] dout_up_r;
reg [5:0] temp;
initial begin
rstn=1;
clk=1;
#20 rstn =0;
#20 rstn =1;
end
always #(perd/2) clk =~clk;
always @(posedge clk or rstn) begin
if(~rstn) begin
din<='b00000;
end
else begin
din<=$urandom%(1<<6);
end
end
integer i;
always @(*) begin
for (i=0;i<=5;i=i+1)
temp[i]=din[5-i];
end
assign dout_up_r = temp&(~temp+1'b1);
//assign dout_down = din&(~din+1'b1);
always @(*) begin
for (i=0;i<=5;i=i+1)
dout_up[i]=dout_up_r[5-i];
end
always @(*) begin
dout_down = din&(~din+1'b1);
end
endmodule
测试结果: