西北工业大学部分数电实验VHDL程序合集
- 格式:docx
- 大小:16.69 KB
- 文档页数:8
班级:2009211411 学号:09211999 姓名:陈东东三十进制和六分频计数电路设计1.实验目的:(1)计数器设计设计一个三十进制计数器,要求用两位七段数码管显示(计时电路)(2)分频电路设计,六分频电路设计,在前面三十进制计数器基础上设计六分频电路,并同时用七段数码管显示。
2.实验内容和原理:采用几个触发器的状态,按照一定规律随时钟变化来记忆时钟的个数。
一个4位二进制计数器可以构成1位十进制计数器,即1位BCD计数器。
2位十进制计数器连起来可以构成一个30进制计数器.当时钟个数记到30时,十位和各位都变为0000,否则的话,每来一个时钟,个位就加1,当各位为1001时,时钟到来十位加1.再分别将个位十位bcd码转换为七段数码管对应的数字。
校正函数:function zhuan(j:in std_logic_vector(3 downto 0))return std_logic_vector isvariable k:std_logic_vector(6 downto 0);begincase j iswhen "0000"=>k:="1111110";--不显示00首两位表示数码管是(0)否(1)显示when "0001"=>k:="0110000";when "0010"=>k:="1101101";when "0011"=>k:="1111001";when "0100"=>k:="0110011";when "0101"=>k:="1011011";when "0110"=>k:="0011111";when "0111"=>k:="1110000";when "1000"=>k:="1111111";when "1001"=>k:="1110011";when others=>k:="1000000";end case;return(k);end zhuan;3.程序框图:机器频率=》分频得到目的频率=》对上升沿个数计数=》十位各位对上升沿到来时相应的变化=》BCD码与七段数码管的转化关系=》六分频与上升沿的变化关系。
数字电子技术基础实验报告题目:实验二组合电路实验设计小构成员:小构成员:实验二组合电路实验设计一、实验目的1.经过实验的方法学习数据选择器的电路结构和特色2.掌握数据选择器的逻辑功能及其基本应用3.经过实验的方法学习 74LS138的电路结构和特色4.掌握 74LS138的逻辑功能及其基本应用二、实验要求要求一:参照参照内容,调用MAXPLUSII 库中的组合逻辑器件74153 双四数据选择器和 7400 与非门,用原理图输入方法实现一位全加器。
(MULTISIM仿真和FPGA实现)要求二:参照参照内容,调用MAXPLUSII 库中的组合逻辑器件74138 三线八线译码器和 7420 与非门,用原理图输入方法实现一位全减器。
(MULTISIM仿真和FPGA实现)要求三:参照参照内容,调用MAXPLUSII 库中的组合逻辑器件74138 三线八线译码器和门电路,用原理图输入方法实现一个两位二进制数值比较器。
(MULTISIM 仿真和 FPGA 实现)三、实验设施(1)电脑一台;(2)数字电路实验箱;(3)数据线一根。
四、实验原理Multisim的模拟电路编程原理Quartus II的模拟电路编译、波形仿真及目标器件写入的基本应用数字电路逻辑表达式变换的基本知识数据选择器和译码器的电路结构及其特色实验开发板的基本使用知识五、实验内容1、调用 MAXPLUSII 库中的组合逻辑器件 74153双四数据选择器和 7400与非门,用原理图输入方法实现一位全加器。
( MULTISIM仿真和 FPGA 实现)(1)建立真值表、卡诺图及降维卡诺图真值表:真值表:S1卡诺图:C0卡诺图:降维卡诺图:(2)逻辑表达式变换过程(3)原理图( Multisim 和QuartusII 中绘制的原理图):Quartus II中原理图Multisim中原理图(4)波形仿真:(5)记录电路输出结果A B C S C000000001100101001101100101010111001111112、调用MAXPLUSII库中的组合逻辑器件74138三线八线译码器和7420与非门,用原理图输入方法实现一位全减器。
七段数码管译码器library ieee;use ieee.std_logic_1164.all;entity seg7_1 isport(a: in std_logic_vector(3 downto 0);b: out std_logic_vector(6 downto 0));end entity seg7_1;architecture one of seg7_1 isbegin process(a)begin case a iswhen"0000" => b<="1111110";when"0001" => b<="0110000";when"0010" => b<="1101101";when"0011" => b<="1111001";when"0100" => b<="0110011";when"0101" => b<="1011011";when"0110" => b<="1011111";when"0111" => b<="0001111"; when"1000" => b<="1111111"; when"1001" => b<="1111011";when others => b<="0000000";end case;end process;end ;表决器library ieee;use ieee.std_logic_1164.all;entity vote isport(I: in std_logic_vector(3 downto 0); Y: out std_logic);end entity vote;architecture one of vote isbeginY<=(I(2) and I(1) and I(0)) or (I(3) and I(2) and I(0)) or (I(3) and I(1) and I(0)) or (I(3) and I(2) and I(1));end one;半加器library ieee;use ieee.std_logic_1164.all;entity hadder isport(a,b: in std_logic;s,co: out std_logic);end entity hadder;architecture one of hadder isbegins<=a xor b;co<=a and b;end one;全加器library ieee;use ieee.std_logic_1164.all;entity fadder isport(ain,bin,cin: in std_logic;cout,sum: out std_logic);end entity fadder;architecture one of fadder iscomponent hadderport(a,b:in std_logic;co,s:out std_logic);end component ;signal d,e,f:std_logic;beginu1:hadder port map (a=>ain,b=>bin,co=>d,s=>e); u2:hadder port map (a=>e,b=>cin,co=>f,s=>sum); cout<=d or f;end;四位串型加法器library ieee;use ieee.std_logic_1164.all;entity adder4 isport(A,B: in std_logic_vector(3 downto 0); M: in std_logic;R:in std_logic;S: out std_logic_vector(3 downto 0);C: out std_logic);end entity adder4;architecture a of adder4 iscomponent fadderport(ain,bin,cin:in std_logic;cout,sum:out std_logic);end component ;signal D,F:std_logic_vector(3 downto 0); beginD(0)<=M xor B(0);D(1)<=M xor B(1);D(2)<=M xor B(2);D(3)<=M xor B(3);F(0)<=M xor R;u1:fadder port map(ain=>A(0),bin=>D(0),cin=>F(0),cout=>F(1),sum=>S(0)); u2:fadder port map (ain=>A(1),bin=>D(1),cin=>F(1),cout=>F(2),sum=>S(1)); u3:fadder port map (ain=>A(2),bin=>D(2),cin=>F(2),cout=>F(3),sum=>S(2)); u4:fadder port map (ain=>A(3),bin=>D(3),cin=>F(3),cout=>C,sum=>S(3));end;。
综合实践总结报告综合实践名称: EDA技术与实践综合实践地点、时间一.题目功能分析和设计实验的要求有如下三点:1.用16*16点阵的发光二极管显示字符;2.可显示字符为0~9的数字字符与A~F英文字母的大写;3.输入为四位二进制矢量;按照要求可知,LED点阵模块,共由16×16=256个LED发光二极管组成,如何在该点阵模块上显示数字和字母是本实验的关键。
先将要显示的每一幅图像画在一个16×16共256个小方格的矩形框中,再在有笔划下落处的小方格里填上“1”,无笔划处填上“0”,这样就形成了与这个汉字所对应的二进制数据在该矩形框上的分布以数字8为例,点阵分布为:0000000000000000000000000000000000011111111110000001111111111000000110000001100000011000000110000001100000011000000111111111100000011111111110000001100000011000000110000001100000011000000110000001111111111000000111111111100000000000000000000000000000000000考虑到实际物理实验平台上点阵发光二极管的原理,以下为16×16点阵LED外观图,只要其对应的X、Y轴顺向偏压,即可使LED 发亮。
例如如果想使左上角LED点亮,则Y0=1,X0=0即可。
所以我采用行列扫描的方法,用四位二进制数做列选信号(总共16列),如选中第一列,则扫描第一列之中哪些行是高电平(1),哪些行是低电平(0);为高电平的则点亮,为低电平的不亮。
(列信号都接地)。
如此,列选信号由“0000”变到“1111”时,16列扫描完毕,一个字也就出来了,列选信号重新由“0000”开始扫描。
注意扫描频率必须要足够快,才能保证显示一个数字或字母时所有灯在肉眼看来是同时在闪烁的。
专用集成电路实验报告13050Z011305024237X德文实验一开发平台软件安装与认知实验实验内容1、本实验以三线八线译码器(LS74138)为例,在Xilinx ISE 9.2软件平台上完成设计电路的VHDL文本输入、语法检查、编译、仿真、管脚分配和编程下载等操作。
下载芯片选择Xilinx公司的CoolRunner II系列XC2C256-7PQ208作为目标仿真芯片。
2、用1中所设计的的三线八线译码器(LS74138)生成一个LS74138元件,在Xilinx ISE 9.2软件原理图设计平台上完成LS74138元件的调用,用原理图的方法设计三线八线译码器(LS74138),实现编译,仿真,管脚分配和编程下载等操作。
源程序:library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;-- Unment the following lines to use the declarations that are-- provided for instantiating Xilinx primitive ponents.--library UNISIM;--use UNISIM.Vponents.all;entity ls74138 isPort ( g1 : in std_logic;g2 : in std_logic;inp : in std_logic_vector(2 downto 0);y : out std_logic_vector(7 downto 0));end ls74138;architecture Behavioral of ls74138 isbeginprocess(g1,g2,inp)beginif((g1 and g2)='1') thencase inp iswhen "000"=>y<="00000001";when "001"=>y<="00000010";when "010"=>y<="00000100";when "011"=>y<="00001000";when "100"=>y<="00010000";when "101"=>y<="00100000";when "110"=>y<="01000000";when "111"=>y<="10000000";when others=>y<="00000000";end case;elsey<="00000000";end if;end process;end Behavioral;波形文件:生成元器件及连接电路思考:有程序可以看出,定义了三个输入端,一个输出端。
综合设计:基于VHDL的线路编解码实现数字光纤通信系统对线路码型的要求主要是保证传输的透明性,如下图,在电调制光源之前,通常需要对解码或扰码后的二进制码进行线路编码,减小功率谱中的高低频分量,为光接收机提供足够的定时信息,保证定时信息丰富,或能提供一定的冗余码,用于平衡码流、误码监测和公务通信。
而接收端进行光电转换后,提取位时钟信号进行判决得到线路编码信号,还需要进行解码还原出原始数字信号。
图1-1 光发送机的线路编码电路FPGA在通信领域应用非常广泛,即将成为硬件设计的主流技术,编解码系统是其最基本的应用之一。
希望同学们能珍惜这次历练的机会,独立自主完成该作业,提升自己FPGA分析问题、解决问题的能力,为就业和将来的深造打好基础!一、线路编解码的相关知识mBnB、mB1C、mB1P、mB1H等都是常用的光线路编码,下面分别对其原理和实现方法进行介绍:1)、mBnB线路编解码及其实现方法mBnB码是把输入的二进制原始码流进行分组,每组有m个二进制码,记为mB,称为一个码字,然后把一个码字变换为n个二进制码,记为nB,并在同一个时隙内输出。
这种码型是把mB变换为nB,所以称为mBnB码。
其中,m和n都是正整数,n>m,一般选取n=m+1。
mBnB码有1B2B、3B4B、5B6B、 8B9B等等。
最简单的mBnB码是1B2B码,即曼彻斯特码,这就是把原码的“0”变换为“01”,把“1”变换为“10”。
因此最大的连“0”和连“1”的数目不会超过两个,例如1001和0110。
但是在相同时隙内,传输1比特变为传输2比特,码速提高了1倍(以太网中应用)。
设计者应根据最佳线路码特性的原则来选择码表。
作为普遍规则,引入“码字数字和”(WDS)来描述码字的均匀性,并以WDS 的最佳选择来保证线路码的传输特性。
所谓“码字数字和”,是在nB码的码字中,用“-1”代表“0”码,用“+1”代表“1”码,整个码字的代数和即为WDS。
VHDL实验报告一、实验目的1、设计一个24小时制数字钟,要求能显示时,分,秒,并且可以手动调整时和分。
2、通过复杂实验,进一步加深对VHDL语言的掌握程度。
二、实验原理数字钟的主体是计数器,它记录并显示接收到的秒脉冲个数,其中秒和分为模60计数器,小时是模24计数器,分别产生3位BCD码。
BCD码经译码,驱动后接数码管显示电路。
秒模60计数器的进位作为分模60计数器的时钟,分模60计数器的进位作为模24计数器的时钟。
为了实现手动调整时间,在外部增加了setm(调整分),seth(调整时)按键,当这两个按键为低电平时,电路正常计时,当为高电平时,分别调整分,时。
同时在外部还增加了一个清零按键clr.和消抖动电路。
三、实验步骤1、单元模块设计部分1)消抖动电路关键部分signal key_in1,key_in2:std_logic:='0';beginprocess(clk,key_in)beginif clk'event and clk='1' thenkey_in1<=key_in;key_in2<=key_in1;if key_in='1' and key_in1='1' and key_in2='1' then key_out<='1';else key_out<='0';end if;2) 模60计数器程序关键部分:signal md_temp,mg_temp:std_logic_vector(3 downto 0);beginprocess(clk,clr)beginif clr='1' thenmd_temp<="0000"; mg_temp<="0000";elsif set='1' thenmd_temp<=setl; mg_temp<=seth;elsif clk'event and clk='1' thenif md_temp="1001" thenmd_temp<="0000";mg_temp<=mg_temp+'1';else md_temp<=md_temp+'1';if md_temp="1001" and mg_temp="0101" thenmd_temp<="0000";mg_temp<="0000";2、模24计数器程序关键部分signal hd_temp,hg_temp:std_logic_vector(3 downto 0);beginprocess(clk,clr,set,setl,seth)isbeginif set='1' then hd_temp<=setl; hg_temp<=seth;elsif clr='1' then hd_temp<="0000"; hg_temp<="0000";elsif clk'event and clk='1' thenif hg_temp="0010" and hd_temp="0011" thenhd_temp<="0000"; hg_temp<="0000";elsif hd_temp="1001" thenhg_temp<=hg_temp+'1' hd_temp<="0000";else hd_temp<=hd_temp+'1';end if;end if;end process ;3、清零和调时部分显示部分关键程序process (sd,sg,md,mg,hd,hg)begincase sd iswhen "0000" =>sl<="1111110";when "0001" =>sl<="0110000";when "0010" =>sl<="1101101";when "0011" =>sl<="1111001";when "0100" =>sl<="0110011";when "0101" =>sl<="1011011";when "0110" =>sl<="1011111";when "0111" =>sl<="1110000";when "1000" =>sl<="1111111";when "1001" =>sl<="1111011";when others =>sl<="0000000";end case;if clk_g'event and clk_g='1' thenif sel="101" thensel<="000";else sel<=sel+'1';end if;end if;process(sel,sd,sl,sg,sh,md,ml,mg,mh,hd,hl,hg,hh)begincase sel iswhen"000"=>led<=sl;led_which<=sd;when"001"=>led<=sh;led_which<=sg;when"010"=>led<=ml;led_which<=md;when"011"=>led<=mh;led_which<=mg;when"100"=>led<=hl;led_which<=hd;when"101"=>led<=hh;led_which<=hg;when others=>led<="0000000";led_which<="0000";end case;4、顶层文件关键程序port(clk,clk_g:in std_logic;-----clk_g是用在数码管显示里面的信号clr: in std_logic;------clr=1时清零setm,seth:in std_logic;---------setm为1时调分,seth为1时调时setd,setg:in std_logic_vector(3 downto 0);----调整时间的时候,setd调整的是低位setg 调整高位led:out std_logic_vector(6 downto 0);sel_out: out std_logic_vector(2 downto 0);led_which: out std_logic_vector(3 downto 0));---输出的是秒分时的哪一个beginu1:de_shake port map (clk=>clk,key_in=>clr,key_out=>clro);u2:de_shake port map (clk=>clk,key_in=>setm,key_out=>setmo);u3:de_shake port map (clk=>clk,key_in=>seth,key_out=>setho);u4:s60 port map (clk=>clk,clr=>clro,sd=>sdl,sg=>sgh,fenmaichong=>fenmaichong o);u5:m60 port map (clk=>fenmaichongo,clr=>clro,md=>mdl,mg=>mgh,xiaoshimaichong=> xiaoshimaichongo,setl=>setd,seth=>setg,set=>setmo);u6:h24 port map (clk=>xiaoshimaichongo,clr=>clro,hd=>hdl,hg=>hgh,set=>setho,se tl=>setd,seth=>setg);u7:led_xs port map (clk_g=>clk_g,sd=>sdl,sg=>sgh,md=>mdl,mg=>mgh,hd=>hdl, hg=>hgh,led=>led,sel_out=>sel_out,led_which=>led_which);四、实验结果及分析本设计,满足了本次试验设计的任务要求,能显示时分秒,并且可以手动调节分和时。
计算机科学与技术学院实验报告(学年度第学期)课程名称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.掌握一位半减器构建一位全减器的方法;二.实验原理由两个半减器和一个或门构成一个全减器。
3位二进制数比较器4选1数据选择器8421码转换为格雷码8421码转换为余三码数码管译码器带异步复位的四位二进制减计数器带异步复位的8421码十进制计数器分频器带异步复位的四位环形计数器数码管显示012345数码管滚动显示012345数码管滚动显示012345,且用全灭的数码管填充右边,直至全灭彩灯控制电路(1)3位二进制数比较器LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY comp3 ISPORT(A:IN STD_LOGIC_VECTOR(2 DOWNTO 0); B:IN STD_LOGIC_VECTOR(2 DOWNTO 0); YA,YB,YC:OUT STD_LOGIC); END comp3;ARCHITECTURE behave OF comp3 IS BEGINPROCESS(A,B) BEGINIF(A>B)THENYA<='1';YB<='0';YC<='0'; ELSIF(A<B)THENYA<='0';YB<='1';YC<='0'; ELSEYA<='0';YB<='0';YC<='1'; END IF;END PROCESS; END behave;(2)4选1数据选择器LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY mux4 ISPORT(A:IN STD_LOGIC_VECTOR(1 DOWNTO 0); D0,D1,D2,D3:IN STD_LOGIC; Y,YB:OUT STD_LOGIC); END mux4;ARCHITECTURE behave OF mux4 IS BEGINPROCESS(A,D0,D1,D2,D3) BEGINCASE A ISWHEN"00"=> Y<=D0;YB <= NOT D0; WHEN"01"=> Y<=D1;YB <= NOT D1; WHEN"10"=> Y<=D2;YB <= NOT D2; WHEN"11"=> Y<=D3;YB <= NOT D3; WHEN OTHERS=> Y<='Z';YB<='Z'; END CASE; END PROCESS; END behave;(3)8421码转换为格雷码LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY trans1 ISPORT(A:IN STD_LOGIC_VECTOR(3 DOWNTO 0); B:OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); END trans1;ARCHITECTURE trans_gray OF trans1 IS BEGINB(0)<=A(0)XOR A(1); B(1)<=A(1)XOR A(2); B(2)<=A(2)XOR A(3); B(3)<=A(3); END trans_gray;(4)8421码转换为余三码LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY sunyu_trans2 ISPORT(A:IN STD_LOGIC_VECTOR(3 DOWNTO 0); B:OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); END sunyu_trans2;ARCHITECTURE trans_ex3 OF sunyu_trans2 IS BEGINPROCESS(A) BEGIN CASE A ISWHEN"0000"=> B<="0011"; WHEN"0001"=> B<="0100"; WHEN"0010"=> B<="0101"; WHEN"0011"=> B<="0110"; WHEN"0100"=> B<="0111"; WHEN"0101"=> B<="1000"; WHEN"0110"=> B<="1001"; WHEN"0111"=> B<="1010"; WHEN"1000"=> B<="1011"; WHEN"1001"=> B<="1100"; WHEN OTHERS=> B<="ZZZZ"; END CASE; END PROCESS; END trans_ex3;(5)数码管译码器LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY sunyu_encoder ISPORT(A:IN STD_LOGIC_VECTOR(3 DOWNTO 0); B:OUT STD_LOGIC_VECTOR(6 DOWNTO 0);C:OUT STD_LOGIC_VECTOR(5 DOWNTO 0)); END sunyu_encoder;ARCHITECTURE encoder_arch OF sunyu_encoder IS BEGINPROCESS(A) BEGINC<="011111"; CASE A ISWHEN"0000"=> B<="1111110";--0 WHEN"0001"=> B<="0110000";--1 WHEN"0010"=> B<="1101101";--2 WHEN"0011"=> B<="1111001";--3 WHEN"0100"=> B<="0110011";--4 WHEN"0101"=> B<="1011011";--5 WHEN"0110"=> B<="1011111";--6 WHEN"0111"=> B<="1110000";--7 WHEN"1000"=> B<="1111111";--8 WHEN"1001"=> B<="1111011";--9 WHEN OTHERS=> B<="ZZZZZZZ"; END CASE; END PROCESS; END encoder_arch;(1)带异步复位的四位二进制减计数器LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY count_1 IS PORT(clk,reset:IN STD_LOGIC;q:OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); END count_1;ARCHITECTURE a OF count_1 ISSIGNAL q_temp:STD_LOGIC_VECTOR(3 DOWNTO 0); BEGINPROCESS(clk,reset)BEGINIF reset='0' THEN q_temp <="1111";ELSIF clk'EVENT AND clk='1' THEN q_temp <=q_temp-1; END IF;END PROCESS; q<= q_temp; END a;(2)带异步复位的8421码十进制计数器LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY count_BCD IS PORT(clk,reset:IN STD_LOGIC;q:OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); END count_BCD; ARCHITECTURE a OF count_BCD ISSIGNAL q_temp:STD_LOGIC_VECTOR(3 DOWNTO 0); BEGINPROCESS(clk,reset) BEGINIF reset='0' THEN q_temp <="0000";ELSIF clk'EVENT AND clk='1' THEN IF q_temp="1001" THEN q_temp <="0000"; ELSE q_temp <=q_temp+1; END IF; END IF;END PROCESS; q<= q_temp; END a;(3)分频器LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY div_12 IS PORT(clk:IN STD_LOGIC; clear:IN STD_LOGIC;clk_out:OUT STD_LOGIC); END div_12;ARCHITECTURE a OF div_12 ISSIGNAL temp:INTEGER RANGE 0 TO 11; BEGINp1:PROCESS(clear,clk) BEGINIF clear='0'THEN temp<=0;ELSIF clk'EVENT AND clk='1' THEN IF temp=11 THEN temp<=0;ELSE temp<=temp+1; END IF; END IF;END PROCESS p1; p2:PROCESS(temp) BEGINIF temp<6 THEN clk_out<='0';ELSE clk_out<='1'; END IF;END PROCESS p2; END a;(4)带异步复位的四位环形计数器LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY ring IS PORT(clk,reset:IN STD_LOGIC;countout:OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); END ring; ARCHITECTURE behave OF ring ISSIGNAL nextcount:STD_LOGIC_VECTOR(3 DOWNTO 0); BEGINPROCESS(clk,reset) --0001-0010-0100-1000-0001 BEGINIF reset='0' THEN nextcount<="0001"; ELSIF clk'EVENT AND clk='1' THEN CASE nextcount IS WHEN"0001"=> nextcount<="0010"; WHEN"0010"=> nextcount<="0100"; WHEN"0100"=> nextcount<="1000"; WHEN OTHERS=> nextcount<="0001"; END CASE; END IF;END PROCESS; countout<=nextcount; END behave;(1)数码管显示012345library ieee;use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity nixietube1 is port(clk: in std_logic;partout:out std_logic_vector(6 downto 0); catout: out std_logic_vector(5 downto 0));end nixietube1;architecture a of nixietube1 issignal part: std_logic_vector(6 downto 0); signal cat: std_logic_vector(5 downto 0); signal tempclk: std_logic;signal count: integer range 0 to 50000; beginp1:process(clk) beginif(clk'event and clk='1')then if count=50000 then count<=0;tempclk<= not tempclk; elsecount<=count+1; end if; end if;end process p1;p2:process(tempclk) beginif(tempclk'event and tempclk='1')then case cat iswhen"111110"=> cat<="011111";part<="1111110"; --0 when"011111"=> cat<="101111";part<="0110000"; --1 when"101111"=> cat<="110111";part<="1101101"; --2 when"110111"=> cat<="111011";part<="1111001"; --3 when"111011"=> cat<="111101";part<="0110011"; --4 when"111101"=> cat<="111110";part<="1011011"; --5 when others => cat<="011111";part<="1111110"; --0 end case; end if;end process p2; catout<=cat; partout<=part; end a;(2)数码管滚动显示012345library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity shiyan12new2 isport(clk: in std_logic;partout:out std_logic_vector(6 downto 0); catout: out std_logic_vector(5 downto 0)); end shiyan12new2;architecture a of shiyan12new2 issignal part: std_logic_vector(6 downto 0); signal cat: std_logic_vector(5 downto 0); signal number: std_logic_vector(5 downto 0); signal tempclk: std_logic;--a clk(div 1) signal move: std_logic;--a clk(div 2) beginp1:process(clk)--div 1 (cat 0-5)variable count:integer range 0 to 50000:=0; beginif(clk'event and clk='1')then if(count=50000)then count:=0;tempclk<= not tempclk; elsecount:=count+1; end if; end if;end process p1;p2:process(tempclk) beginif tempclk'event and tempclk='1' then case cat iswhen"011111"=>cat<="101111"; when"101111"=>cat<="110111"; when"110111"=>cat<="111011"; when"111011"=>cat<="111101"; when"111101"=>cat<="111110"; when others =>cat<="011111"; end case; end if;end process p2;catout<=cat;p3:process(clk)--div 2 (one cat and change) about 1Hz variable count:integer range 0 to 25000000:=0; beginif (clk'event and clk='1') then if (count=25000000) then count:=0;move<=not move; elsecount:=count+1; end if; end if;end process p3;p4:process(tempclk,move)--make numbersvariable judge1:integer range 0 to 1:=0;-- 1 when "move" come variable judge2:integer range 0 to 1:=0; beginif (move'event and move='1') then judge1:=1; end if;if (tempclk'event and tempclk='1') thenif (judge1=0) then--when move donnot come case number iswhen"011111"=>number<="101111"; when"101111"=>number<="110111"; when"110111"=>number<="111011"; when"111011"=>number<="111101"; when"111101"=>number<="111110"; when others =>number<="011111"; end case; judge2:=0; elsecase number iswhen"011111"=>number<="110111"; when"101111"=>number<="111011"; when"110111"=>number<="111101"; when"111011"=>number<="111110"; when"111110"=>number<="101111"; when others =>number<="011111"; end case; judge2:=1; end if; end if;if judge2=1 then judge1:=0; end if;end process p4;p5:process(number) begincase number iswhen"011111"=>part<="1111110"; when"101111"=>part<="0110000"; when"110111"=>part<="1101101"; when"111011"=>part<="1111001"; when"111101"=>part<="0110011"; when"111110"=>part<="1011011"; when others =>part<="1111110"; end case;end process p5; partout<=part;end a;(3)数码管滚动显示012345,且用全灭的数码管填充右边,直至全灭library ieee;use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all;entity shiyan12new3 is port(clk: in std_logic;partout:out std_logic_vector(6 downto 0); catout: out std_logic_vector(5 downto 0)); end shiyan12new3;architecture a of shiyan12new3 issignal part: std_logic_vector(6 downto 0); signal cat: std_logic_vector(5 downto 0); signal number: std_logic_vector(5 downto 0); signal tempclk: std_logic;--a clk(div 1) signal move: std_logic;--a clk(div 2) beginp1:process(clk)--div 1 (cat 0-5)variable count:integer range 0 to 50000 :=0; beginif(clk'event and clk='1')then if(count=50000)then count:=0;tempclk<= not tempclk; elsecount:=count+1; end if; end if;end process p1;p2:process(tempclk)variable count: integer range 0 to 11;variable temp:std_logic_vector(5 downto 0); beginif (move'event and move='1')then if count=11 then count:=0; elsecount:=count+1; end if; end if;if tempclk'event and tempclk='1' then case temp iswhen"011111"=>temp:="101111"; when"101111"=>temp:="110111"; when"110111"=>temp:="111011"; when"111011"=>temp:="111101"; when"111101"=>temp:="111110"; when others =>temp:="011111"; end case; end if;case count iswhen 0 =>cat<=(temp or "000000");--cat is active low when 1 =>cat<=(temp or "000001"); when 2 =>cat<=(temp or "000011"); when 3 =>cat<=(temp or "000111"); when 4 =>cat<=(temp or "001111");when 5 =>cat<=(temp or "011111"); when 6 =>cat<=(temp or "111111"); when 7 =>cat<=(temp or "111110"); when 8 =>cat<=(temp or "111100"); when 9 =>cat<=(temp or "111000"); when 10=>cat<=(temp or "110000"); when 11=>cat<=(temp or "100000"); end case; catout<=cat; end process p2;p3:process(clk) --div 2 (one cat and change)about 1Hz variable count:integer range 0 to 25000000:=0; beginif (clk'event and clk='1') then if (count=25000000) then count:=0;move<=not move; elsecount:=count+1; end if; end if;end process p3;p4:process(tempclk,move)--make numbersvariable judge1:integer range 0 to 1:=0;-- 1 when "move" come variable judge2:integer range 0 to 1:=0; beginif (move'event and move='1') then judge1:=1; end if;if (tempclk'event and tempclk='1') thenif (judge1=0) then--when move donnot come case number iswhen"011111"=>number<="101111"; when"101111"=>number<="110111"; when"110111"=>number<="111011"; when"111011"=>number<="111101"; when"111101"=>number<="111110"; when others =>number<="011111"; end case; judge2:=0;elsecase number iswhen"011111"=>number<="110111"; when"101111"=>number<="111011"; when"110111"=>number<="111101"; when"111011"=>number<="111110"; when"111110"=>number<="101111"; when others =>number<="011111"; end case; judge2:=1; end if; end if;if judge2=1 then judge1:=0; end if;end process p4;p5:process(number) begincase number iswhen"011111"=>part<="1111110"; when"101111"=>part<="0110000"; when"110111"=>part<="1101101"; when"111011"=>part<="1111001"; when"111101"=>part<="0110011"; when"111110"=>part<="1011011"; when others =>part<="1111110"; end case;end process p5; partout<=part;end a;1、彩灯控制电路要求控制4个彩灯;2、两个控制信号:K1K0= 00 灯全灭01 右移,循环显示10 左移,循环显示11 灯全亮3、在FPGA七段数码管上按1HZ的频率依次显示该组成员每人学号后四位library ieee;use ieee.std_logic_1164.all; entity ledcontrol is port(clk:in std_logic;keyin:in std_logic_vector(1 downto 0); ledout:out bit_vector(3 downto 0);ledseg:out bit_vector(0 to 6));end ledcontrol;architecture fwm of ledcontrol issignal tmpstate :bit_vector(3 downto 0):="0001"; begin process(clk)variable counter :integer:=0;variable counter1:integer range 0 to 7:=0; variable counter2:integer:=0; begin if(clk'event and clk='1') thencounter:=counter+1;if(counter=24999999)then --0.5s=50M/2-1=25000000-1=24999999; counter:=0; case keyin iswhen "00"=>tmpstate<="1111";when "01"=>if(tmpstate="1111" or tmpstate="0000")thentmpstate<="0001";elsetmpstate<=tmpstate rol 1;end if;when "10"=>if(tmpstate="1111" or tmpstate="0000")thentmpstate<="1000";elsetmpstate<=tmpstate ror 1;end if;when others=>tmpstate<="0000";end case;--tmpstate<=tmpstate rol 1;end if;if(counter2=50000000) then counter2:=0; if(counter1=8) then counter1:=0;elsecounter1:=counter1+1;end if;elsecounter2:=counter2+1;end if;case counter1 is when 0=>ledseg<="1111001"; when 1=>ledseg<="0000000"; when 2=>ledseg<="1111000"; when 3=>ledseg<="0110000"; when4=>ledseg<="1111001"; when 5=>ledseg<="0000000"; when 6=>ledseg<="0000000"; when 7=>ledseg<="0010010";when others =>ledseg<=(others=>'0');end case;end if;ledout<=tmpstate;end process;end fwm。