用Verilog实现数据的加法求和校验

在赛灵思FPGA中要实现一个20字节数据的加和校验,连同数据一起发送,校验字为单字节形式(取加和的低字节);因为数据是250US更新一次,发送速度是6us发一个字节,所以希望用最快的速度实现这20个字节的加法校验和运算;请问使用什么办法可以最快实现运算(忽略资源和功耗),我目前用的sum<=fifo0+fifo1+...+fifo19;这样的速度很慢,还有什么快速的代码写法?

代码如下,供参考。

reg [4:0] byte_cnt;
di; ///[159:0]
di_v; //bit, 是一个高电平脉冲,表示di的有效时刻。
do; //7:0
do_v; //bit
clk; //cycl 6us
d_chk;//[7:0] data to checksum
d_sum;//7:0]
always@(*)
case(byte_cnt[4:0])
5'd01: d_chk = di[( 0+1)*8-1 : 0*8];
5'd02: d_chk = di[( 1+1)*8-1 : 1*8];
....
5'd20: d_chk = di[(19+1)*8-1 :19*8];
default : d_chk = di[(00+1)*8-1 : 0*8];
endcase

// byte_cnt di_v
always@(posedge clk or negedge rst)
if (!rst)
byte_cnt <= 5'b0;
else if (di_v && byte_cnt == 5'b0)
byte_cnt <= 5'b1;
else if (byte_cnt > 5'd21)
byte_cnt <= 5'b0;
else
byte_cnt <= byte_cnt + 1'b1;

//do_v
always@(posedge clk or negedge rst)
if (!rst)
do_v <= 1'b0;
else if (byte_cnt != 5'b0)
do_v <= 5'b1;
else
do_v <= 1'b0;
//do
always@(posedge clk or negedge rst)
if (!rst)
do <= 7'b0;
else if (byte_cnt == 5'd21)
do_v <= d_sum;
else if (byte_cnt == 5'd0)
do <= 7'b0;
else
do_v <= d_chk;
//d_sum
always@(posedge clk or negedge rst)
if (!rst)
d_sum <= 7'b0;
else if (byte_cnt == 5'd0)
d_sum <= 7'b0;
else
d_sum <= d_sum + d_chk;
温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-03-04
sum<=fifo0^fifo^...^fifo19;追问

字节之间可以进行异或么???

追答

没问题啊,按位异或

本回答被提问者采纳
第2个回答  2014-03-04
你自己也不分析一下,这其实就是奇校验。。。这下知道咋做了吧!!
相似回答