16位除8位有符号数的VHDL设计
基于VHDL的8位除法器的实现
基于VHDL的8位除法器的实现The Design of 8 Division With VHDL摘要:介绍了利用VHDL实现八位除法,采用层次化设计,给出了实现除法的子模块程序。
使用Altera公司的MAX+PLUSII10.2开发软件进行功能仿真并给出仿真波形。
关键词:二进制除法 VHDL MAX+PLUS2Abstract:The design of division(8/8) by hierarchy technique is proposed. Schematic documents and submodule program with VHDL language are also given. At the end of the article, using MAX+PLUS2, the flow char is given and the simulation result is attached.Keywords: division VHDL MAX+PLUS2引言除法是数值计算和数据分析中最常用的运算之一,许多高级运算如平方根、指数、三角函数等都与其有关。
在FPGA中,有加、减、乘、除的算法指令,但除法中除数必须是2的幂,因此无法实现除数为任意数的除法。
本文用VHDL编写了除法运算,可实现任意八位数的除法。
除法器的设计本文所采用的除法原理是:对于八位无符号被除数A,先对A转换成高八位是0低八位是A的数C,在时钟脉冲的每个上升沿C向左移动一位,最后一位补零,同时判断C的高八位是否大于除数B,如是则C的高八位减去B,同时进行移位操作,将C的第二位置1。
否则,继续移位操作。
经过八个周期后,所得到的C的高八位为余数,第八位为商。
从图(1)可清楚地看出此除法器的工作原理。
此除法器主要包括比较器、减法器、移位器、控制器等模块。
1、比较模块设计中所用的八位比较器是由两个四位比较器级联而成的。
VHDL十六进制
VHDL 设计一个十六进制计数器一、实验目的1.进一步了解VHDL设计方法2.熟悉数码管和LED的显示二、实验所用仪器及元器件1、计算机2、Quartus II 7.2 (32-Bit)软件3、EP2C5实验箱三、实验内容(1)、设计一个十六进制计数器,用一个数码管、8个彩灯循环显示计数状态。
(2)、有清零信号控制,按下后从零开始。
四、设计思路与过程根据实验要求,需要实现在拨码开关或者按键的控制下实现十六进制计数器。
首先,确定输入输出变量:输入:拨码开关a:清零;时钟clk::提供有效时钟沿;输出SEL-LED:8维向量b:连接8个发光二极管。
输出SEL-DATA :8维向量b:连接8个发光二极管。
其次,确定电路工作状态因为要实现计数十六进制计数器,所以首先要实现在时钟控制下实现计数;还要考虑到清零信号;再次,实现对计术状态的表示;也就是让计数状态用数码管和LED显示出来。
具体程序如下:五、VHDL程序LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;ENTITY count16 ISPORT(CLK5 :IN STD_LOGIC;RST :IN STD_LOGIC;SEG_SEL :OUT STD_LOGIC_VECTOR(2 DOWNTO 0);SEG_DA :OUT STD_LOGIC_VECTOR(7 DOWNTO 0);LED :OUT STD_LOGIC_VECTOR(7 DOWNTO 0));END count16;ARCHITECTURE BEHA VE OF count16 ISSIGNAL SHIFT_CNT,TEMP :STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL CNT_V ALUE :STD_LOGIC_VECTOR(3 DOWNTO 0);BEGINPROCESS(CLK5)BEGINIF RST='1' THEN TEMP <="0000";ELSIF CLK5'EVENT AND CLK5='1' THENIF TEMP="1111" THENTEMP <="0000";ELSETEMP<=TEMP+1;END IF;END IF;END PROCESS;SHIFT_CNT<=TEMP;SEG_SEL<="000";PROCESS(SHIFT_CNT)BEGINCASE SHIFT_CNT ISWHEN "0000" => SEG_DA<=x"3F";LED<="00000001";WHEN "0001" => SEG_DA<=x"06";LED<="00000010";WHEN "0010" => SEG_DA<=x"5B";LED<="00000100";WHEN "0011" => SEG_DA<=x"4F";LED<="00001000";WHEN "0100" => SEG_DA<=x"66";LED<="00010000";WHEN "0101" => SEG_DA<=x"6D";LED<="00100000";WHEN "0110" => SEG_DA<=x"7D";LED<="01000000";WHEN "0111" => SEG_DA<=x"07";LED<="10000000";WHEN "1000" => SEG_DA<=x"7F";LED<="00000001";WHEN "1001" => SEG_DA<=x"6F";LED<="00000010";WHEN "1010" => SEG_DA<=x"77";LED<="00000100";WHEN "1011" => SEG_DA<=x"7C";LED<="00001000";WHEN "1100" => SEG_DA<=x"39";LED<="00010000";WHEN "1101" => SEG_DA<=x"5E";LED<="00100000";WHEN "1110" => SEG_DA<=x"79";LED<="01000000";WHEN "1111" => SEG_DA<=x"71";LED<="10000000";END CASE;END PROCESS;END BEHA VE;六、实验 QuarterII原理图:七、仿真波形八、故障及问题分析本次实验整体比较顺利,但仍旧出现了一个个问题:开始时引脚分配有问题,没有找到与EP2C5有关的引脚,后来找到了。
基于FPGA的16阶FIR数字滤波器的设计
基于FPGA的16阶FIR数字滤波器的设计作者:王香张莉莉来源:《电子世界》2013年第16期【摘要】本文是利用Altera提供的DSP Builder开发工具从Simulink模型自动生成VHDL 代码的一种FPGA设计方法来实现一个16阶FIR数字低通滤波器,设计出的滤波器用于线性调制的相干解调中。
通过对设计的电路进行验证和仿真,结果表明电路工作正确可靠,能满足设计要求。
【关键词】FPGA;DSP Builder;FIR数字低通滤波器;相干解调1.引言信号的数字滤波在图像处理、语音识别、模式识别等数字信号处理中都占有要的地位。
与模拟滤波器相比,数字滤波器可以满足滤波器幅度和相位特性的严格要求,可以克服模拟滤波器所无法克服的电压漂移、温度漂移和噪声等问题。
根据数字滤波器冲激响应函数的时域特性,可将数字滤波器分为无限长冲激响应(IIR)滤波和有限长冲激响应(FIR)滤波器两种。
由于FIR系统只有零点、系统稳定,便于实FFT算法、运算速度快、线性相位的特性和设计更为灵活等突出优点而在工程实际中得广泛应用。
在复杂运算中,FPGA的处理速度表现了很好的优势,而且FPGA开发周期短且编程灵活,易于反复擦写,算法实现不受DSP之类固件性能的限制。
本文研究了基于FPGA的16阶数字低通滤波器硬件电路的实现方法。
设计出的16阶FIR 数字低通滤波器用于线性调制中的相干解调(也叫同步解调)来实现对原始信号的恢复。
2.本设计利用的基本原理及设计指标的选择2.1 相干解调的基本原理在线性调制中,设调制信号m(t)=sinω1t,载波为cosωct,则已调信号:Sm(t)=m(t)cosωct将已调信号乘上一个同频同相的载波,得:χ(t)=Sm(t)cosωct=m(t)(cosωct)2 =0.5m(t)+0.5m(t)cos2ωct由上式可知,用一个低通滤波器可以将第一项与第二项分离,从而恢复出原始的调制信号,这种方法称为同步解调或相干解调。
VHDL八位数码扫描显示电路设计
八位数码管显示电路VHDL语言实现八位数码管显示电路,很多初学者对进程(process)的概念很模糊,可以查一下先关资料,里面的参数是如何规定的,进程如何使用。
libraryieee;use ieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entityscan_led isport(clk:std_logic;--时钟seg:outstd_logic_vector(7 downto 0);--段显示控制(abcdefg)scan:outstd_logic_vector(7 downto 0));--数码管地址选择控制end;architecture one of scan_led issignal cnt8:integer range 0 to 7;signaldata:integer range 0 to 15;begin----------扫描数码管地址计数器process(clk)beginifclk'event and clk='1' thencnt8<=cnt8+1;end if;end process;-----------数码管地址扫描process(cnt8)begincase cnt8 iswhen 0=>scan<="00000001";data<=1;when 1=>scan<="00000010";data<=2;when 2=>scan<="00000100";data<=4;when 3=>scan<="00001000";data<=5;when 4=>scan<="00010000";data<=7;when 5=>scan<="00100000";data<=9;when 6=>scan<="01000000";data<=13;when 7=>scan<="10000000";data<=15;when others=>null;end case;end process;-----------7段译码process(data)begincase data is ---abcdefg when 0=>seg<="11111100"; when 1=>seg<="01100000"; when 2=>seg<="11011010"; when 3=>seg<="11110010"; when 4=>seg<="01100110"; when 5=>seg<="10110110"; when 6=>seg<="10111110"; when 7=>seg<="11100000"; when 8=>seg<="11111110"; when 9=>seg<="11110110"; when 10=>seg<="11101110"; when 11=>seg<="00111110"; when 12=>seg<="10011100"; when 13=>seg<="01111010"; when 14=>seg<="10011110"; when 15=>seg<="10001110"; when others=>null;end case;end process;end;。
VHDL八位数码管频率计课程设计
5、时钟源。
五、功能模块和信号仿真图以及源程序(1) 系统时钟分频及控制的功能模块图及其源程序图2 功能模块图作用:将试验箱上的50MHz的晶振分频,输出CLOCK为数码管提供1kHz的动态扫描频率。
CNT_EN输出为0.05s的信号,对频率计中的32位十进制计数器CNT10的ENA使能端进行同步控制,当TSTEN高电平时允许计数,低电平时停止计数,并保持其所计的脉冲数。
在停止计数期间,首先需要一个锁存信号LOAD的上跳沿将计数器在前一秒的计数值锁存进锁存器REG32B中,并由外部的十进制7段数码管显示计数值。
设置锁存器的好处是数据显示稳定,不会由于周期性的清零信号而不断闪烁。
锁存信号后,必须有一个清零信号RST_CNT对计数器进行清零,为下一秒的计数操作做准备。
该模块的信号仿真图如下:图3 仿真波形图源程序如下:--分频library ieee;use ieee.std_logic_1164.all;entity fdivwangzheng isport(clk0:in std_logic; --输入系统时钟clk1:out std_logic; --输出1hz时钟信号clk2:out std_logic); --输出显示扫描时钟信号end fdivwangzheng;architecture a of fdivwangzheng isbeginp1:process(clk0)variable cnt:integer range 0 to 49999999; --分频系数为24999999variable ff:std_logic;beginif clk0'event and clk0='1' thenif cnt<49999999 thencnt:=cnt+1;elsecnt:=0;ff:=not ff; --反向end if;end if;clk1<=ff;end process p1;p2:process(clk0)variable cnn:integer range 0 to 999; --分频系数为499variable dd:std_logic;beginif clk0'event and clk0='1' thenif cnn<999 thencnn:=cnn+1;elsecnn:=0;dd:=not dd; --反向end if;end if;clk2<=dd;end process p2;end a;--测频控制器(testctl.vhd)LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY TESTCTLwanzheng ISPORT ( CLKK : IN STD_LOGIC; -- 1HzCNT_EN,RST_CNT,LOAD : OUT STD_LOGIC);END TESTCTLwanzheng;ARCHITECTURE behav OF TESTCTLwanzheng ISSIGNAL DIV2CLK : STD_LOGIC;BEGINPROCESS( CLKK )BEGINIF CLKK'EVENT AND CLKK = '1' THEN DIV2CLK <= NOT DIV2CLK;END IF;END PROCESS;PROCESS (CLKK, DIV2CLK)BEGINIF CLKK='0' AND Div2CLK='0' THEN RST_CNT <= '1';ELSE RST_CNT <= '0'; END IF;END PROCESS;LOAD <= NOT DIV2CLK ; CNT_EN <= DIV2CLK;END behav;(2) 十进制计数器的功能模块图及其源程序图4 功能模块图作用:当使能端为高电平,清零端为低电平时,实现十进制计数功能。
基于VHDL的8位除法器的实现
基于VHDL的8位除法器的实现The Design of 8 Division With VHDL摘要:介绍了利用VHDL实现八位除法,采用层次化设计,给出了实现除法的子模块程序。
使用Altera公司的MAX+PLUSII10.2开发软件进行功能仿真并给出仿真波形。
关键词:二进制除法 VHDL MAX+PLUS2Abstract:The design of division(8/8) by hierarchy technique is proposed. Schematic documents and submodule program with VHDL language are also given. At the end of the article, using MAX+PLUS2, the flow char is given and the simulation result is attached.Keywords: division VHDL MAX+PLUS2引言除法是数值计算和数据分析中最常用的运算之一,许多高级运算如平方根、指数、三角函数等都与其有关。
在FPGA中,有加、减、乘、除的算法指令,但除法中除数必须是2的幂,因此无法实现除数为任意数的除法。
本文用VHDL编写了除法运算,可实现任意八位数的除法。
除法器的设计本文所采用的除法原理是:对于八位无符号被除数A,先对A转换成高八位是0低八位是A的数C,在时钟脉冲的每个上升沿C向左移动一位,最后一位补零,同时判断C的高八位是否大于除数B,如是则C的高八位减去B,同时进行移位操作,将C的第二位置1。
否则,继续移位操作。
经过八个周期后,所得到的C的高八位为余数,第八位为商。
从图(1)可清楚地看出此除法器的工作原理。
此除法器主要包括比较器、减法器、移位器、控制器等模块。
1、比较模块设计中所用的八位比较器是由两个四位比较器级联而成的。
VHDL 16
VHDL 16*16点阵本实验主要完成汉字字符在LED 上的显示,16*16 扫描LED 点阵的工作原理与8 位扫描数码管类似,只是显示的方式与结果不一样。
本实验的示例程序依次显示的是“湖南工程学院”,要求每隔一秒换下一个字显示。
源程序(带注释)library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity dzh is --建立实体dzh port( clk:in std_logic;r,c:out std_logic_vector(15 downto 0)); --两个输出信号end;architecture two of dzh is --建立结构体two type states is(st0,st1,st2,st3,st4,st5); --定义六个状态signal cs,ns:states:=st0;signal count:integer range 0 to 999:=0;begina1:process(clk)variable s:std_logic_vector(3 downto 0):="0000";beginif clk'event and clk='1' thens:=s+1;if cs=st0 thencase s is --“湖”字的显示when "0000" =>r<=not"0000000000000001";c<=not"0111111111111111";when "0001" =>r<=not"0000000000000010";c<=not"1011111011100000";when "0010" =>r<=not"0000000000000100";c<=not"1100111011101110";when "0011" =>r<=not"0000000000001000";c<=not"1111100000101110";when "0100" =>r<=not"0000000000010000";c<=not"1111111011101110";when "0101" =>r<=not"0000000000100000";c<=not"1111111011100000";when "0110" =>r<=not"0000000001000000";c<=not"0011100000101110";when "0111" =>r<=not"0000000010000000";c<=not"1100101110101110";when "1000" =>r<=not"0000000100000000";c<=not"1111101110100000";when "1001" =>r<=not"0000001000000000";c<=not"1111101110101110";when "1010" =>r<=not"0000010000000000";c<=not"1111101110101110";when "1011" =>r<=not"0000100000000000";c<=not"1110101110101110";when "1100" =>r<=not"0001000000000000";c<=not"1101100000101110";when "1101" =>r<=not"0010000000000000";c<=not"1011111111101110";when "1110" =>r<=not"0100000000000000";c<=not"0111111111011100";when "1111" =>r<=not"1000000000000000";c<=not"1111111111111111";when others =>null;end case;elsif cs=st1 thencase s is --“南”字的显示when "0000" =>r<=not"0000000000000001";c<=not"1111111111111111";when "0001" =>r<=not"0000000000000010";c<=not"1111111110111111";when "0010" =>r<=not"0000000000000100";c<=not"1111111101111111";when "0011" =>r<=not"0000000000001000";c<=not"1100000000000111";when "0100" =>r<=not"0000000000010000";c<=not"1111111011111111";when "0101" =>r<=not"0000000000100000";c<=not"1111110111111111";when "0110" =>r<=not"0000000001000000";c<=not"1100000000000111";when "0111" =>r<=not"0000000010000000";c<=not"1101101110110111";when "1000" =>r<=not"0000000100000000";c<=not"1101110101110111";when "1001" =>r<=not"0000001000000000";c<=not"1101100000110111";when "1010" =>r<=not"0000010000000000";c<=not"1101111011110111";when "1011" =>r<=not"0000100000000000";c<=not"1101000000010111";when "1100" =>r<=not"0001000000000000";c<=not"1101111011110111";when "1101" =>r<=not"0010000000000000";c<=not"1101111011100111";when "1110" =>r<=not"0100000000000000";c<=not"1111111111111111";when "1111" =>r<=not"1000000000000000";c<=not"1111111111111111";when others =>null;end case;elsif cs=st2 thencase s is --“工”字的显示when "0000" =>r<=not"0000000000000001";c<=not"1111111111111111";when "0001" =>r<=not"0000000000000010";c<=not"1111111111111111";when "0010" =>r<=not"0000000000000100";c<=not"1111111111111111";when "0011" =>r<=not"0000000000001000";c<=not"1100000000000111";when "0100" =>r<=not"0000000000010000";c<=not"1111111011111111";when "0101" =>r<=not"0000000000100000";c<=not"1111111011111111";when "0110" =>r<=not"0000000001000000";c<=not"1111111011111111";when "0111" =>r<=not"0000000010000000";c<=not"1111111011111111";when "1000" =>r<=not"0000000100000000";c<=not"1111111011111111";when "1001" =>r<=not"0000001000000000";c<=not"1111111011111111";when "1010" =>r<=not"0000010000000000";c<=not"1111111011111111";when "1011" =>r<=not"0000100000000000";c<=not"1111111011111111";when "1100" =>r<=not"0001000000000000";c<=not"1100000000000111";when "1101" =>r<=not"0010000000000000";c<=not"1111111111111111";when "1110" =>r<=not"0100000000000000";c<=not"1111111111111111";when "1111" =>r<=not"1000000000000000";c<=not"1111111111111111";end case;elsif cs=st3 thencase s is --“程”字的显示when "0000" =>r<=not"0000000000000001";c<=not"1111111111111111";when "0001" =>r<=not"0000000000000010";c<=not"1111111111111111";when "0010" =>r<=not"0000000000000100";c<=not"1111110110000011";when "0011" =>r<=not"0000000000001000";c<=not"1100001110111011";when "0100" =>r<=not"0000000000010000";c<=not"1111011110000011";when "0101" =>r<=not"0000000000100000";c<=not"1111011111111111";when "0110" =>r<=not"0000000001000000";c<=not"1000000100000001";when "0111" =>r<=not"0000000010000000";c<=not"1110001111101111";when "1000" =>r<=not"0000000100000000";c<=not"1101010111101111";when "1001" =>r<=not"0000001000000000";c<=not"1101011010000011";when "1011" =>r<=not"0000100000000000";c<=not"1111011111101111";when "1100" =>r<=not"0001000000000000";c<=not"1111011111101111";when "1101" =>r<=not"0010000000000000";c<=not"1111011100000001";when "1110" =>r<=not"0100000000000000";c<=not"1111111111111111";when "1111" =>r<=not"1000000000000000";c<=not"1111111111111111";when others =>null;end case;elsif cs=st4 thencase s is --“学”字的显示when "0000" =>r<=not"0000000000000001";c<=not"1111111111111111";when "0001" =>r<=not"0000000000000010";c<=not"1111011011110111";when "0010" =>r<=not"0000000000000100";c<=not"1111101101101111";when "0011" =>r<=not"0000000000001000";c<=not"1111111111111111";when "0100" =>r<=not"0000000000010000";c<=not"1110000000000011";when "0101" =>r<=not"0000000000100000";c<=not"1110111111111011";when "0110" =>r<=not"0000000001000000";c<=not"1101110000010111";when "0111" =>r<=not"0000000010000000";c<=not"1111111111011111";when "1000" =>r<=not"0000000100000000";c<=not"1111111100111111";when "1001" =>r<=not"0000001000000000";c<=not"1111111101111111";when "1010" =>r<=not"0000010000000000";c<=not"1111100000001111";when "1011" =>r<=not"0000100000000000";c<=not"1111111101111111";when "1100" =>r<=not"0001000000000000";c<=not"1111111101111111";when "1101" =>r<=not"0010000000000000";c<=not"1111111001111111";when "1110" =>r<=not"0100000000000000";c<=not"1111111111111111";when "1111" =>r<=not"1000000000000000";c<=not"1111111111111111";when others =>null;end case;elsif cs=st5 thencase s is --“院”字的显示when "0000" =>r<=not"0000000000000001";c<=not"1111111110111111";when "0010" =>r<=not"0000000000000100";c<=not"1011010000000001";when "0011" =>r<=not"0000000000001000";c<=not"1011010111111101";when "0100" =>r<=not"0000000000010000";c<=not"1010101111111011";when "0101" =>r<=not"0000000000100000";c<=not"1001111100001111";when "0110" =>r<=not"0000000001000000";c<=not"1010011111111111";when "0111" =>r<=not"0000000010000000";c<=not"1011010000000011";when "1000" =>r<=not"0000000100000000";c<=not"1011011101101111";when "1001" =>r<=not"0000001000000000";c<=not"1000111101101111";when "1010" =>r<=not"0000010000000000";c<=not"1011111101101111";when "1011" =>r<=not"0000100000000000";c<=not"1011111011101101";when "1100" =>r<=not"0001000000000000";c<=not"1011110111100001";when "1101" =>r<=not"0010000000000000";c<=not"1011111111111111";when "1110" =>r<=not"0100000000000000";c<=not"1111111111111111";when "1111" =>r<=not"1000000000000000";c<=not"1111111111111111";when others =>null;end case;else null;end if;end if;end process a1;a2:process(clk) --下一状态的转换beginif clk'event and clk='1' thenif count<999 thencount<=count+1;else count<=0;case cs iswhen st0=>ns<=st1;when st1=>ns<=st2;when st2=>ns<=st3;when st3=>ns<=st4;when st4=>ns<=st5;when st5=>ns<=st0;when others=>ns<=st0;end case;end if;end if;end process a2;a3:process(clk) --当前状态的转换beginif clk'event and clk='1' thencs<=ns;end if;end process a3;end architecture;。
vhdl语言的除法用法 -回复
vhdl语言的除法用法-回复问题:VHDL语言的除法用法。
引言:VHDL(VHSIC Hardware Description Language)是一种用于描述和设计数字电路的硬件描述语言。
它允许工程师使用基于文本的编程语言来描述硬件系统的行为和结构。
VHDL提供了丰富的语法和功能,可以用于实现各种电路设计中的数学运算,包括除法运算。
在本文中,我们将详细介绍VHDL语言中除法的用法,并提供一步一步的指导。
一、VHDL除法运算的语法:在VHDL中,进行除法运算的语法是通过使用除法运算符“/”来实现的。
一般的除法运算形式为“被除数/ 除数= 商”,这是VHDL中执行除法运算的基础形式。
二、VHDL除法运算的数据类型:在VHDL中,除法运算可以在不同的数据类型之间进行。
常见的数据类型包括整型(integer)、浮点型(real)等。
三、VHDL除法运算的实例:为了更好地理解VHDL中除法运算的用法,我们来看一个简单的实例。
假设我们要计算两个32位无符号整数的除法运算。
首先,我们需要声明两个32位无符号整数类型的输入信号A和B,以及一个32位无符号整数类型的输出信号Q(商):signal A, B : unsigned(31 downto 0);signal Q : unsigned(31 downto 0);然后,我们可以通过使用VHDL的除法运算符“/”来进行除法运算:Q <= A / B;最后,我们需要在VHDL程序中引入相关的包(libraries):library ieee;use ieee.std_logic_1164.all;use ieee.numeric_std.all;四、VHDL除法运算的注意事项:在进行VHDL除法运算时,我们需要注意以下几个要点。
1. 被除数和除数的类型必须匹配,即它们必须是相同的数据类型。
如果不匹配,我们需要进行类型转换操作。
2. 在进行整数类型的除法运算时,需要使用整数类型的除法运算符“/”。
8位十六进制频率计的设计
实验二利用VHDL实现8位十六进制频率计一、实验目的1)掌握更复杂的原理层次化设计和数字系统设计方法;2)完成8位16进制频率计的设计。
二、实验内容在Quartus II上利用VHDL设计出一个8位的十六进制的频率计,分别设计出频率计的各个模块。
三、实验仪器1)计算机及操作系统;2)QuartusII软件。
四、实验原理根据频率的定义和频率测量的基本原理,测定信号的频率必须有一个脉冲宽度为1秒的输入信号脉冲计数允许的信号;1秒计数结束后,计数值锁入锁存器的锁存信号并为下一测频计数周期做准备的计数器清0信号。
这3个信号可以由一个测频控制信号发生器产生,即TESTCTL。
TESTCTL的计数是能信号CNT_EN能产生一个1秒脉宽的周期信号,并对频率计的每一计数器CNT10的ENA是能端进行同步控制。
当CNT_EN高电平时允许计数;低电平时停止计数,并保持其所计的脉冲数。
在停止计数期间,首先需要一个锁存信号LOAD的上跳沿将计数器在前1秒钟的计数值锁存进个锁存器REG4B 中,并由外部的7段译码器译出,显示计数值。
设置锁存器的好处是数据显示稳定,不会由于周期性的清0信号而不断闪烁。
锁存信号后,必须有一清0信号RST_CNT对计数器进行清零,为下1秒的计数操作作准备。
数字频率计的关键组成部分包括一个测频控制信号发生器、一个计数器和一个锁存器,另外包含外电路的信号整形电路、脉冲发生器、译码驱动电路和显示电路。
工作原理:系统正常工作时,脉冲信号发生器输入1Hz的标准信号,经过测频控制信号发生器的处理,2分频后即可产生一个脉宽为1秒的时钟信号,以此作为计数闸门信号。
测量信号时,将被测信号通过信号整形电路,产生同频率的矩形波,输入计数器作为时钟。
当计数闸门信号高电平有效时,计数器开始计数,并将计数结果送入锁存器中。
设置锁存器的好处是显示的数据稳定,不会由于周期性的清零信号而不断闪烁。
最后将锁存的数值由外部的七段译码器译码并在数码管上显示。
8路数据选择器、16位奇偶检验器的设计.
课程设计报告(理工类)课程名称: EDA技术专业班级:电子科学与技术102 学生学号: 050210109 学生姓名:江杰所属院部:物电学院指导教师:顾涵20 12 ——20 13 学年第 1 学期设计项目名称:8位数据选择器与16位奇偶校验器设计同组学生姓名:张海军、贺旌、蒋宁洲实验地点:力行楼203 设计成绩:批改教师:批改时间:一、设计目的和要求1.课程设计目的本实验课程的目的,旨在通过上机实验自己进行EDA设计,使学生加深理解EDA技术的基本方法,帮助和培养学生建立利用原理图和硬件描述语言进行电路设计的基本方法和利用EDA工具软件(MAX+plusⅡ)设计简单数字电子系统的能力,为以后从事有关数字电子系统方面的设计和研究开发工作打下基础。
2.课程设计的基本要求1、通过课程设计使学生能熟练掌握一种EDA软件(MAXPLUS2)的使用方法,能熟练进行设计输入、编译、管脚分配、下载等过程。
2、通过课程设计使学生能利用EDA软件(MAXPLUS2)进行至少一个电子技术综合问题的设计(内容可由老师指定或自由选择),设计输入可采用图形输入法或AHDL硬件描述语言输入法。
3、通过课程设计使学生初步具有分析、寻找和排除电子电路中常见故障的能力。
4、通过课程设计使学生能独立写出严谨的、有理论根据的、实事求是的、文理通顺的字迹端正的课程设计报告。
3.课程设计类型EDA技术VHDL程序设计二、仪器和设备计算机,MAX+plusⅡ软件三、设计过程1.设计内容和要求a).设计一个八选一数据选择器,同时每一个输入端口又由3个二进制位组成,输出端口是从前八个端口选择一个由3个二进制位组成的端口。
b).设计一个16位奇偶校验器,对输入的信号进行统计奇数或者偶数的数量。
将其奇偶校验的结果输出,若为奇数个 1 输出为高电平;若为偶数个1输出为低电平2.设计方法和开发步骤a).方法:查阅相关资料,找到对于一个四选一数据选择器和8位奇偶校验器的介绍,运用类比的方法写出设计所需要的程序。
VHDL-实验
计算机科学与技术学院实验报告(学年度第学期)课程名称EDA技术实验姓名学号专业计算机班级地点教师实验一:八位二进制补码一.实验目的1.熟悉Max+PlusII和GW48EDA开发系统的使用;2.掌握八位二进制补码的VHDL设计;3.元件例化语句的使用。
二.实验原理若原码为正,则补码等于原码;若原码为负,则补码为(2+原码)mod2。
三.八位二进制补码程序LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY JACKAN ISPORT(rst:IN STD_LOGIC;din:IN STD_LOGIC_VECTOR(7 DOWNTO 0);dout:OUT STD_LOGIC_VECTOR(7 DOWNTO 0));END ENTITY JACKAN;ARCHITECTURE HAIXIA OF JACKAN ISSIGNAL tmp:STD_LOGIC_VECTOR(6 DOWNTO 0);BEGINPROCESS(din,rst)BEGINIF rst='0' THENdout<=(OTHERS=>'0');ELSIF din(7) ='1' THENFOR i IN 0 TO 6 LOOPtmp(i)<=NOT din(i);END LOOP;dout(6 DOWNTO 0) <= tmp+1;dout(7) <= din(7);ELSEdout<= din;END IF;END PROCESS;END ARCHITECTURE HAIXIA;四.实验结果五.总结8位二进制补码:寄存器主要用来存储8位二进制数据。
高8位为符号位,不进行求反运算。
余下7位根据高8位的数据状态进行相应操作。
实验二.一位全减器的VHDL设计一. 实验目的1.熟悉Max+PlusII和GW48EDA开发系统的使用;2.掌握一位半减器的VHDL设计;3.掌握一位半减器构建一位全减器的方法;二.实验原理由两个半减器和一个或门构成一个全减器。
VHDL任意整数的分频器的设计(从1到任意位).docx
1、按键去抖电路的设计、按键电路常用的非编码键盘,每个键都是一个常开开关电路计数器输入脉冲最好不要直接接普通的按键开关, 因为记数器的记数速度非 常快,按键、触点等接触时会有多次接通和断开的现象。
我们感觉不到,可是记 数器却都记录了下来。
例如,虽然只按了 1下,记数器可能记了 3下。
因此,使 用按键的记数电路都会增加单稳态电路避免记数错误。
P1.0P1.1P1.2 P1.3、按键消抖通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,电压信号小 型如下图。
由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接 通,在断开时也不会一下子断开。
因而在闭合及断开的瞬间均伴随有一连串的抖 动,如下图。
抖动时间的长短由按键的机械特性决定,一般为5ms- 10ms 这是一 个很重要的时间参数,在很多场合都要用到。
按键稳定闭合时间的长短则是由操作人员的按键动作决定的 ,一般为零点几 秒至数秒。
键抖动会引起一次按键被误读多次。
为确保CPU 寸键的一次闭合仅作 一次处理,必须去除键抖动。
在键闭合稳定时读取键的状态,并且必须判别到键释 放稳定后再作处理。
按键的抖动,可用硬件或软件两种方法。
AT89S51VCC丄2 3 4、硬件消抖在键数较少时可用硬件方法消除键抖动。
下图所示的RS触发器为常用的硬~1 1~无弹跳件去抖图中两个“与非”门构成一个RS触发器。
当按键未按下时,输出为1;当键按下时,输出为0。
此时即使用按键的机械性能,使按键因弹性抖动而产生瞬时断开(抖动跳开B),中要按键不返回原始状态A,双稳态电路的状态不改变,输出保持为0,不会产生抖动的波形。
也就是说,即使B点的电压波形是抖动的,但经双稳态电路之后,其输出为正规的矩形波。
这一点通过分析RS触发器的工作过程很容易得到验证。
利用电容的放电延时,采用并联电容法,也可以实现硬件消抖:四、软件延时消抖如果按键较多,常用软件方法去抖,即检测出键闭合后执行一个延时程序产生5ms- 10ms的延时,让前沿抖动消失后再一次检测键的状态,如果仍保持闭合状态电平,则确认为真正有键按下。
基于VHDL的8位模型计算机的设计与实现
摘要随着计算机在人们生活中重要性和不可或缺性的提高,为了更方便的为大众使用,发展计算机性能成为IT行业的热点,但计算机的部结构极其复杂,为了便于研究便产生了模型计算机。
本文完成了基于VHDL的8位模型计算机的设计与实现。
文中首先阐述了8位模型计算机的原理,然后对其十个功能模块〔算术逻辑运算单元,累加器,控制器,地址寄存器,程序计数器,数据寄存器,存储器,节拍发生器,时钟信号源,指令寄存器和指令译码器进行了分析与设计。
最后在Quartus II 9.0环境下进行了仿真,完成了8位模型计算机的整体实现。
本文综合了计算机组成原理和数字逻辑与系统设计的知识,设计的8位模型计算机能更方便的了解计算机部构造和工作原理。
整个系统的开发体现了在Quartus II软件平台上用VHDL设计数字控制系统的实用性。
关键词:8位模型机; Quartus II ;VHDL语言AbstractWith the improvement of importance and indispensability in computer in people's life,in order to use more conveniently for public ,computer performance is becoming a hot in the IT industry development.but the internal structure of the computer is very complicate,Computer model simplifies the difficulty of the research.This article completed the design and implementation of eight model computer based on VHDL.First ,this article expounds the principle of eight model computer,then divides it into 10 modules<arithmetic logic unit, accumulator, controllers, address register, the program counter and data registers, memory, beat generator, a clock signal, instruction register and instruction decoder>and analyse and design each of them.Finally under the environment of the Quartus II 9.0 simulation, completed overall implementation of the 8 model computer. The analysis and design of the eight model computer integrated the knowledge of computer constitute principle and Digital logic and system design. The design of the eight model computer can be more convenient to understand internal structure and working principle.The whole system development manifests the practicability of designing the numerical control system on the Quartus II software platform with VHDL.Key words:eight model computer ; VHDL language; Quartus II目录1 绪论11.1 本课题研究的目的11.2 本课题研究的背景及意义12 基于VHDL编程的基础知识32.1 VHDL语言概述32.2 VHDL的设计流程 (4)2.3 有关Quartus II 的介绍52.4 本课题基于Quartus II的设计流程73 基于VHDL8位模型机的原理与设计73.1 模型计算机的原理73.2 模型机的总体设计要求83.3 模型机逻辑框图的设计83.3 模型机的指令系统设计83.4 模型机的指令执行流程设计83.5 基于VHDL8位模型机各模块的设计与实现 (10)3.5.1 算术逻辑单元ALU模块103.5.2 累加器模块113.5.3 控制器模块123.5.4 节拍发生器143.5.5 指令寄存器模块IR和指令译码器163.5.6 时钟产生器173.5.7 程序计数器模块183.5.8 地址寄存器MAR203.5.9 存储器RAM213.5.10 数据寄存器DR224 基于VHDL的8位模型计算机的实现234.1 基于VHDL的微程序执行流程图234.2 8位模型机的顶层原理图设计244.3 基于VHDL的8位模型机工作流程244.4 顶层VHDL源程序设计254.4.1 头文件cpu_defs的VHDL设计254.4.2 CPU的VHDL源程序设计264.5 8位模型机的整体实现34结论34致 35参考文献36附录A 英文原文.......................................... 错误!未定义书签。
05第6章 VHDL设计应用实例(8位加法器的设计)
第6章 VHDL设计应用实例•6.1 8位加法器的设计实验一:8位加法器的设计• 1. 实验目的• (1) 学习MAX+plus 软件的基本使用方法。
• (2) 学习实验开发系统的基本使用方法。
• (3) 了解VHDL程序的基本结构。
• 2. 实验内容•设计并调试好一个由两个4位二进制并行加法器级联而成的8位二进制并行加法器,并用EDA实验开发系统进行硬件验证。
• 3. 实验要求• (1) 画出系统的原理框图,说明系统中各主要组成部分的功能。
• (2) 编写各个VHDL源程序。
• (3) 根据选用的软件编好用于系统仿真的测试文件。
• (4) 根据选用的软件及EDA实验开发装置编好用于硬件验证的管脚锁定文件。
• (5) 记录系统仿真、硬件验证结果。
• (6) 记录实验过程中出现的问题及解决办法。
实验连线全加器的17个输入所对应的管脚同17位拨码开关相连,16个输入管脚是a0~a7、b0~b7,其中a0~a7、b0~b7代表两个8位二进制数,cin代表低八位来的进位位;9个输出所对应的管脚同9位发光二极管相连,9个输出管脚是sum0~sum7和cout:其中sum0~sum7代表相加结果,cout代表进位位。
000000001111111110000000011111110100000000......00000001 (1)00000000000000001111111111111111101111111011111110000000000......00000001 000000000000000000CoutS8(7..0)A8(7..0)B8(7..0)C in实验结果输入8位加法器的设计过程• 1.设计思路•加法器是数字系统中的基本逻辑器件,减法器和硬件乘法器都可由加法器来构成。
多位加法器的构成有两种方式:并行进位和串行进位。
并行进位加法器设有进位产生逻辑,运算速度较快;串行进位方式是将全加器级联构成多位加法器。
vhdl语言的除法用法
VHDL语言的除法用法1.引言在硬件描述语言(HD L)中,V HD L是一种广泛使用的工业标准。
它提供了一种描述数字电路行为的方法。
V HDL语言强大而灵活,能够很好地支持多种数字逻辑设计需求。
本文将探讨V HD L语言中除法的用法,介绍如何在V HD L代码中实现除法功能。
2.除法的基本概念除法是一种基本的数学运算,用于将一个数(被除数)分成若干等分(除数)。
在数字电路设计中,除法运算常常涉及到位操作和时序控制。
V H DL语言提供了一种方便的方法来描述和实现除法操作。
3. VH DL语言中的除法操作3.1整数除法在V HD L语言中,整数除法可以通过使用`/`操作符来实现。
例如,假设我们要计算被除数A除以除数B的商C:C<=A/B;需要注意的是,这种整数除法会直接截断小数部分,只保留整数部分。
如果想要保留小数部分,可以使用浮点数类型。
3.2浮点数除法V H DL语言也支持浮点数除法。
浮点数除法可以通过使用`rea l`或`r ea lt yp e`类型来实现。
以下是一个示例:s i gn al A,B,C:re al;...C<=A/B;在进行浮点数的除法运算时,VH DL会保留小数部分,并将其存储在指定的信号中。
3.3时序控制在进行除法运算时,特别是在时序控制电路中,需要考虑时钟信号和状态机的操作。
例如,可以使用V HD L中的进程(pr oc es s)语句结合时钟信号和状态机来实现除法运算的时序控制。
p r oc es s(cl k)b e gi ni f ri si ng_e dg e(clk)th eni f re se t='1't he n--复位...e l se--进行除法运算...e n di f;e n di f;e n dp ro ce ss;通过结合时钟信号和状态机,可以实现对除法运算的精确控制和同步操作。
4.除法的应用场景除法运算在数字电路设计中有很多应用场景。
16位双译码器的VHDL实现
16位双译码器的VHDL实现软件:Quartus ii 8.1设计思路:先设计一个2-4译码器,在2-4译码器的基础上设计一个8-256双译码器,然后在8-256双译码器的基础上设计出16-65536双译码器。
双译码器需要与门阵列,而且与门阵列的设计才是此次设计的难点。
为简化设计,与门阵列单独设计,本文先设计了4*4的与门阵列,然后将4*4的与门阵列扩展成4*16的与门阵列,然后又将4*16的与门阵列扩展成16*16的与门阵列,然后又将16*16的与门阵列扩展成了16*256的与门阵列,最后又将16*256的与门阵列扩展成了256*256的与门阵列。
首先,先设计一个2-4译码器,代码如下:library ieee;use ieee.std_logic_1164.all;entity decoder2to4 isport(en:in std_logic;x:in std_logic_vector(1 downto 0);y:out std_logic_vector(3 downto 0));end decoder2to4;architecture rtl of decoder2to4 isbeginprocess(en,x)beginif(en='1')thencase x iswhen "00" => y<="0001";when "01" => y<="0010";when "10" => y<="0100";when "11" => y<="1000";when others => y<="0000";end case;elsey<="0000";end if;end process;end rtl;由2-4译码器扩展得到4-16双译码器需要用到4*4的与门阵列,所以需要设计一个4*4的与门阵列,代码如下:library ieee;use ieee.std_logic_1164.all;entity and4mul4 isport(x:in std_logic_vector(3 downto 0);y:in std_logic_vector(3 downto 0);z:out std_logic_vector(15 downto 0));end and4mul4;architecture structure of and4mul4 is component and2to1port(a,b: in std_logic;y: out std_logic);end component;beging1:for i in 3 downto 0 generateu1:and2to1 port map (x(0),y(i),z(i));end generate;g2:for i in 3 downto 0 generateu2:and2to1 port map (x(1),y(i),z(4+i));end generate;g3:for i in 3 downto 0 generateu3:and2to1 port map (x(2),y(i),z(8+i));end generate;g4:for i in 3 downto 0 generateu4:and2to1 port map (x(3),y(i),z(12+i));end generate;end structure;其中,与门and2to1的代码如下:library ieee;use ieee.std_logic_1164.all;entity and2to1 isport(a,b: in std_logic;y: out std_logic);end and2to1;architecture rtl of and2to1 isbeginprocess(a,b)variable comb : std_logic_vector(1 downto 0);begincomb := a & b;case comb iswhen "00" => y <= '0';when "01" => y <= '0';when "10" => y <= '0';when "11" => y <= '1';when others => y <= 'X';end case;end process;end rtl;由2-4译码器及4*4的与门阵列,扩展成4-16双译码器,代码如下:library ieee;use ieee.std_logic_1164.all;entity dec4to16 isport(en:in std_logic;x:in std_logic_vector(1 downto 0);y:in std_logic_vector(1 downto 0);z:out std_logic_vector(15 downto 0));end dec4to16;architecture structure of dec4to16 iscomponent decoder2to4port(en:in std_logic;x:in std_logic_vector(1 downto 0);y:out std_logic_vector(3 downto 0));end component;component and4mul4port(x:in std_logic_vector(3 downto 0);y:in std_logic_vector(3 downto 0);z:out std_logic_vector(15 downto 0));end component;signal c1:std_logic_vector(3 downto 0);signal c2:std_logic_vector(3 downto 0);beginu1:decoder2to4 port map(en,x,c1);u2:decoder2to4 port map(en,y,c2);u3:and4mul4 port map(c1,c2,z);end structure;然后,为了将4-16双译码器扩展成8-256双译码器,需要16*16的与门阵列。
16位ALUVHDL实现源程序
思考题:编写十六位运算器的VHDL程序——MYALU实验任务:用CPT16 的扩展实验板上的开关K3 、K2、K1、K0做为输入、八段数码管LED0..LED3做为输出,用VHDL语言编写程序,下载到EP1C6中,实现十六位模型机的MY ALU 功能见下表。
实验说明:在MY ALU.VHD程序设计中,定义A 为16位累加器,其值由K3 、K2 两组开关输入;W 为16位工作寄存器,其值由K1、K0 两组开关共输入;S2、S1、S0 为运算功能控制位,接在K4开关的第2、1、0个开关上,根据S2、S1、S0 的不同,MY ALU 实现不同功能D为运算结果输出,显示在四位八段管LED3..LED0上;CIn 为进位输入,由K4 开关组的第3 个开关输入;COut 为进位输出,用发光二极管L0 显示其状态。
逻辑功能:library ieee; ------库程序包调用use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity asanxia is ------实体:电路外观配置port(inA : IN UNSIGNED(15 DOWNTO 0); -- K3, K2 inAinW : IN UNSIGNED(15 DOWNTO 0); -- K1, K0 inWoutLED : OUT STD_LOGIC_VECTOR(15 DOWNTO 0); -- LED3~LED0 outLEDinC : IN STD_LOGIC_VECTOR(2 DOWNTO 0); --Control Input inCCin:IN STD_LOGIC; --C Input k4.3 CinCout: OUT STD_LOGIC -- C Output L0 Cout);end asanxia;architecture arch of asanxia is ------结构体:电路功能描述--中间变量signal c:std_logic_vector(15 downto 0); --暂存进位信号signal q:UNSIGNED(15 downto 0); --暂存各位数值beginprocess(inC,inA,inW,Cin)begincase inC iswhen "000"=> ------加法:A+B ;A+B+1q(0)<=inA(0)xor inW(0)xor Cin;c(0)<=(inA(0) and inW(0))or (inW(0)and Cin)or (inA(0)and Cin);--inA(0),inW(0),Cin有两个以上为1即产生进位。
分别使用原理图和VHDL语言输入方法设计8位全加器
分别使用原理图和VHDL语言输入方法设计8位全加器大庆石油学院课程设计2006年9 月12 日大庆石油学院课程设计任务书课程硬件课程设计题目分别使用原理图和VHDL语言输入方法设计8位全加器专业计算机科学与技术姓名孟庆军学号040702140408主要内容、基本要求、主要参考资料等一、主要内容:利用EDA-V型实验系统、微机和Maxplus-II软件系统,分别使用原理图和VHDL语言输入方法设计8位全加器。
要求利用层次设计方法,首先设计1位半加器,仿真和测试成功后把它保存到元件库中去;之后以1位半加器为底层元件设计1位全加器,仿真和测试成功后把它也保存到元件库中去;最后以1位全加器为基本元件,设计8位全加器的顶层文件,进行仿真和测试。
二、基本要求:1、熟练掌握EDA软硬件系统的使用方法。
2、设计出8位全加器,精通原理图输入方法,初步学会使用VHDL语言输入方法。
3、学会功能仿真和时序仿真。
大庆石油学院硬件课程设计4、按照规范写出论文,要求字数在4000字以上,并进行答辩。
论文内容包括概述(学习、调研、分析、设计的内容摘要)、EDA技术的现状和发展趋势、对EDA_V型实验系统和MaxplusII软件的掌握程度、8位全加器设计过程(包括原理图或程序设计、编译、仿真分析、硬件测试的全过程),论文中含有原理图、程序、仿真波形图及其分析报告。
三、主要参考资料:[1] 潘松.EDA技术实用教程[M].北京:科学出版社,2003.11-13.[2] 杨恒.FPGA/CPLD最新实用技术指南[M].北京:清华大学出版社, 2005.20-22.[3] EDA先锋工作室.Altera FPGA/CPLD设计(基础篇)[M].北京:人民邮电出版社2005.32-33.[4] 求是科技.CPLD/FPGA应用开发技术与工程实践[M].北京:人民邮电出版社2005. 55-58.[5] 潘松.SOPC技术实用教程[M] .清华大学出版社.2005.1-15.完成期限第28周指导教师专业负责人年月日大庆石油学院课程设计成绩评价表指导教师:年月日摘要本文介绍了利用EDA-V硬件系统和微机上的MaxPlus-I I等软件系统,分别使用原理图和VHDL语言输入方法设计8位全加器。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
Entity Divider is
port( clk: in std_logic;
--reset: in std_logic;
start: in std_logic;
word1: in std_logic_vector(15 downto 0);--被除数
word2: in std_logic_vector(7 downto 0);--除数
data_out: out std_logic_vector(15 downto 0)--商
);
end Divider;
Architecture Divider_arc of Divider is
type states is(S_Idle,S_Adivr,S_Adivn,S_div);
signal state,next_state:states;
signal dividend:std_logic_vector(16 downto 0);
signal comparison:std_logic_vector(8 downto 0);
signal divisor:std_logic_vector(7 downto 0);
signal load_words,shift_divisor,shift_dividend,subtract:std_logic;
signal num_shift_divisor,num_shift_dividend:integer range 0 to 16;
signal quotient:std_logic_vector(15 downto 0);
begin
process(state,dividend,divisor)
begin
case state is
when S_Adivr => if divisor(7)='0' then
comparison<='1'&(not(divisor(6 downto 0)&'0'))
+"000000001"+dividend(16 downto 8);
else comparison<='1'&(not divisor)
+"000000001"+dividend(16 downto 8);
end if;
when others => comparison<='1'&(not divisor)
+"000000001"+dividend(16 downto 8);
end case;
end process;
process(clk,start)
begin
if start='1' then state<=S_idle;
elsif clk'event and clk='1' then state<=next_state;
end if;
end process;
process(state,word1,word2,divisor,comparison,num_shift_divisor,num_shift_dividend)
begin Load_words<='0';Shift_dividend<='0';Shift_divisor<='0';Subtract<='0';
case state is
when S_Idle=>--case start is
--when '0'=>next_state<=S_idle;
--when '1'=>
if word2="00000000" then next_state<=S_idle;
elsif word1="0000000000000000"
then next_state<=S_idle;
else next_state<=S_Adivr;Load_words<='1';
end if;
--end case;
when S_Adivr=> case divisor(7) is
when '1'=>next_state<=S_div;
when '0'=>if comparison(8)='0' then next_state<=S_adivr;shift_divisor<='1';
elsif comparison(8)='1' then next_state<=S_Adivn;
end if;
end case;
when S_Adivn=> if num_shift_dividend=num_shift_divisor+8 then
if comparison(8)='0' then
next_state<=S_idle;Subtract<='1';
else next_state<=S_idle;
end if;
elsif comparison(8)='1' then next_state<=S_Adivn;Shift_dividend<='1';
else next_state<=S_div;
end if;
when S_div=> if num_shift_dividend=num_shift_divisor+8 then
if comparison(8)='1' then next_state<=S_div;Shift_dividend<='1';
else next_state<=S_div;Subtract<='1';
end if;
elsif comparison(8)='1' then next_state<=S_Adivn;
else next_state<=S_div;Subtract<='1';
end if;
when others=>next_state<=S_idle;
end case;
end process;
process(clk,start)
begin
if start='1' then
divisor<="00000000";dividend<="00000000000000000";quotient<="0000000000000000";
num_shift_dividend<=0;num_shift_divisor<=0;
elsif clk'event and clk='1' then
if Load_words='1' then
num_shift_dividend<=0;num_shift_divisor<=0;
dividend<=('0'&word1);divisor<=word2;quotient<="0000000000000000";
elsif shift_divisor='1' then
divisor<=divisor(6 downto 0)&'0';num_shift_divisor<=num_shift_divisor+1;
elsif shift_dividend='1' then
dividend <=dividend(15 downto 0)&'0';quotient <= quotient(14 downto 0)&'0';
num_shift_dividend<=num_shift_dividend+1;
elsif subtract='1' then
dividend(16 downto 8)<=comparison;
quotient(0)<='1';
end if;
end if;
end process;
data_out<=quotient;
end Divider_arc;。