输出串行数据的二进制补码,复位控制开始/结束信号
首先介绍一下二进制补码,对于正数来说,原码=反码=补码,所以判断出来是正数,直接根据输入给出输出就行了。对于负数的话,补码=~(原码)+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)影响。