"program alu8_16.abl 2023/5/17 DECLARATIONS clk pin 68; alu_f1,alu_f0,b_sel,oe pin 87..84; D7..D0 pin 24,23,26,25,28,27,30,29; Y7..Y0 pin 32..39; carry,zero pin 80,81; Acc_7..Acc_0 pin 77..70; B7..B0,A7..A0,a_sel node istype'com'; c8..c1,c0 node istype'com'; Acc7..Acc0 node istype'reg,keep'; alu_f=[alu_f1,alu_f0]; A=[A7..A0]; B=[B7..B0]; D=[D7..D0]; Y=[Y7..Y0]; Acc=[Acc7..Acc0]; EQUATIONS when b_sel then B=Acc; else B=[0,0,0,0,0,0,0,0]; when alu_f==[0,1] then {c0=1;a_sel=1;} when a_sel then A!=D; else A=D; Acc:=Y; Acc.CLK=clk; [Acc_7..Acc_0]=Acc; [Acc_7..Acc_0].oe=oe; when(alu_f==[0,0])#(alu_f==[0,1]) then { Y0=B0&A0&C0 # B0&!A0&!c0 # !B0&A0&!c0 # !B0&!A0&c0; Y1=B1&A1&C1 # B1&!A1&!c1 # !B1&A1&!c1 # !B1&!A1&c1; Y2=B2&A2&C2 # B2&!A2&!c2 # !B2&A2&!c2 # !B2&!A2&c2; Y3=B3&A3&C3 # B3&!A3&!c3 # !B3&A3&!c3 # !B3&!A3&c3; Y4=B4&A4&C4 # B4&!A4&!c4 # !B4&A4&!c4 # !B4&!A4&c4; Y5=B5&A5&C5 # B5&!A5&!c5 # !B5&A5&!c5 # !B5&!A5&c5; Y6=B6&A6&C6 # B6&!A6&!c0 # !B6&A6&!c6 # !B6&!A6&c6; Y7=B7&A7&C7 # B7&!A7&!c7 # !B7&A7&!c7 # !B7&!A7&c7; c1=B0&A0 # B0&c0 # A0&c0; c2=B1&A1 # B1&c1 # A1&c1; c3=B2&A2 # B2&c2 # A2&c2; c4=B3&A3 # B3&c3 # A3&c3; c5=B4&A4 # B4&c4 # A4&c4; c6=B5&A5 # B5&c5 # A5&c5; c7=B6&A6 # B6&c6 # A6&c6; c8=B7&A7 # B7&c7 # A7&c7; } when alu_f==[1,0] then Y=B&A; when alu_f==[1,1] then { Y0=B0#A0; Y1=B1#A1; Y2=B2#A2; Y3=B3#A3; Y4=B4#A4; Y5=B5#A5; Y6=B6#A6; Y7=B7#A7; } when (alu_f==[0,0]) then carry=c8; when (alu_f==[0,1]) then carry=!c8; when ([Y7..Y0]==^h00) then zero=1; END这段语言每一句的作用及原理
时间: 2023-08-16 14:06:56 浏览: 71
ALU.rar_32 alu_32 bit alu verilog_ALU. hdl 仿真器_alu_alu verilog
这段代码实现了一个 8 位或 16 位 ALU(算术逻辑单元)。以下是每一句话的作用和原理:
1. `program alu8_16.abl`:定义一个名为 `alu8_16` 的程序。
2. `2023/5/17`:日期。
3. `DECLARATIONS`:声明部分开始。
4. `clk pin 68`:定义一个名为 `clk` 的引脚,位于第 68 个引脚。
5. `alu_f1,alu_f0,b_sel,oe pin 87..84`:定义 4 个引脚,分别为 `alu_f1`、`alu_f0`、`b_sel` 和 `oe`,位于第 87 到 84 个引脚。
6. `D7..D0 pin 24,23,26,25,28,27,30,29`:定义 8 个引脚,分别为 `D7` 到 `D0`,位于第 24、23、26、25、28、27、30 和 29 个引脚。
7. `Y7..Y0 pin 32..39`:定义 8 个引脚,分别为 `Y7` 到 `Y0`,位于第 32 到 39 个引脚。
8. `carry,zero pin 80,81`:定义 2 个引脚,分别为 `carry` 和 `zero`,位于第 80 和 81 个引脚。
9. `Acc_7..Acc_0 pin 77..70`:定义 8 个引脚,分别为 `Acc_7` 到 `Acc_0`,位于第 77 到 70 个引脚。
10. `B7..B0,A7..A0,a_sel node istype'com'`:定义 16 个节点,分别为 `B7` 到 `B0` 和 `A7` 到 `A0`,以及 `a_sel`。
11. `c8..c1,c0 node istype'com'`:定义 9 个节点,分别为 `c8` 到 `c0`。
12. `Acc7..Acc0 node istype'reg,keep'`:定义 8 个寄存器,分别为 `Acc7` 到 `Acc0`。
13. `alu_f=[alu_f1,alu_f0]`:将 `alu_f1` 和 `alu_f0` 组合成一个名为 `alu_f` 的列表。
14. `A=[A7..A0]`:将 `A7` 到 `A0` 组合成一个名为 `A` 的列表。
15. `B=[B7..B0]`:将 `B7` 到 `B0` 组合成一个名为 `B` 的列表。
16. `D=[D7..D0]`:将 `D7` 到 `D0` 组合成一个名为 `D` 的列表。
17. `Y=[Y7..Y0]`:将 `Y7` 到 `Y0` 组合成一个名为 `Y` 的列表。
18. `Acc=[Acc7..Acc0]`:将 `Acc7` 到 `Acc0` 组合成一个名为 `Acc` 的列表。
19. `EQUATIONS`:方程部分开始。
20. `when b_sel then B=Acc; else B=[0,0,0,0,0,0,0,0];`:当 `b_sel` 为 1 时,将 `B` 的值设置为 `Acc` 的值,否则将 `B` 的值设置为 0。
21. `when alu_f==[0,1] then {c0=1;a_sel=1;}`:当 `alu_f` 等于 `[0,1]` 时,将 `c0` 的值设置为 1,将 `a_sel` 的值设置为 1。
22. `when a_sel then A!=D; else A=D;`:当 `a_sel` 为 1 时,将 `A` 的值设置为 `D` 和 `A` 的异或值,否则将 `A` 的值设置为 `D` 的值。
23. `Acc:=Y;`:将 `Y` 的值赋给 `Acc`。
24. `Acc.CLK=clk;`:将 `Acc` 的时钟设置为 `clk`。
25. `[Acc_7..Acc_0]=Acc;`:将 `Acc` 的值赋给 `Acc_7` 到 `Acc_0`。
26. `[Acc_7..Acc_0].oe=oe;`:将 `Acc_7` 到 `Acc_0` 的输出使能设置为 `oe`。
27. `when(alu_f==[0,0])#(alu_f==[0,1])`:当 `alu_f` 等于 `[0,0]` 或 `[0,1]` 时执行以下操作。
28. `{Y0=B0&A0&C0 # B0&!A0&!c0 # !B0&A0&!c0 # !B0&!A0&c0;`:计算 `Y0` 的值,根据公式 `B0&A0&C0`、`B0&!A0&!c0`、`!B0&A0&!c0` 和 `!B0&!A0&c0`。
29. `Y1=B1&A1&C1 # B1&!A1&!c1 # !B1&A1&!c1 # !B1&!A1&c1;`:计算 `Y1` 的值,根据公式 `B1&A1&C1`、`B1&!A1&!c1`、`!B1&A1&!c1` 和 `!B1&!A1&c1`。
30. `Y2=B2&A2&C2 # B2&!A2&!c2 # !B2&A2&!c2 # !B2&!A2&c2;`:计算 `Y2` 的值,根据公式 `B2&A2&C2`、`B2&!A2&!c2`、`!B2&A2&!c2` 和 `!B2&!A2&c2`。
31. `Y3=B3&A3&C3 # B3&!A3&!c3 # !B3&A3&!c3 # !B3&!A3&c3;`:计算 `Y3` 的值,根据公式 `B3&A3&C3`、`B3&!A3&!c3`、`!B3&A3&!c3` 和 `!B3&!A3&c3`。
32. `Y4=B4&A4&C4 # B4&!A4&!c4 # !B4&A4&!c4 # !B4&!A4&c4;`:计算 `Y4` 的值,根据公式 `B4&A4&C4`、`B4&!A4&!c4`、`!B4&A4&!c4` 和 `!B4&!A4&c4`。
33. `Y5=B5&A5&C5 # B5&!A5&!c5 # !B5&A5&!c5 # !B5&!A5&c5;`:计算 `Y5` 的值,根据公式 `B5&A5&C5`、`B5&!A5&!c5`、`!B5&A5&!c5` 和 `!B5&!A5&c5`。
34. `Y6=B6&A6&C6 # B6&!A6&!c0 # !B6&A6&!c6 # !B6&!A6&c6;`:计算 `Y6` 的值,根据公式 `B6&A6&C6`、`B6&!A6&!c6`、`!B6&A6&!c6` 和 `!B6&!A6&c6`。
35. `Y7=B7&A7&C7 # B7&!A7&!c7 # !B7&A7&!c7 # !B7&!A7&c7;`:计算 `Y7` 的值,根据公式 `B7&A7&C7`、`B7&!A7&!c7`、`!B7&A7&!c7` 和 `!B7&!A7&c7`。
36. `c1=B0&A0 # B0&c0 # A0&c0;`:计算 `c1` 的值,根据公式 `B0&A0`、`B0&c0` 和 `A0&c0`。
37. `c2=B1&A1 # B1&c1 # A1&c1;`:计算 `c2` 的值,根据公式 `B1&A1`、`B1&c1` 和 `A1&c1`。
38. `c3=B2&A2 # B2&c2 # A2&c2;`:计算 `c3` 的值,根据公式 `B2&A2`、`B2&c2` 和 `A2&c2`。
39. `c4=B3&A3 # B3&c3 # A3&c3;`:计算 `c4` 的值,根据公式 `B3&A3`、`B3&c3` 和 `A3&c3`。
40. `c5=B4&A4 # B4&c4 # A4&c4;`:计算 `c5` 的值,根据公式 `B4&A4`、`B4&c4` 和 `A4&c4`。
41. `c6=B5&A5 # B5&c5 # A5&c5;`:计算 `c6` 的值,根据公式 `B5&A5`、`B5&c5` 和 `A5&c5`。
42. `c7=B6&A6 # B6&c6 # A6&c6;`:计算 `c7` 的值,根据公式 `B6&A6`、`B6&c6` 和 `A6&c6`。
43. `c8=B7&A7 # B7&c7 # A7&c7; }`:计算 `c8` 的值,根据公式 `B7&A7`、`B7&c7` 和 `A7&c7`。
44. `when alu_f==[1,0] then Y=B&A;`:当 `alu_f` 等于 `[1,0]` 时,将 `Y` 的值设置为 `B` 和 `A` 的按位与结果。
45. `when alu_f==[1,1] then { Y0=B0#A0; Y1=B1#A1; Y2=B2#A2; Y3=B3#A3; Y4=B4#A4; Y5=B5#A5; Y6=B6#A6; Y7=B7#A7; }`:当 `alu_f` 等于 `[1,1]` 时,将 `Y0` 到 `Y7` 的值分别计算为 `B0` 异或 `A0`、`B1` 异或 `A1`、`B2` 异或 `A2`、`B3` 异或 `A3`、`B4` 异或 `A4`、`B5` 异或 `A5`、`B6` 异或 `A6` 和 `B7` 异或 `A7`。
46. `when (alu_f==[0,0]) then carry=c8;`:当 `alu_f` 等于 `[0,0]` 时,将 `carry` 的值设置为 `c8`。
47. `when (alu_f==[0,1]) then carry=!c8;`:当 `alu_f` 等于 `[0,1]` 时,将 `carry` 的值设置为 `c8` 的反值。
48. `when ([Y7..Y0]==^h00) then zero=1;`:当 `Y` 的值为 0 时,将 `zero` 的值设置为 1。
49. `END`:结束程序。
阅读全文