试题一
将下面这段 C 语言描述的串行处理过程,转换为单拍完成的并行处理,并用可综合的 Verilog 来描述。
unsigned char cal_table_high_first(unsigned char value)
{
unsigned char i;
unsigned char checksum = value;
for (i=8; i>0; --i)
{
if (checksum & 0x80)
checksum = (checksum << 1) ^ 0x31;
else
checksum = (checksum << 1);
}
return checksum;
}
分析:很明显有两个部分需要进行转换,一是将if-else语句去掉,二是将for循环去掉。
转换后的verilog只能单拍完成,所以存在两种结果:使用一条语句直接得出8bit结果;使用8条语句分别对8个bit进行计算。前者需要找出转换的规律,后者只有罗列8次循环便能得出结果。
去掉if-else语句可以从异或上分析,该位为1则进行异或即可改写为以下形式
checksum =( checksum<<1) ^ {2’b00,msb,msb,3’b000,msb};
当最高位为0时,异或不影响结果,当最高位为1时便是if-else的判断语句。
去掉for循环想了很久也没有找到规律,因此采用后者罗列方法得出结果。见下图:
<