今天分享关于迭代电路的内容:
迭代电路中,需要对低位的内容的求解,并将答案提交到高位,高位利用地位的结果进行计算,并向更高位提交结果,从而获得最终的答案:
经典的迭代电路有串行加法器。
下面用一个奇校验器的例子进行说明:
module odd_checker(in,out,flag);
parameter n=8;
input [n-2:0]in;
output [n-1:0]out ;
output flag;
wire [n-1:0]tmp;
assign tmp={tmp[n-2:0]^in,1'b1};
assign flag=tmp[n-1];
assign out={tmp[n-1],in};
endmodule
这段verilog代码中:
核心在于assign tmp={tmp[n-2:0]^in,1'b1}这句
它会不断的迭代自身,从而获得最终的答案:
以in=7'b1000_111为例,讲解其具体步骤:
1:在第一布中,tmp的值是未定义的,所以为:7’bxxxx_xxx;它与1‘b1拼接赋值给了tmp,tmp为7’bxxxx_xx1(x与任何值异或仍然为x)。
2:在第二步时,此时tmp不全为x,因此在此次异或运算时,第七位得结果0,在将1‘b1拼接时,tmp为7’bxxxx_x01,
3:不断重复此步骤直至值被全部求解出来,在最后以为x被求解之后,tmp得值便固定下来,不会在发生变化。
4.是否需要添加1,取决与tmp得最高位,当为1时表示输入得1为偶数,需要添加1,从而满足奇校验器得要求
以下是仿真代码:
`timescale 1ns/1ps
module odd_checker_tb();
parameter n=8;
reg [n-2:0]in;
wire [n-1:0]out ;
wire flag;
odd_checker inst (
.in(in),
.out(out),
.flag(flag)
);
initial begin
in=7'b1110000;
#20
in=7'b1100000;
#20
in=7'b1111111;
#20
in=7'b0000111;
#20
in=7'b0011110;
#20
in=7'b0000000;
#20
$stop;
end
endmodule
我们经常使用得ASCII码就是一个7位数据,最高位位奇偶校验位得编码。
更多内容:参考斯坦福大学教授 威廉J.达利的数字设计系统方法中第八章,比较器一节内容。
2021/9/7
完