標(biāo)題: FPGA做的CPU指令運(yùn)算器,只有加減乘,沒(méi)有除,實(shí)驗(yàn)箱是DE2-115 [打印本頁(yè)]

作者: axeljs    時(shí)間: 2023-5-30 21:58
標(biāo)題: FPGA做的CPU指令運(yùn)算器,只有加減乘,沒(méi)有除,實(shí)驗(yàn)箱是DE2-115
設(shè)計(jì)一個(gè)簡(jiǎn)單的CPU指令運(yùn)算器,指令格式如下:
完成的具體功能定義如下:
(1) 操作類型1:將操作數(shù)1作為一個(gè)無(wú)符號(hào)二進(jìn)制數(shù),在七段管以十進(jìn)制顯示二進(jìn)制序列等效值。
(2) 操作類型2:實(shí)現(xiàn)操作數(shù)3、操作數(shù)4之間相加、減、乘的操作,在七段管以十/十六進(jìn)制進(jìn)制顯示操作數(shù)和結(jié)果。操作數(shù)3和4為BCD碼表示的2位十進(jìn)制數(shù)(表示的值為00-99)。
注意:
(1) 操作類型2中,減法邏輯中出現(xiàn)負(fù)數(shù),則顯示“-”,正數(shù)可以不顯示符號(hào)
(2) 操作類型2中,加、減、乘操作數(shù)和結(jié)果都用十進(jìn)制顯示,可以在七段管上進(jìn)行循環(huán)顯示來(lái)實(shí)現(xiàn)。
(3) 注意操作數(shù)3、4以BCD碼輸入,超過(guò)9的BCD碼輸出處理問(wèn)題。
(4) 嘗試加法運(yùn)算采用流水線方式實(shí)現(xiàn)。注意有效位數(shù)。
(5) 如果感覺(jué)七段管顯示能力弱,可以查詢LCD1602的控制模塊代碼,采用LCD顯示。
代碼:
  1. module zhiling(key,x2,x3,Hex0,Hex1,Hex2,Hex3,Hex4,Hex5,Hex6,Hex7,x);
  2. input [7:0] x2,x3;
  3. input key;
  4. reg[7:0] x1;
  5. input [1:0] x;//表示七段管的顯示模式
  6. output reg[6:0] Hex0,Hex1,Hex2,Hex3,Hex4,Hex5,Hex6,Hex7;
  7. reg[11:0] add;
  8. reg[7:0] sub;
  9. reg[13:0] mul;
  10. wire[7:0] n3,n2;
  11. integer flag;//符號(hào)標(biāo)志位
  12. //加法變量
  13. reg cout1,cout2;
  14. reg [6:0] fh;
  15. reg [3:0] low,low0,mid,mid0;
  16. reg [3:0] a1,a2,a3,a4;//乘法各位表達(dá)
  17. reg [3:0] t1,t2,t3;//x1的值
  18. reg [3:0] s1,s2;
  19. assign n2=x2[7:4]*10+x2[3:0];
  20. assign n3=x3[7:4]*10+x3[3:0];
  21. always@(*)
  22. begin
  23.    if(key==1)
  24.         begin
  25.    x1=x2;        
  26.    t1=x1%4'b1010;
  27.         t2=x1/4'b1010%4'b1010;
  28.         t3=x1/4'b1010/4'b1010;
  29.         end
  30. end
  31. //加法,二級(jí)流水線方式
  32. always@(*)
  33. begin
  34. {cout1,low0}=x2[3:0]+x3[3:0];
  35. if(cout1==1) begin low=low0+4'b0110; end
  36. else if(low0>9&&cout1==0) begin {cout1,low}=low0+4'b0110;end
  37. else begin low=low0;cout1=0;end
  38. end
  39. always@(*)
  40. begin
  41. {cout2,mid0}=x2[7:4]+x3[7:4]+cout1;
  42. if(cout2==1) begin mid=mid0+4'b0110; end
  43. else if(mid0>9&&cout2==0) begin {cout2,mid}=mid0+4'b0110;end
  44. else begin mid=mid0;cout2=0;end
  45. add={cout2,mid,low};
  46. end
  47. //減法
  48. always@(*)
  49. begin
  50. flag=0;
  51. if(n2>=n3) sub=n2-n3;
  52. else begin flag=1;sub=n3-n2;end
  53. fh=(flag==1)?7'b0111111:7'b1111111;
  54.    s1=sub%4'b1010;  
  55.         s2=sub/4'b1010;
  56. end
  57. //乘法
  58. always@(*)
  59. begin
  60.    mul=n2*n3;
  61.    a1=mul%4'b1010;  
  62.         a2=mul/4'b1010%4'b1010;
  63.         a3=mul/4'b1010/4'b1010%4'b1010;
  64.         a4=mul/4'b1010/4'b1010/4'b1010;
  65. end

  66. always@(x)
  67. begin
  68. case(x)
  69. 2'b00:begin {Hex2,Hex1,Hex0}={show(t3),show(t2),show(t1)};Hex3=7'b1111111;Hex4=7'b1111111;Hex5=7'b1111111;Hex6=7'b1111111;Hex7=7'b1111111;end
  70. 2'b01:begin {Hex7,Hex6}={show(x2[7:4]),show(x2[3:0])};{Hex5,Hex4}={show(x3[7:4]),show(x3[3:0])};
  71.                                 {Hex2,Hex1,Hex0}={show(add[11:8]),show(add[7:4]),show(add[3:0])};Hex3=7'b1111111;  end
  72. 2'b10:begin {Hex7,Hex6}={show(x2[7:4]),show(x2[3:0])};{Hex5,Hex4}={show(x3[7:4]),show(x3[3:0])};
  73.                                 {Hex2,Hex1,Hex0}={fh,show(s2),show(s1)};Hex3=7'b1111111;  end
  74. 2'b11:begin {Hex7,Hex6}={show(x2[7:4]),show(x2[3:0])};{Hex5,Hex4}={show(x3[7:4]),show(x3[3:0])};
  75.                                 {Hex3,Hex2,Hex1,Hex0}={show(a4),show(a3),show(a2),show(a1)};  end
  76. endcase
  77. end
  78. function [6:0]show;
  79.    input[3:0] a0;
  80.         reg[6:0] b;
  81.         begin
  82.         case(a0)
  83.   4'd0:b=7'b1000000;
  84.   4'd1:b=7'b1111001;
  85.   4'd2:b=7'b0100100;
  86.   4'd3:b=7'b0110000;
  87.   4'd4:b=7'b0011001;
  88.   4'd5:b=7'b0010010;
  89.   4'd6:b=7'b0000010;
  90.   4'd7:b=7'b1111000;  
  91.   4'd8:b=7'b0000000;
  92.   4'd9:b=7'b0011000;
  93. default:b=7'b1111111;
  94.         endcase
  95.         show=b;
  96.         end
  97.         endfunction
  98. endmodule
復(fù)制代碼
乘法:
將ope撥動(dòng)為”11”,實(shí)現(xiàn)兩個(gè)輸入之間相乘的操作,分別用四個(gè)撥動(dòng)開(kāi)關(guān)作為in1,in2輸入,輸出的十進(jìn)制數(shù)顯示在七段管上。


加法:
將ope撥動(dòng)為”01”,實(shí)現(xiàn)兩個(gè)輸入之間相加的操作,分別用四個(gè)撥動(dòng)開(kāi)關(guān)作為in1,in2輸入,輸出的十進(jìn)制數(shù)顯示在七段管上。


減法:
將ope撥動(dòng)為”10”,實(shí)現(xiàn)兩個(gè)輸入之間相減的操作,分別用四個(gè)撥動(dòng)開(kāi)關(guān)作為in1,in2輸入,輸出的十進(jìn)制數(shù)顯示在七段管上,若結(jié)果為負(fù)數(shù),則在前一位顯示’-’







歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1