Hdlbits-Q5: Serial two‘s complementer,补码状态机

输出串行数据的二进制补码,复位控制开始/结束信号

首先介绍一下二进制补码,对于正数来说,原码=反码=补码,所以判断出来是正数,直接根据输入给出输出就行了。对于负数的话,补码=~(原码)+1,即原码取反加1。

本题,限定了输入全为负数,所以对于一个二进制串行负数有:

原码: MSB 00110 | 100 LSB

反码: MSB 11001 | 011 LSB

补码: MSB 11001 | 100 LSB

可以发现,在原码的第一个1之后的高位,直接取反也是补码的高位,而前面的数据不变,所以我们计算负数的二进制补码关键在于:从低位开始,找到第一个1,1前的不变,1后的取反,即完成了补码计算。

下面开始做题:

一、Q5b mealy FSM

先做Q5b,Q5b需要用mealy状态机去写,且严格按照上述判断逻辑,即A阶段:找低位第一个1,B阶段:高位取反。输出则需要输入和状态结合判断。复位,开始开始结束信号同Q5a,异步复位reset=0开始,reset=1停止。

module top_module (
    input clk,
    input areset,
    input x,
    output z
); 
    parameter A=2'b01;
    parameter B=2'b10;

    reg [1:0] state;
    reg [1:0] next_state;
    //1:确定下一状态组合逻辑
    always @(*) begin
        if (!areset) begin
            next_state=A;
        end else begin
            case (state)
            A: next_state=(x==1)? B:A;
            B: next_state=B;
                default: next_state=next_state;
            endcase
        end
    end
    //2.状态转移时序逻辑
    always @(posedge clk or negedge areset) begin
        if (!areset) begin
            state<=A;
        end else begin
            state<=next_state;
        end
    end
    //3.组合逻辑输出
    always @(*) begin
        if (!areset) begin
            z=0;
        end else begin
            case (state)
                A: z=(x==1)? 1:0;
                B: z=(x==1)? 0:1;
                default: z=0;
            endcase
        end
    end
endmodule

一、Q5a moore FSM

你要设计一个单输入单输出串行2的补码器摩尔状态机。输入(x)是从数字的最低有效位开始的一系列位(每个时钟周期一位),输出(Z)是输入的二进制补码。这台机器将接受任意长度的输入数字。该电路需要异步复位。释放Reset时转换开始,置位Reset时转换停止。

对于这道题,因为要求用摩尔状态机,所以必须把z=1的状况归于一个状态,即从低位开始输入第一个1以及高位输出0(取反为1)的状况。那么很自然,由于输入从低位开始,那么第一个状态A则为:低位输入为0,最后一个状态C:高位取1,状态转移图如下:

module top_module (
    input clk,
    input areset,
    input x,
    output z
); 
    
    parameter A = 2'd0, B = 2'd1, C = 2'd2;
    reg	[1:0]	current_state;
    reg	[1:0]	next_state;
    
    always@(posedge clk or posedge areset)begin
        if(areset)begin
            current_state <= A;
        end
        else begin
            current_state <= next_state;
        end
    end
    
    always@(*)begin
        case(current_state)
            A:begin
                next_state = x ? B : A;
            end
            B:begin
                next_state = x ? C : B;
            end
            C:begin
                next_state = x ? C : B;
            end
            default:begin
                next_state = A;
            end
        endcase
    end
    
    assign z = current_state == B;
 
endmodule

对于这道题,还需要注意的有:rst信号作为起始和停止信号,那么它不能对数据输出有影响的(因为本人经常组合逻辑复位也会对输出进行复位),只能对状态变换(state与next_state)影响。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值