haihongyuan.com

# EDA课程设计 四则运算

《电子设计自动化》

- 1 -

1 系统设计 ...................................... 3

2 单元电路设计 .................................. 5

3软件设计 ....................................... 6

4 系统测试 ..................................... 12

- 2 -

1、系统设计

1、系统设计思路：

2、总体方案的论证与比较

- 3 -

3、各功能块的划分与组成

- 4 -

4、系统的工作的原理

2、单元电路的设计

- 5 -

3、软件设计

1、总电路原理图

2、十进制模块程序（CNT10）

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

- 6 -

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY CNT10 IS

PORT (CLK : IN STD_LOGIC;

CQ : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);

COUT : OUT STD_LOGIC );

END CNT10;

ARCHITECTURE behav OF CNT10 IS

BEGIN

PROCESS(CLK)

VARIABLE CQI : STD_LOGIC_VECTOR(3 DOWNTO 0);

BEGIN

IF CLK'EVENT AND CLK='1' THEN

IF CQI < 9 THEN CQI := CQI + 1; --允许计数, 检测是否小于9

ELSE CQI := (OTHERS =>'0'); --大于9，计数值清零

END IF;

END IF;

IF CQI = 0 THEN COUT <= '1';

ELSE COUT <= '0';

END IF;

CQ <= CQI;

END PROCESS;

- 7 -

END behav;

3、输入十位数乘10模块程序（mulx10） LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY mulx10 IS

PORT(b:IN STD_LOGIC_VECTOR(3 DOWNTO 0); y:OUT STD_LOGIC_VECTOR(7 DOWNTO 0)); END mulx10;

ARCHITECTURE behave OF mulx10 IS

signal c0,c1,c2,c3:STD_LOGIC_VECTOR(3 DOWNTO 0); constant a:STD_LOGIC_VECTOR:="1010";

BEGIN

PROCESS(b,c0,c1,c2,c3)

BEGIN

IF b(0)='0' THEN c0<="0000";

IF b(1)='0' THEN c1<="0000";

IF b(2)='0' THEN c2<="0000";

IF b(3)='0' THEN c3<="0000"; ELSE c0<=a; ELSE c1<=a; ELSE c2<=a; ELSE c3<=a;

- 8 -

end if; end if; end if; end if;

y<=("0000"& c0)+("000"& c1&'0')+("00"& c2&"00")+('0'&c3&"000"); END PROCESS;

END behave;

y<=("0000"& c0)+("000"& c1&'0')+("00"& c2&"00")+('0'&c3&"000");

4、位数调整模块程序（yiwei3d6）

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

entity yiwei3d6 is

port( my_in1 : in std_logic_vector(3 downto 0); my_out : out std_logic_vector(7 downto 0));

end entity yiwei3d6;

architecture beh of yiwei3d6 is

begin

my_out(3 downto 0) <= my_in1(3 downto 0);

end architecture beh;

- 9 -

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

port( my_in1, my_in2 : in std_logic_vector(8 downto 0); my_out : out std_logic_vector(9 downto 0)); end entity add;

Signal a, b : std_logic_vector(9 downto 0);

begin

a <= '0'&my_in1;

b <= '0'&my_in2;

my_out <= a + b;

- 10 -

end architecture beh;

6、减法模块

Sub程序：

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

entity sub is

port( sub_in1, sub_in2 flag : in std_logic_vector(8 downto 0); : out std_logic; : out std_logic_vector(8 downto 0)); sub_out

end entity sub;

architecture beh of sub is

- 11 -

begin

process(sub_in1, sub_in2) begin if sub_in1>sub_in2 then flag <= '1'; sub_out <= sub_in1-sub_in2; else flag <= '0'; sub_out <= sub_in2-sub_in1; end if; end process;

end architecture beh;

7、乘法模块

- 12 -

8、除法模块

9、选择模块

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY CNT4 IS

PORT (CLK : IN STD_LOGIC;

CQ : OUT STD_LOGIC_VECTOR(1 DOWNTO 0); COUT : OUT STD_LOGIC );

END CNT4;

ARCHITECTURE behav OF CNT4 IS

BEGIN

PROCESS(CLK)

VARIABLE CQI : STD_LOGIC_VECTOR(1 DOWNTO 0);

- 13 -

BEGIN

IF CLK'EVENT AND CLK='1' THEN --检测时钟上升沿

IF CQI < 3 THEN CQI := CQI + 1; --允许计数, 检测是否小于3 ELSE CQI := (OTHERS =>'0'); --大于3，计数值清零

END IF;

END IF;

IF CQI = 0 THEN COUT <= '1'; --计数大于3，输出进位信号

ELSE COUT <= '0';

END IF;

CQ <= CQI; --将计数值向端口输出

END PROCESS;

END behav;

10、 输出模块

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY cal_mod IS

PORT(

add_out2 : IN STD_LOGIC_vector(9 downto 0); - 14 -

add_out1 : IN STD_LOGIC_vector(6 downto 0); add_out0 : IN STD_LOGIC_vector(3 downto 0); flag : IN STD_LOGIC; sub_out1 : IN STD_LOGIC_vector(8 downto 0); sub_out0

mul_out3

mul_out2

mul_out1

mul_out0

div_out1

div_out0

mod_sel

outLED1

outLED2

outLED3

outLED4

END cal_mod;

: IN STD_LOGIC_vector(3 downto 0); : IN STD_LOGIC_vector(17 downto 0); : IN STD_LOGIC_vector(9 downto 0); : IN STD_LOGIC_vector(6 downto 0); : IN STD_LOGIC_vector(3 downto 0); : IN STD_LOGIC_vector(8 downto 0); : IN STD_LOGIC_vector(3 downto 0); : IN STD_LOGIC_vector(1 downto 0); : out STD_LOGIC_vector(3 downto 0); : out STD_LOGIC_vector(3 downto 0); : out STD_LOGIC_vector(3 downto 0); : out STD_LOGIC_vector(3 downto 0)); - 15 -

ARCHITECTURE bhv OF cal_mod IS

BEGIN

when "01"=>outLED1<=(others=>'0'); outLED2<=(others=>(not flag));outLED3<=sub_out1(3 DOWNTO 0);outLED4<=sub_out0;

when "10"=>outLED1<=mul_out3(3 downto

0);outLED2<=mul_out2(3 downto 0);outLED3<=mul_out1(3 downto 0);outLED4<=mul_out0;

when others =>outLED1<=(others=> '0'); outLED2<=(others=> '0'); outLED3<=div_out1(3 downto 0); outLED4<=div_out0;

end case; end process;

end bhv;

4 系统测试

1、将制作好的的程序先进行编译，看是否能编译通过，若未通过，则进行修改直至编译通过。

2、编译通过后，可以进行波形仿真来观察其结果是否正确。

- 16 -

3、进行分配管脚，然后再编译一次后。

4、将编译通过的程序下载到硬件上进行结果验证。

5、硬件上结果验证的操作步骤

（1）、本次我采用了模式0作为演示的模式来验证本次设计。

（2）、根据管脚分配和模式0，键7—a1、键6—a0，键5—b1、键4—b0、键3—clk_mod

（3）、随机按键输入87和26，则可在数码管上显示113，按键3改变加法、减法、乘法、除法模式。当模式为减法时，其结果为61；当模式为乘法时，其结果为2262；当模式为除法模式时，其结果为3.

5、结论

- 17 -

6、参考文献

《EDA技术与VHDL语言》第3版 潘松，黄继业编著 清华大学出版社

- 18 -