惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

GbyAI
GbyAI
Martin Fowler
Martin Fowler
I
InfoQ
腾讯CDC
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
爱范儿
爱范儿
Microsoft Security Blog
Microsoft Security Blog
Google DeepMind News
Google DeepMind News
D
DataBreaches.Net
云风的 BLOG
云风的 BLOG
F
Fortinet All Blogs
N
Netflix TechBlog - Medium
博客园 - 聂微东
Microsoft Azure Blog
Microsoft Azure Blog
D
Docker
博客园 - 三生石上(FineUI控件)
Y
Y Combinator Blog
博客园 - Franky
Engineering at Meta
Engineering at Meta
B
Blog
罗磊的独立博客
Apple Machine Learning Research
Apple Machine Learning Research
Jina AI
Jina AI
V
Visual Studio Blog

博客园 - yf.x

超声波测距#倒车雷达#DE10-Lite 按键计数器#DE10-Lite 按键消抖#DE10-Lite 流水呼吸灯v2#DE10-Lite 流水呼吸灯-v1#DE10-Lite 呼吸灯-#DE10-Lite 流水灯#DE10-Lite#Verilog HDLBits_review 2015fsm 串行数据流输出其中的数据位-HDLbits 串行数据接收判断-HDLbits 输出PS2数据流-HDLbits PS2数据流检测状态机-HDLbits 独热码状态机-HDLbits 旅鼠4-HDLbits 旅鼠游戏3-HDLbits 旅鼠游戏2-HDLbits 旅鼠游戏--HDLbits 水库水位控制问题-HDLbits 康威生命游戏-hdlbits
补码FSM-HDLbits
yf.x · 2025-12-27 · via 博客园 - yf.x

使用Moore状态机实现对输入二进制数求其补码的操作。

题目要求:输入x是一个比特序列(每个时钟周期一位),从数字的最低位(LSB)开始,输出z是该数字的2的补码。数字长度任意。电路需要异步复位(areset)。转换在复位释放时开始,在复位断言时停止。

算法:对于补码,从LSB开始,直到遇到第一个1(包括这个1),输出与原码相同;第一个1之后的所有位,输出取反。

2的补码串行计算(LSB first)的Moore状态机通常有两种状态:一种表示还没有遇到第一个1(包括遇到了第一个1但还没有处理完进位),另一种表示已经处理了第一个1,之后只需取反。常见的设计是两个状态:状态0(输出等于输入)和状态1(输出等于输入的取反)。

状态转移和输出如下:

  • 状态A:输出 z=0。表示尚未遇到第一个1(包括当前输入为0的情况)。转移:若 x=0,保持在状态A;若 x=1,转移到状态B。
  • 状态B:输出 z=1。表示已遇到第一个1,且当前输出应为1。转移:若 x=0,保持在状态B(输出1);若 x=1,转移到状态C。
  • 状态C:输出 z=0。表示已遇到第一个1,且当前输出应为0。转移:若 x=0,转移到状态B(输出1);若 x=1,保持在状态C。

异步复位信号 areset将状态机重置为状态A。

module top_module (
input areset, // Asynchronous reset to state A
input clk,
input x,
output z
);

// 状态定义
parameter A = 2'b00,
B = 2'b01,
C = 2'b10;

reg [1:0] state, next_state;

// 状态寄存器(异步复位)
always @(posedge clk or posedge areset) begin
if (areset)
state <= A;
else
state <= next_state;
end

// 下一状态逻辑
always @(*) begin
case (state)
A: next_state = x ? B : A;
B: next_state = x ? C : B;
C: next_state = x ? C : B;
default: next_state = A;
endcase
end

// 输出逻辑(Moore型,仅取决于状态)
assign z = (state == B) ? 1'b1 : 1'b0;

endmodule