一、基本概念
原码:用第一位表示符号,其余位表示值。
反码:正数的反码是其本身,负数的反码是符号位保持不变,其余位取反。
补码:正数的补码是其本身,负数的补码是在其反码的基础上+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型状态机
仿真结果符合预期效果,实验成功。