1.实现乘法25bit*18bit运算
\quad
由A端输入24bit数据,D端输入24bit数据,实现预加法。然后与B端输入的18bit数据实现乘法。最后P端输出。
\quad
使能模式匹配功能,与C端输入的数据匹配。
\quad
调用原语实现。
1.1. 参数配置
\quad
USE_DPORT = TRUE;
\quad
USE_MULT = MULTIPLY;
\quad
USE_SIMD = ONE48;乘法必须选择ONE48
\quad
MASK = 48‘h000000000000
\quad
SEL_MASK = MASK;
\quad
SEL_PATTERN = C;与C模式匹配
\quad
USE_PATTERN_DETECT = PATDET;使能模式匹配
\quad
AREG=2;BREG=2;A、B通道选择两级寄存器
\quad
ADREG=1;A、B预加法寄存器
\quad
MREG=1;由于用到了乘法器所以MREG必须为1
1.2. 端口输入
1) 位宽
\quad
A最大位宽25bit
\quad
B最大位宽18bit
\quad
D最大位宽25bit
\quad
预加法器输出位宽25bit
\quad
乘法器(MULT)输出位宽25X18bit
\quad
P输出位宽48bit
2) INMODE寄存器配置
\quad
INMODE[0] = 0;选择A2寄存器输出
\quad
INMODE[1] = 0;使能A路径输出
\quad
INMODE[2] = 1;使能D路径输出
\quad
INMODE[3] = 0;使能A+D运算
\quad
INMODE[4] = 0;选择B2寄存器输出
2)OPMODE寄存器配置
\quad
OPMODE[1:0] = 01;X MUL选择M寄存器输出OPMODE[3:2] 必须是01
\quad
OPMODE[3:2] = 01;Y MUL选择M寄存器输出OPMODE[1:0] 必须是01
\quad
OPMODE[6:4] = 000;Z MUL输出0
3)ALUMODE寄存器配置
\quad
ALUMODE[3:0] = 0000;选择Z+X+Y+CIN
\quad
在OPMODE选择X MUL、Y MUL都输出M寄存器值,而这里又选择X+Y,结果不是M寄存器值得2倍么?其实X+Y只加了M寄存器值的一部分。
4)CARRYINSEL寄存器配置
\quad
选择CARRYINSEL多路复用通道的输出通道
\quad
CARRYINSEL[2:0] = 000;选择CARRYIN
2.仿真结果
1)A、B、C、D、CIN
\quad
A =24’h2;
\quad
D =24’h3
\quad
B =18’h7;
\quad
C=48’h23;
\quad
CIN=0
\quad
P=(A+D)*B=35
\quad
PATTERNDETECT=1;模式匹配成功
2)A、B、D、CIN
\quad
A =24’h80_0000;
\quad
D =24’h80_0000;
\quad
B =18’h2_0000;
\quad
C=48’h23;
\quad
CIN=0
\quad
P=(A+D)*B=43’h200_0000_0000
\quad
PATTERNDETECT=0;模式匹配失败
3.参考
ug479
https://blog.csdn.net/Leo_9824/article/details/118707437?spm=1001.2014.3001.5502
https://download.csdn.net/download/Leo_9824/20255360?spm=1001.2014.3001.5503
4.工程链接:https://download.csdn.net/download/Leo_9824/21913526
环境:vivado2017.4