[Verilog系列] 使用状态机实现2进制补码器

一、基本概念

原码:用第一位表示符号,其余位表示值。

反码:正数的反码是其本身,负数的反码是符号位保持不变,其余位取反。

补码:正数的补码是其本身,负数的补码是在其反码的基础上+1。

二、题目要求

        设计一个单输入单输出串行的补码状态机。输入x 是连续的bit(每个时钟周期一位),从数据的最低有效位开始,而输出 z 是输入数据的补码。状态机将接受任意长度的输入数据,该电路需要异步复位, 转换在释放复位时开始,并在激活复位时停止。

               低位 ---> 高位

        例:x --> 0 0 0 1 0        

               z --> 0 0 0 1 1

三、思路分析

        根据题目要求,找到其中的规律,然后用状态机实现。

                低位 ---> 高位

        例:x --> 0 0 0        其反码 为 0 0 0,则其补码z如下

               z --> 0 0 0

               x --> 0 0 0 1     其反码为 1 1 1 0,则其补码为反码+1

               z --> 0 0 0 1

               x --> 0 0 0 1 0  其反码为 1 1 1 0 1,则其补码为反码+1

               z --> 0 0 0 1 1

               x --> 0 0 0 1 1  其反码为 1 1 1 0 0,则其补码为反码+1

               z --> 0 0 0 1 0

        我们从中可以找出规律,既数据从 0 开始时,则其补码输出也为 0 ,当出现第一个 1 时,

补码对应位输出为1。此后当输入为 0 ,则其对应位输出为 1;输入为 1 则其对应位输出为 0。

        可以得出Moore型和Mealy型状态机状态转换图,如下所示。

        Moore型状态机

         在状态为 F_ONE 或 ZERO 时,z 输出为 1,其余时刻输出为 0。

        Mealy型状态机        

 四、Verilog程序编写

        Moore型状态机

module top_module (
    input clk,
    input areset,
    input x,
    output z
); 
    parameter    IDLE     = 'b0001,
                        F_ONE = 'b0010,
                        ZERO   = 'b0100,
                        ONE     = 'b1000;
    reg [3:0] state,next_state;
    
    always@(posedge clk or posedge areset)
        if(areset)
            state <= IDLE;
        else
            state <= next_state;
    always@(*)
        case(state)
            IDLE    :    next_state <= (x)?F_ONE:IDLE;
            F_ONE:    next_state <= (x)?ONE:ZERO;
            ZERO  :    next_state <= (x)?ONE:ZERO;
            ONE    :    next_state <= (x)?ONE:ZERO;
            default :    next_state <= IDLE;
        endcase
    assign z = (state == F_ONE || state == ZERO);
endmodule
 

         Mealy型状态机

module top_module (
    input clk,
    input areset,
    input x,
    output z
); 
    
    parameter    A = 'b01,
                        B = 'b10;
    reg [1:0] state,next_state;
    
    always@(posedge clk or posedge areset)
        if(areset)
            state <= A;
        else
            state <= next_state;
    always@(*)
        case(state)
            A : next_state <= (x)?B:A;
            B : next_state <= B;
            default: next_state <= A;
        endcase
    
    assign z = ((state == A && x == 1'b1) || (state == B && x == 1'b0));
    
endmodule 

五、仿真结果 

        Moore型状态机

         Mealy型状态机

        仿真结果符合预期效果,实验成功。 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值