回覆列表
  • 1 # 艾羅cym

    LIBRARYIEEE; USEIEEE.STD_LOGIC_1164.ALL; USEIEEE.std_logic_arith.all; USEIEEE.std_logic_unsigned.all;---呼叫常用的庫 ENTITYadd8bIS PORT( clk:INSTD_LOGIC;---時鐘訊號 cin:INSTD_LOGIC;---相加進位訊號 a,b:INSTD_LOGIC_VECTOR(7DOWNTO0);-----兩個8位的二進位制數 s:OUTSTD_LOGIC_VECTOR(7DOWNTO0);----輸出 cout:OUTSTD_LOGIC); END; ARCHITECTUREchengOFadd8bIS SIGNALadda1,adda2,addb1,addb2,reg1a,reg1b,add1,add2:STD_LOGIC_VECTOR(4DOWNTO0); SIGNALreg2:STD_LOGIC_VECTOR(3DOWNTO0); SIGNALcin1:STD_LOGIC; BEGIN PROCESS(clk) BEGIN IFclk"EVENTANDclk="1"THEN adda1<="0"&a(3DOWNTO0);----adda1是a的低4位 addb1<="0"&b(3DOWNTO0);-----addb1是b的低4位 adda2<="0"&a(7DOWNTO4);------adda2是a的高4位 addb2<="0"&b(7DOWNTO4);------addb2是b的高4位 cin1<=cin; ENDIF; ENDPROCESS; PROCESS(CLK) BEGIN IFclk"EVENTANDclk="1"THEN add1<=adda1+addb1+cin1;---低4位相加放入add1注意考慮是否有進位 reg1a<=adda2; reg1b<=addb2; ENDIF; ENDPROCESS; PROCESS(CLK) BEGIN IFclk"EVENTANDclk="1"THEN----高4位相加,考慮低4位相加的進位 add2<=reg1a+reg1b+add1(4); reg2<=add1(3DOWNTO0); ENDIF; ENDPROCESS; s<=add2(3DOWNTO0)&add1(3DOWNTO0);----結果是高四位與低四位並置 cout<=add2(4);---是否有進位 ENDcheng; 第二個只需要搞清二進位制數的乘法原理就可以了兩個4位二進位制數相乘,如a=1010,b=1111那麼可以看成是1010*(1000+0100+0010+0001),結果等於將1010左移三位加上1010左移兩位,加上1010左移1位加上1010不移位 就是結果 y<=("0000"&c0)+("000"&c1&"0")+("00"&c2&"00")+("0"&c3&"000"); 第一個是不移動第二個是b低二位與a相乘左移1位第三是b低3位與a相乘左移兩位,第四是b最高位與a相乘左移三位結果相加

  • 中秋節和大豐收的關聯?
  • 凡士林的作用?