加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

异或应用实例(verilog)

(2013-07-15 12:04:28)
标签:

verilog

异或

编码

分类: 不敢说是技术

 

异或是一种基于二进制的位运算,用符号XOR或者 ^ 表示,其运算法则是对运算符两侧数的每一个二进制位,同值取0,异值取1。简单理解就是不进位加法,如:1+1=0,0+0=0,1+0=1。

性质:

1、交换律

2、结合律(即(a^b)^c == a^(b^c))

3、对于任何数x,都有x^x=0,x^0=x

4、自反性 A XOR B XOR B = A xor  0 = A

一些运算规则:

A^1 = ~A;

A^0 = A;

A^A = 0;A^~A=1;

按不进位加法理解这些就简单些了:对一位数加1就会一直取反,加0则不变。

以前转过两篇博文:异或^的几个应用异或的性质和运算提到了诸如加密、奇偶校验、分频等应用。最近碰到一段程序,用异或进行编码,所以把异或再拿出来温习一下,这个基本上要成为我最爱的操作符了。

大致程序如下:其中din的产生时钟为4m


reg dat_buf1=0;
reg dat_buf2=0;
always @(posedge clk8m)
begin
    dat_buf1 <= dat_buf1^~din;
    dat_buf2 <= dat_buf2^(din|dat_buf1);
end

编码的原理来自于运算规则A^1 = ~A;A^0 = A;即分别对din的0和1进行编码。这样也可以防止有连0和连1,便于传输和时钟恢复。

//解码程序


reg [1:0]decode_d=0;
always @(posedge clk8m)
begin
    decode_d[0] <= dat_buf2;
    decode_d[1] <= decode_d[0];
end
reg dout;
always @(negedge clk4m)
begin
    dout <= decode_d[1]^decode_d[0];
end

仿真图:

http://s6/middle/88c9ddc54e18610bfdad5&amp;690

0

阅读 收藏 喜欢 打印举报/Report
后一篇:闲来无事
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有