EDA实验报告—何探3090731126

更新时间:2024-07-07 21:27:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

EDA实验报告

班级:通信 姓名:何探 学号:老师:杨小平09-1班

3090731126

目 录

第一章 组合逻辑篇 ................................................................................................... 1

1.1 8‐3编码器及QuartusII的基础 .................................................................. 1 1.3 3‐8译码器及QuartusII的仿真 .................................................................. 4 1.4 BCD七段显示译码器 ................................................................................... 7 1.5 数据选择器及图形设计的方法 ..................................................................... 9 1.6 多位数值比较器 ........................................................................................... 11 1.7 半加器与全加器 ........................................................................................... 12 1.8 D 触发器 ....................................................................................................... 14 第二章 时序逻辑篇 ................................................................................................. 16

2.1 寄存器及SignalTapII的使用 ..................................................................... 16 2.2 双向移位寄存器 ........................................................................................... 18 2.3 4位二进制加减法计数器 ............................................................................ 20 2.4 十进制加减法计数器 .................................................................................... 24 2.5 顺序脉冲发生器 ........................................................................................... 28 2.6 序列信号发生器 ........................................................................................... 30 2.7 分频器 ........................................................................................................... 33

第一章 组合逻辑篇

1.1 8‐3编码器及QuartusII的基础

一、实验目的

1.学习组合逻辑电路,学习编码器的功能与定义,学习Verilog 和VHDL 语言 2.熟悉利用Quartus II 开发数字电路的基本流程和Quartus II软件的相关操作 二、实验内容

编写8‐3 编码器的Verilog 代码和VHDL代码, 编译下载后通过拨动拨码开关观察LED 灯的变化,来验证8‐3 编码器是否成功。 三、实验原理 在数字系统中,常常需要将某一信息(输入)变换为某一特定的代码(输出) 。把二进制码按一定的规律排列,例如8421 码、格雷码等,使每组代码具有一特定的含义(代表某个数字或是控制信号)称为编码。具有编码功能的逻辑电路称为编码器。编码器有若干个输入,在某一时刻只有一个输入被转换为二进制码。例如8线‐3 线编码器和10 线‐4线编码器分别有8 输入、3 位输出和10 位输入、4 位输出。 真值表

A7 A6 A5 A4 A3 A2 A1 A0 Y2 Y1 Y0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 1 1 1

从原理图中可见,需要有一组8bit 的可变输入作为输入数据,故此处选择实验箱上的SW1—SW8,作为输入(注意,每一次只能有一位为高,比如00001000) 。为使输出特征明显,便于观察,故采用LED 显示,此处采用LED0—LED2 依次显示。

引脚分配情况如下:

设计端口 芯片引脚 开发平台模块 DIN[7] PIN_AB15 SW8 DIN[6] PIN_V24 SW7 DIN[5] P IN_V13 SW6 DIN[4] PIN_Y11 SW5 DIN[3] PIN_V10 SW4 DIN[2] PIN_W10 SW3 DIN[1] PIN_Y13 SW2 DIN[0] PIN_AA16 SW1 DOUT[2] PIN_AB23 LED_D1

1

DOUT[1] PIN_AD24 LED_D2 DOUT[0] PIN_AB20 LED_D3 `四、源代码

timescale 1 ns / 1 ps

module encoder8_3 ( DIN ,DOUT ); //定义输入、输出管脚 input [7:0] DIN ; wire [7:0] DIN ; output [2:0] DOUT ; reg [2:0] DOUT; always @ ( DIN ) begin

case ( DIN )

8'b0000_0001 : DOUT <= 3'b000; 8'b0000_0010 : DOUT <= 3'b001; 8'b0000_0100 : DOUT <= 3'b010; 8'b0000_1000 : DOUT <= 3'b011; 8'b0001_0000 : DOUT <= 3'b100; 8'b0010_0000 : DOUT <= 3'b101; 8'b0100_0000 : DOUT <= 3'b110; 8'b1000_0000 : DOUT <= 3'b111; default : DOUT <= 3'b000; endcase end

endmodule

1.2 8‐3优先编码器

一、实验目的 1.学习组合逻辑电路,学习编码器的功能与定义,学习Verilog 和VHDL 语言。 2.熟悉利用Quartus II 开发数字电路的基本流程和Quartus II软件的相关操作。 3. 巩固实验一的内容。 二、实验内容

做8‐3 优先编码器的练习。使用拨码开关和LED灯验证8‐3 优先编码的功能。

三、实验原理

在数字系统中,常常会有几个部件同时发出服务请求的可能,而在同一时刻只能给其中一个部件发出允许操作信号。因此,必须根据轻重缓急,规定好这些控制对象允许操作的先后次序,即优先级别。8‐3 编码器的真值表

EI A7 A6 A5 A4 A3 A2 A1 A0 Y2 Y1 Y0 GS E0 1 x x x x x x x x 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 0 1 1 1 0 1 0 1 1 1 1 1 1 0 x 1 1 0 0 1 0 1 1 1 1 1 0 x x 1 0 1 0 1 0 1 1 1 1 0 x x x 1 0 0 0 1

2

0 1 1 1 0 x x x x 0 1 1 0 1 0 1 1 0 x x x x x 0 1 0 0 1 0 1 0 x x x x x x 0 0 1 0 1 0 0 x x x x x x x 0 0 0 0 1

编码器有8 个输入端,3 个输出端。还有一个输入使能EI,输出使能EO 和

优先编码器工作状态标志GS。编码器以低为有效。

当EI=0 时,编码器工作;EI=1 时,输出全为高。输入优先级别的次序为7,6,5,?,0。当某一输入端有低电平输入,且比它优先级高的输入没有低电平输入时,输出端才输出相应输入端的代码。 需要有一组8bit 的可变输入作为输入数据和1bit 控制位,故此处选择实验箱上的SW1—SW8,作为输入,BTN1 作为EI 输入。为使输出特征明显,便于观察,故采用LED 显示,此处采用LED1—LED3 显示输出编码值,LED7‐LED8分别代表GS 和E0。 引脚分配

设计端口 芯片引脚 开发平台模块 设计端口 芯片引脚 开发平台模块 EI PIN_AC23 BTN1 DIN[7] PIN_AB15 SW8 DIN[6] PIN_V24 SW7 DIN[5] PIN_V13 SW6 DIN[4] PIN_Y11 SW5 DIN[3] PIN_V10 SW4 DIN[2] PIN_W10 SW3 DIN[1] PIN_Y13 SW2 DIN[0] PIN_AA16 SW1 DOUT[2] PIN_AB23 LED_D3 DOUT[1] PIN_AD24 LED_D2 DOUT[0] PIN_AB20 LED_D1 GS PIN_U24 LED_D7 E0 PIN_T23 LED_D8 四、源代码如下: LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL; //调用库 entity priencoder8_3 is port (

EI : in std_logic; DIN : in bit_vector(7 downto 0); DOUT: out bit_vector(2 downto 0); GS : out std_logic; Eo : out std_logic );

end priencoder8_3;

architecture rt1 of priencoder8_3 is begin

process(EI,DIN) begin

if EI = '1' then //if?else 语句 DOUT <= \ GS <= '1'; Eo <= '1'; else

3

if DIN(7) = '0' then DOUT <= \ GS <= '0'; Eo <= '1';

elsif DIN(6) = '0' then DOUT <= \ GS <= '0'; Eo <= '1';

elsif DIN(5) = '0' then DOUT <= \ GS <= '0'; Eo <= '1';

elsif DIN(4) = '0' then DOUT <= \ GS <= '0'; Eo <= '1';

elsif DIN(3) = '0' then DOUT <= \ GS <= '0'; Eo <= '1';

elsif DIN(2) = '0' then DOUT <= \ GS <= '0'; Eo <= '1';

elsif DIN(1) = '0' then DOUT <= \ GS <= '0'; Eo <= '1';

elsif DIN(0) = '0' then DOUT <= \ GS <= '0'; Eo <= '1';

elsif DIN = \ DOUT <= \ GS <= '1'; Eo <= '0'; end if; end if;

end process; end rt1;

1.3 3‐8译码器及QuartusII的仿真

一、实验目的

4

1.学习组合逻辑电路,学习译码器的功能与定义,学习Verilog 和VHDL 语言。 2.熟悉利用Quartus II 开发数字电路的基本流程和Quartus II软件的相关操作。 3. 掌握利用QuartusII做时序和功能仿真 二、实验内容

编写3‐8 译码器的Verilog 代码和VHDL代码,首先在QuarutsII 中做仿真,观察仿真结果与设计源码是否一致,再通过编译并下载到平台上验证。 三、实验原理

译码是编码的逆过程, 它的功能是将特定含义的二进制码进行辨别, 并转换成控制信号,具有译码功能的逻辑电路成为译码器。 译码器可分为两种类型,一种是将一系列代码转换成与之一一对应得有效信号。这种译 码器可以称为唯一地址译码器,它常用于计算机中对存储器单元地址的译码,即将每一个地址代码换成一个有效信号,从而选中对应的单元。另一种是将一种代码转换成另一种代码,所以也称为代码变换器。在本实验中我们先介绍二进制唯一地址译码器,在下一实验中,我们介绍代码变换器。

3 线‐8 线译码器的真值表见表1.3‐1,原理框图如图所示 输入 输出 G1 G2 G3 A2 A1 A0 Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0 x 1 x x x x 1 1 1 1 1 1 1 1 x x 1 x x x 1 1 1 1 1 1 1 1 0 x x x x x 1 1 1 1 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1 0 1 0 0 0 0 1 1 1 1 1 1 1 0 1 1 0 0 0 1 0 1 1 1 1 1 0 1 1 1 0 0 0 1 1 1 1 1 1 0 1 1 1 1 0 0 1 0 0 1 1 1 0 1 1 1 1 1 0 0 1 0 1 1 1 0 1 1 1 1 1 1 0 0 1 1 0 1 0 1 1 1 1 1 1 1 0 0 1 1 1 0 1 1 1 1 1 1 1

实验箱上的SW1—SW3 作为控制信号输入,SW4—SW6 作为片选信号输入,LED1—LED8显示输出译码值。 引脚分配情况如下:

设计端口 芯片引脚 开发平台模块 设计端口 芯片引脚 开发平台模块 G1 PIN_AA16 SW1 G2 PIN_Y13 SW2 G3 PIN_W10 SW3 DIN[2] PIN_V10 SW4 DIN[1] PIN_Y11 SW5 DIN[0] PIN_V13 SW6 DOUT[7] PIN_T23 LED_D8 DOUT[6] PIN_U24 LED_D7 DOUT[5] PIN_AD16 LED_D6 DOUT[4] PIN_Y21 LED_D5 DOUT[3] PIN_AB18 LED_D4 DOUT[2] PIN_AB23 LED_D3 DOUT[1] PIN_AD24 LED_D2 DOUT[0] PIN_AB20 LED_D1 四、源代码如下: LIBRARY IEEE;

5

USE IEEE.STD_LOGIC_1164.ALL; entity decoder3_8 is port (

G1 : in bit; G2 : in bit; G3 : in bit;

DIN : in std_logic_vector(2 downto 0); DOUT: out std_logic_vector(7 downto 0) );

end decoder3_8;

architecture rt1 of decoder3_8 is signal s:bit; begin

process(G1,G2,G3,DIN) begin

s <= G2 or G3; if G1 = '0' then

DOUT <= \ elsif s = '1' then

DOUT <= \ else

case DIN is //case 语句,对输入的3为数据选择 when \ when \ when \ when \ when \ when \ when \ when \

when others => DOUT <= \ end case; end if;

end process; end rt1; 仿真结果

6

1.4 BCD七段显示译码器

一、实验目的

1.学习7 段数码管显示译码器的设计,进一步了解、熟悉和掌握FPGA 开发软件Quartus II的使用方法

2.学习Verilog HDL 和VHDL 的编程方法 3.巩固QuartusII 仿真 二、实验内容

通过编写Vhdl 源码控制BCD 数码管显示。并巩固学习QuartusII 仿真操作。 三、实验原理

7 段数码管是利用不同发光段组合的方式来显示不同的数码,为了试数码管能将数码所代表的数显示出来,必须将数码经译码器译出,然后经驱动器点亮对用的段。结构图如下:

输入 数字 A3 A2 A1 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14

输出 A0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 Ya 1 0 1 1 0 1 1 1 1 1 1 0 1 0 1 Yb 1 1 1 1 1 0 0 1 1 1 1 0 1 0 7

字形 Ye 1 0 1 0 0 0 1 0 1 0 1 1 1 1 1 Yf 1 0 0 0 1 1 1 1 1 1 1 1 1 1 1 Yg 0 0 1 1 1 1 1 0 1 1 1 1 0 1 1 0 1 2 3 4 5 6 7 8 9 A B C D E Yc 1 1 0 1 1 1 1 1 1 1 1 0 0 0 Yd 1 0 1 1 0 1 1 0 1 1 0 1 1 1 1 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 0 1

需要有一组4bit 的可变输入作为输入数据,故此处选择实验箱上的SW1—SW4,作 为 输入。输出的数据在第一位的扫描数码管上显示数值。 引脚分配情况

设计端口 芯片引脚 开发平台模块 设计端口 芯片引脚 开发平台模块 DIN[0] PIN_AA16 SW1 DIN[1] PIN_Y13 SW2 DIN[2] PIN_W10 SW3 DIN[3] PIN_V10 SW4 DOUT[0] PIN_J13 7SEG_a DOUT[1] PIN_G15 7SEG_b DOUT[2] PIN_C16 7SEG_c DOUT[3] PIN_C15 7SEG_d DOUT[4] PIN_D15 7SEG_e DOUT[5] PIN_G13 DOUT[6] PIN_D17 7SEG_g DOUT[7] PIN_D16 BITCON PIN_D18 7SEG_bit_1 四、源代码如下:

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL; entity bcdseg_decoder is

port (

DIN : in std_logic_vector(3 downto 0); DOUT : out std_logic_vector(7 downto 0); BITCON: out bit );

end bcdseg_decoder;

architecture rt1 of bcdseg_decoder is

signal DOUT_reg: std_logic_vector(7 downto 0); begin

DOUT <= not DOUT_reg; BITCON <= '0'; process(DIN) begin case DIN is

when \‐‐ 0 when \‐‐ 1 when \‐‐ 2 when \‐‐ 3 when \‐‐ 4 when \‐‐ 5 when \‐‐ 6 when \‐‐ 7 when \‐‐ 8 when \‐‐ 9 when \‐‐ A when \‐‐ b when \‐‐ c

8

7SEG_f 7SEG_h

when \‐‐ d when \‐‐ E when \‐‐ F when others => NULL; end case; end process; end rt1; 仿真结果

1.5 数据选择器及图形设计的方法

一、实验目的

1.学习数据选择器的设计,进一步了解、熟悉和掌握FPGA 开发软件Quartus II 的使用方法 。

2.学习Verilog HDL 和VHDL 的编程方法 。 3.学习使用QuartusII 的图形设计。 二、实验内容

通过编译VHDL 代码,实现数据选择器的功能,并使用QuartusII 的图形设计界面完成源码的顶层设计。 三、实验原理

数据选择是指经过选择,把多个通道的数据传送到唯一的公共数据通道上去。实现数据选择功能的逻辑电路称为数据选择器,它的作用相当于多个输入的单刀多掷开关。 八选一数据选择器的真值表 输入 输出 使能 A2 A1 A0 Y 1 x x x 0 0 0 0 0 D0 0 0 0 1 D1 0 0 1 0 D2 0 0 1 1 D3 0 1 0 0 D4 0 1 0 1 D5 0 1 1 0 D6 0 1 1 1 D7

需要有一组8bit 的可变输入作为输入数据和3bit 控制数据选择位以及1bit 使能

9

位。数据输入我们采用实验箱上的BTN1—BTN8,SW1‐SW3 作为数据端口选通端,SW4 作为CS 使能端。LED1显示选通数据端口的信号。

设计端口 芯片引脚 开发平台模块 设计端口 芯片引脚 开发平台模块 D0 PIN_AC23 BTN1 D1 PIN_AB21 BTN2 D2 PIN_Y14 BTN3 D3 PIN_AA13 BTN4 D4 PIN_AC15 BTN5 D5 PIN_V23 BTN6 D6 PIN_U23 BTN7 D7 PIN_AC16 BTN8 A[2] PIN_AA16 SW1 A[1] PIN_Y13 SW2 A[0] PIN_W10 SW3 DOUT PIN_AB20 LED1 四、源代码如下: LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL; entity mux8_1 is port (

D0,D1,D2,D3,D4,D5,D6,D7: in std_logic;

A : in std_logic_vector(2 downto 0); CS : in std_logic;

DOUT : out std_logic );

end mux8_1;

architecture rt1 of mux8_1 is begin

process(D0,D1,D2,D3,D4,D5,D6,D7,A,CS) begin

if CS = '1' then DOUT <= '0'; else

case A is

when \ when \ when \ when \ when \ when \ when \ when \ when others=> DOUT <= '1'; end case; end if;

end process; end rt1;

10

1.6 多位数值比较器

一、实验目的 1.学习组合逻辑电路,学习多位数值比较器的功能与定义,学习Verilog 和VHDL 语言 。 2.熟悉利用Quartus II 开发数字电路的基本流程和Quartus II软件的相关操作。 3.练习使用QuartusII 的图形设计方法。 二、实验内容

编写多位数值比较器的Verilog 代码和VHDL 代码并仿真, 在平台验证多位数值比较器的功能。 三、实验原理 在数值系统中,特别是在计算机中都具有运算功能,一种简单的运算就是比较它们的大小。数值比较器就是对两数A、B进行比较,以判断其大小的逻辑电路。多位数值比较器的 真值表

输入 输出

A B Y2 Y1 Y0 A>B 1 1 0 A=B 1 0 1 A

数值比较器各自带有4位的A、B输入端,当A>B 的时候,输出为“110” ,A=B 的时候,输出“101” ,A

从原理图中可见,需要有两组各4bit 的可变输入作为比较输入数据,故此处选择实验箱上的SW1—SW8,作为输入。为使输出特征明显,便于观察,故采用LED1‐LED3 显示,当A>B 的时候,LED1 亮;A=B 的时候,LED2 亮;A

设计端口 芯片引脚 开发平台模块 设计端口 芯片引脚 开发平台模块 A[0] PIN_AA16 SW1 A[1] PIN_Y13 SW2 A[2] PIN_W10 SW4 A[3] PIN_V10 SW4 B[0] PIN_Y11 SW5 B[1] PIN_V13 SW6 B[2] PIN_V24 SW7 B[3] PIN_AB15 SW8 DOUT[0] PIN_AB20 LED1 DOUT[1] PIN_AD24 LED2 DOUT[2] PIN_AB23 LED3 四、源代码如下: LIBRARY IEEE;

11

USE IEEE.STD_LOGIC_1164.all; entity compare2 is port (

A : in std_logic_vector(3 downto 0); B : in std_logic_vector(3 downto 0); DOUT : out std_logic_vector(2 downto 0) );

end compare2;

architecture rtl of compare2 is begin

process ( A, B) begin

if ( A > B ) then DOUT <= \ elsif ( A = B) then DOUT <= \ else

DOUT <= \ end if;

end process ; end rtl;

1.7 半加器与全加器

一、实验目的

1.学习半加器和全加器的设计,进一步了解、熟悉和掌握FPGA 开发软件Quartus II的使用方法 。

2.学习Verilog HDL 和VHDL 的编程方法。 3.巩固QuartusII 的仿真和图形设计方法。 二、实验内容

编写半加器和全加器的Verilog 代码和VHDL 代码并仿真,编译下载验证。 三、实验原理

算术运算式数值系统的基本功能,更是计算机中不可缺少的组成单元。 1、 半加器

半加法和全加法是算术运算电路中的基本单元,它们是完成1 位二进制相加的一种组合逻辑电路。一位加法器的真值表见表1.7‐1;由表中可以看见,这种加法没有考虑低位来的进位,所以称为半加。半加器就是实现表1.7‐1中逻辑关系的电路。

二进制输入 和输出 进位输出 A B S Co 0 0 0 0 0 1 1 0 1 0 1 0

12

1 1 0 1 2、 全加器

全加器能进行加数、被加数和低位来的进位信号相加,并根据求和结果给出该位的

进位信号。根据它的功能,可以列出它的真值表 二进制输入 低位进位输入 和输出 进位输出 A B Ci S Co 0 0 0 0 0 0 1 0 1 0 1 0 0 1 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 0 1 0 1 1 1 1 1 1 3、半减法和全减法

半减法和全减法与加法器一样是算术运算电路中的基本单元。 半减器和全减器的设计方法和设计加法器相同,但是实际上,为了简化系统结构,通常不设计减法器,而是将减法运算变为加法运算来出来,使运算器即能实现加法器运算,又能实现减法器运算。一般采用加补码的方法代替减法运算。

从原理图中可见,需要有两个数据输入位还有一个低位进位,数据输入我们采用实验箱上的SW1 和SW2,进位采用SW3,LED1 显示和输出,LED2 显示进位输出。

引脚分配情况

设计端口 芯片引脚 开发平台模块 设计端口 芯片引脚 开发平台模块

A PIN_AA16 SW1 B PIN_Y13 SW2 Ci PIN_W10 SW3 S PIN_AB20 LED1 Co PIN_AD24 LED2

四、源代码如下:

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

entity adder is port (

A : in std_logic; B : in std_logic; Ci: in std_logic;

13

S : out std_logic; Co: out std_logic );

end adder;

architecture rt1 of adder is begin

S <= (A xor B) xor Ci;

Co <= (A and B) or (A and Ci) or(B and Ci); end rt1;

仿真结果

1.8 D 触发器

一、实验目的 1.学习组合逻辑电路的设计,进一步了解、熟悉和掌握FPGA 开发软件Quartus II 的使用方法 。

2.了解D 触发器的设计思路和工作原理 。 3.学习Verilog HDL 和VHDL 的编程方法 。 4.巩固QuartusII 仿真和图形设计方法。 二、实验内容

编写D 触发器的Verilog 代码和VHDL代码并仿真,编译下载验证。 三、实验原理

触发器是能够储存1 位二进制码的逻辑电路,它有两个互补输出端,其输出状态不仅与输入有关,而且还与原来的输出状态有关。 D 触发器是触发器中的一种,也是应用的最多的一种,它的特性方程为

n+1 Q=D

D触发器的逻辑功能表 D 0 0 1 1

Qn 0 1 0 1 Qn+1 0 0 1 1 14

集成D 触发器的产品很多,如7474 等。如下功能表1.8‐2 可以看出,74HC74 是带有预置清零输入,上跳沿触发的边沿触发器。D 触发器的管脚功能图

S R CP D Q Q# L H x x H L H L x x L H H H - H H L

H H - L L H

H H L x Qo Qo#

从原理图中可见,我们需要一个信号输入D,复位按键RESET 和SET 按键。信号输入我们采用SW1,复位按键采用BTN1,SET 键用实验箱上的BTN2。LED1 作为Q 输出,LED2 作为Qn 输出。 引脚分配情况

设计端口 芯片引脚 开发平台模块 设计端口 芯片引脚 开发平台模块 SET PIN_AC23 BTN1 CLK PIN_P2 CLK1 RESET PIN_AB21 BTN2 D PIN_AA16 SW1 Q PIN_AB20 LED1 Qn PIN_AD24 LED2 四、源代码如下: LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

entity Dflipflop is port (

SET,CLK,RESET : in std_logic; D : in std_logic; Q : out std_logic; Qn : out std_logic );

end Dflipflop;

architecture rt1 of Dflipflop is signal Q_temp:std_logic; begin

process(SET,CLK,RESET,D) begin

if RESET = '0' then Q_temp <= '0'; elsif SET = '0' then Q_temp <= '1';

elsif CLK'event and CLK = '1' then Q_temp <= D; end if;

15

end process;

Qn <= not Q_temp; Q <= Q_temp; end rt1; 仿真结果

第二章 时序逻辑篇

2.1 寄存器及SignalTapII的使用

一、实验目的 1.学习时序逻辑电路的设计,进一步了解、熟悉和掌握FPGA 开发软件Quartus II 的使用方法 。

2.了解寄存器的工作原理和设计思路 。

3.学习嵌入式逻辑分析仪SignalTapII 的使用 。 二、实验内容

在实验寄存器功能后,增加SignalTapII 嵌入式逻辑分析仪的使用。最终下载到平台上用 SignalTapII观察FPGA 内部信号的波形。 三、实验原理

寄存器是计算机和其他数字系统中用来存储代码或数据的逻辑部件。 它的主要组成部分是触发器。一个触发器能储存一位二进制代码,所以要存储n 位二进制代码的寄存器需要n个触发器组成。

寄存器和数据锁存器功能是相同的,不同的区别在于锁存器是电平信号控制,属于电平敏感性,而寄存器一般是由同步时钟信号控制。两者使用场合不一样,主要取决于控制方式及控制信号和数据之间的时序关系:若数据有效滞后于控制信号有效,则只能使用锁存器;若数据提前于控制信号,并要求同步操作,而可以选择寄存器来存放数据。 本实验就是设计一个8 位的数据寄存器,该寄存器可以对8 位信号并行输入的数据进行同步寄存。另外,该寄存器还有一个异步清零端,低电平有效。其功能表如下所示; R CLK D[7:O] D[7:0] L x x L H - D D

16

H H x 保 持 H L x 保 持 从原理图中可见,需要有一组8bit 的可变输入作为输入数据和1bit 清零使能位。数据

输入我们采用实验箱上的SW1—SW8,BTN1 作为CLR 清零使能位。LED1‐LED8 显示数据。 引脚分配情况

设计端口 芯片引脚 开发平台模块 设计端口 芯片引脚 开发平台模块 CLK PIN_P2 CLK1 CLR PIN_AC23 BTN1 D0 PIN_AA16 SW1 D1 PIN_Y13 SW2 D2 PIN_W10 SW3 D3 PIN_V10 SW4 D4 PIN_Y11 SW5 D5 PIN_V13 SW6 D6 PIN_V24 SW7 D7 PIN_AB15 SW8 DOUT[0] PIN_AB20 LED1 DOUT[1] PIN_AD24 LED2 DOUT[2] PIN_AB23 LED3 DOUT[3] PIN_AB18 LED4 DOUT[4] PIN_Y21 LED5 DOUT[5] PIN_AD16 LED6 DOUT[6] PIN_U24 LED7 DOUT[7] PIN_T23 LED8

四、源代码如下: LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

entity register8 is port (

CLK : in std_logic; CLR : in std_logic;

D : in std_logic_vector(7 downto 0); DOUT: out std_logic_vector(7 downto 0) );

end register8;

architecture rt1 of register8 is begin

process(CLK,CLR) begin

if CLR = '0' then

DOUT <= \

elsif CLK'event and CLK = '1' then DOUT <= D; end if;

end process;

17

2.2 双向移位寄存器

一、实验目的

1.学习双向移位寄存器的设计,进一步了解、熟悉和掌握FPGA 开发软件Quartus II的使用方法

2.学习Verilog HDL 和VHDL 的编程方法 3.练习SignalTapII 的使用 二、实验内容

编写一个清零输入,可以双向移位的寄存器的Verilog 代码和VHDL 代码并仿真,编译下载验证 三、实验原理

前一个实验设计的寄存器只有寄存数据和代码的功能。有时为了处理数据,需要将寄存

器中的各位数据在移位控制信号的作用下,依次向高位或是低位移动移位。具有移位功能的

寄存器称为移位寄存器。

本实验就是设计一个双向的移位寄存器, 该寄存器可以对4位串行输入的数据进行移动

输出。另外,该寄存器还有一个异步清零端,低电平有效。还有一个load 装载数据的信号

输入,用于预置数据,还有一个控制左移或是右移的信号输入,其功能表; CLK load left_right 状态 x H x 置数 - L 0 右移 - L 1 左移

从原理图中可见,需要有1bit 装载位(load) 、1bit 清零位(clr) 、方向控制位l_r 和4bit数据选择位。装载位我们采用实验箱上的 SW1,清零位采用 SW2,方向控制位为SW3,

SW4‐SW7 作为数据输入端,LED1‐LED4 显示数据的输出。 引脚分配情况

设计端口 芯片引脚 开发平台模块 设计端口 芯片引脚 开发平台模块 load PIN_AA16 SW1 clr PIN_Y13 SW2 l_r PIN_W10 SW3 DIN[0] PIN_V10 SW4 DIN[1] PIN_Y11 SW5 DIN[2] PIN_V13 SW6 DIN[3] PIN_V24 SW7 DOUT[0] PIN_AB20 LED1 DOUT[1] PIN_AD24 LED2 DOUT[2] PIN_AB23 LED3 DOUT[3] PIN_AB18 LED4 四、源代码如下: 1)frediv.vhd library ieee;

use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all;

18

entity frediv is port (

clk :in std_logic; clkout:out std_logic );

end frediv;

architecture rt1 of frediv is begin

process(clk)

variable count:integer range 0 to 50000000; begin

if clk'event and clk = '1' then if count = 49999999 then count := 0; else

count := count + 1;

if count <= 24999999 then clkout <= '1'; else

clkout <= '0'; end if; end if; end if;

end process; end rt1;

2)shiftdata.vhd LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL; entity shiftdata is port (

clk : in std_logic; load : in std_logic; clr : in std_logic; l_r : in std_logic;

DIN : in std_logic_vector(3 downto 0); DOUT : out std_logic_vector(3 downto 0) );

end shiftdata;

architecture rt1 of shiftdata is signal clk_1Hz:std_logic;

signal data_r:std_logic_vector(3 downto 0);

19

component frediv port (

clk :in std_logic; clkout:out std_logic );

end component;

begin

U1:frediv port map(clk,clk_1Hz); process(load,l_r,clr,clk_1Hz,DIN) begin

if clr = '1' then data_r <= \ elsif load = '1' then data_r <= DIN;

elsif clk_1Hz'event and clk_1Hz = '1' then if l_r = '1' then

data_r <= data_r(2 downto 0) & '0'; else

data_r <= '0' & data_r(3 downto 1); end if; end if;

end process;

DOUT <= data_r; end rt1; 仿真结果

2.3 4位二进制加减法计数器

一、实验目的

1.学习二进制加减法计数器的设计,进一步了解、熟悉和掌握FPGA 开发软件Quartus II 的使用方法 。

2.学习Verilog HDL 和VHDL 的编程方法 。 3.学会使用Vector Wave 功能仿真 。 4.掌握使用多种方法分配管脚 。 二、实验内容

编写一个带预置输入, 清零输入, 可加/可减计数器的Verilog 代码和VHDL

20

代码并仿真,编译下载验证 。 三、实验原理

计数器是数字系统中用的较多的基本逻辑器件。它不仅能记录输入时钟脉冲的个数,还可以实现分频、定时等功能。 计数器的种类很多。按脉冲方式可以分为同步计数器和异步计数器;按进制可以分为二进制计数器和非二进制计数器;按计数过程数字的增减,可分为加计数器、减计数器和可逆计数器。

本实验就是设计一个4位二进制加减法计数器, 该计数器可以通过一个控制信号决定计数器时加计数还是减计数,另外,该寄存器还有一个清零输入,低电平有效。还有一个load装载数据的信号输入,用于预置数据;还有一个C的输出,用于计数器的级联。其功能表如

R CLK load up_down 状态 L x x x 置 零 H x L x 置 数 H - H 0 减 法 H - H 1 加 法

从原理图中可见,需要有1bit 装载位(load) 、1bit 清零位(clr) 、方向控制位up_down和4bit 数据选择位DIN[3..0]。装载位我们采用实验箱上的SW1,清零位采用SW2,方向控制位为SW3,SW4‐SW7 作为数据输入端,LED1‐LED4 显示数据的输出,LED5 为溢出标志位。 引脚分配情况

设计端口 芯片引脚 开发平台模块 设计端口 芯片引脚 开发平台模块 Clk PIN_P2 CLK1 load PIN_AA16 SW1 clr PIN_Y13 SW2 up_down PIN_W10 SW3 DIN[0] PIN_V10 SW4 DIN[1] PIN_Y11 SW5 DIN[2] PIN_V13 SW6 DIN[3] PIN_V24 SW7 DOUT[0] PIN_AB20 LED1 DOUT[1] PIN_AD24 LED2 DOUT[2] PIN_AB23 LED3 DOUT[3] PIN_AB18 LED4 c PIN_Y21 LED5 四、源代码如下: 1)frediv.vhd library ieee;

use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; entity frediv is port (

clk :in std_logic; clkout:out std_logic );

end frediv;

architecture rt1 of frediv is begin

21

process(clk)

variable count:integer range 0 to 50000000; begin

if clk'event and clk = '1' then if count = 49999999 then count := 0; else

count := count + 1;

if count <= 24999999 then clkout <= '1'; else

clkout <= '0'; end if; end if; end if;

end process; end rt1;

2)counter4.vhd LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

entity counter4 is port (

clk : in std_logic; load : in std_logic; clr : in std_logic; up_down: in std_logic;

DIN : in std_logic_vector(3 downto 0); DOUT : out std_logic_vector(3 downto 0); c : out std_logic );

end counter4;

architecture rt1 of counter4 is signal clk_1Hz:std_logic;

signal data_r:std_logic_vector(3 downto 0); component frediv port (

clk :in std_logic; clkout:out std_logic

22

);

end component;

begin

U1:frediv port map(clk,clk_1Hz);

DOUT <= data_r;

process(clk_1Hz,load,clr,up_down,DIN) begin

if clr = '1' then data_r <= \ elsif load = '1' then data_r <= DIN;

else if clk_1Hz'event and clk_1Hz = '1' then if up_down = '1' then if data_r = \ c <= '0';

data_r <= \ else

data_r <= data_r + 1; c<= '1'; end if; else

if data_r = \ c <= '0';

data_r <= \ else

data_r <= data_r ‐ 1;

c<= '1'; end if; end if; end if; end if;

Beijing Universal Pioneering Technology Co.,LTD. end process; end rt1; 仿真结果

23

2.4 十进制加减法计数器

一、实验目的

1.学习十进制加减法计数器的设计,进一步了解、熟悉和掌握FPGA 开发软件Quartus II 的使用方法。

2.学习Verilog HDL 和VHDL 的编程方法 。 3.学会使用Vector Wave 功能仿真 。 4.掌握使用多种方法分配管脚 。 二、实验内容

编写一个带预置输入、清零输入,可加/可减十进制计数器的Verilog 代码和VHDL 代码并仿真,编译下载验证 。 三、实验原理

上面的一个实验我们介绍了二进制计数器, 这个实验我们介绍非二进制计数器在非二进制计数器中我们最常用的就是十进制计数器。下面设计一个8421 码十进制计数器为例。 该计数器可以通过一个控制信号决定计数器时加计数还是减计数,另外,该寄存器还有一个清零输入,低电平有效。还有一个load 装载数据的信号输入,用于预置数据;还有一个C的输出,用于计数器的级联。 十进制计数器功能表

R CLK load up_down 状态 L x x x 置 零 H x L x 置 数 H - H 0 减 法 H - H 1 加 法

从原理图中可见,需要有1bit 装载位(load) 、1bit 清零位(clr) 、方向控制位up_down和4bit 数据选择位DIN[3..0]。装载位我们采用实验箱上的SW1,清零位采用SW2,方向控制位为SW3,SW4‐SW7 作为数据输入端,LED1‐LED4 显示数据的输出,LED5 为溢出标志位,同时数码管(seg[6..0])显示十进制数据。 引脚分配情况

设计端口 芯片引脚 开发平台模块 设计端口 芯片引脚 开发平台模块 clk PIN_P2 CLK1 load PIN_AA16 SW1 clr PIN_Y13 SW2 up_down PIN_W10 SW3 DIN[0] PIN_V10 SW4 DIN[1] PIN_Y11 SW5 DIN[2] PIN_V13 SW6 DIN[3] PIN_V24 SW7 DOUT[0] PIN_AB20 LED1 DOUT[1] PIN_AD24 LED2 DOUT[2] PIN_AB23 LED3 DOUT[3] PIN_AB18 LED4 seg[0] PIN_J13 7SEG_a seg[1] PIN_G15 7SEG_b seg[2] PIN_C16 7SEG_c seg[3] PIN_C15 7SEG_d seg[4] PIN_D15 7SEG_e seg[5] PIN_G13 7SEG_f seg[6] PIN_D17 7SEG_g seg[7] PIN_D16 7SEG_h dig PIN_D18 7SEG_bit_1 c PIN_Y21 LED5 四、源代码如下: 1)frediv.vhd

24

library ieee;

use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; entity frediv is port (

clk :in std_logic; clkout:out std_logic );

end frediv;

architecture rt1 of frediv is begin

process(clk)

variable count:integer range 0 to 50000000; begin

if clk'event and clk = '1' then if count = 49999999 then count := 0; else

count := count + 1;

if count <= 24999999 then clkout <= '1'; else

clkout <= '0'; end if; end if; end if;

end process; end rt1;

2)counter10.vhd LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

entity counter10 is port (

clk :in std_logic; load :in std_logic; clr :in std_logic; up_down:in std_logic;

DIN :in std_logic_vector(3 downto 0);

25

DOUT :out std_logic_vector(3 downto 0); seg :out std_logic_vector(7 downto 0); dig :out std_logic; c :out std_logic );

end counter10;

architecture rt1 of counter10 is signal clk_1Hz:std_logic;

signal data_r :std_logic_vector(3 downto 0); signal seg_r :std_logic_vector(6 downto 0);

component frediv port (

clk : in std_logic; clkout: out std_logic );

end component;

begin

U1:frediv port map(clk,clk_1Hz); DOUT <= data_r;

counter:process(clk_1Hz,load,clr,up_down,DIN,data_r) begin

if clr = '1' then

data_r <= \ elsif load = '1' then data_r <= DIN; else

if clk_1Hz'event and clk_1Hz = '1' then if up_down = '1' and data_r = 9 then c <= '1';

data_r <= \

elsif up_down = '0' and data_r = \ c <= '1';

data_r <= \ else

if up_down = '1' then data_r <= data_r + 1; c <= '0'; else

data_r <= data_r ‐ 1; c <= '1';

26

end if;

Beijing Universal Pioneering Technology Co.,LTD. end if;

end if; end if; end process;

seg7:process(data_r,seg_r) begin

dig <= '0';

seg_r <=(others => '1'); case data_r is

when \‐‐ 0

when \‐‐ 1 when \‐‐ 2 when \‐‐ 3 when \‐‐ 4 when \‐‐ 5 when \‐‐ 6 when \‐‐ 7 when \‐‐ 8 when \‐‐ 9 when \‐‐ A when \‐‐ b when \‐‐ c when \‐‐ d when \‐‐ E when \‐‐ F when others => NULL; end case;

seg <= '1' & (not seg_r); end process; end rt1; 仿真结果:

27

2.5 顺序脉冲发生器

一、实验目的

1.学习顺序脉冲发生器的设计,进一步了解、熟悉和掌握FPGA 开发软件Quartus II的使用方法 。

2.学习Verilog HDL 和VHDL 的编程方法 。 3.学会使用Vector Wave 功能仿真 。 4.掌握使用多种方法分配管脚 。 二、实验内容

编写一个顺序脉冲发生器的Verilog 代码和VHDL代码并仿真,编译下载验证 三、实验原理

在数字电路中, 能按一定时间、 一定顺序轮流输出脉冲波形的电路称为顺序脉冲发生器。 在数字系统中,常用来控制某些设备按照事先规定的顺序进行运算或操作。 顺序脉冲发生器也称脉冲分配器或节拍脉冲发生器,一般由计数器(包括移位寄存器型计数器)和译码器组成。作为时间基准的计数脉冲由计数器的输入端送入,译码器即将计数器状态译成输出端上的顺序脉冲,使输出端上的状态按一定时间、一定顺序轮流为1,或者轮流为0。顺序脉冲发生器分为计数器型顺序脉冲发生器和移位型顺序脉冲发生器。 计数器型顺序脉冲发生器一般用按自然态序计数的二进制计数器和译码器构成。 移位型顺序脉冲发生器由移位寄存器型计数器加译码电路构成。 其中环形计数器的输出就是顺序脉冲,故可不加译码电路就可直接作为顺序脉冲发生器。 从原理图中可见,因为核心板的时钟是 50MHz,所以必须先对进入的时钟进行分频。

分频文件在工程里面(为了便于软件仿真,在本程序里面只设置了50 分频,可以根据实际情况更改为50000000) 。清零位clr 采用SW2,LED1‐LED8 显示输出数据。 引脚分配情况

设计端口 芯片引脚 开发平台模块 设计端口 芯片引脚 开发平台模块 clk PIN_P2 CLK1 clr PIN_Y13 SW2 led[0] PIN_AB20 LED1 led[1] PIN_AD24 LED2 led[2] PIN_AB23 LED3 led[3] PIN_AB18 LED4 led[4] PIN_Y21 LED5 led[5] PIN_AD16 LED6 led[6] PIN_U24 LED7 led[7] PIN_T23 LED8 四、源代码如下: 1)frediv.vhd library ieee;

use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all;

entity frediv is

generic (N:integer:=50000000); port (

28

clkin : in std_logic; clkout: out std_logic );

end frediv;

architecture rt1 of frediv is begin

process(clkin)

variable count: integer range 0 to 50000000; begin

if(clkin'event and clkin='1')then if(count=N‐1)then count:=0; else

count:=count+1; end if;

if count<(integer(N/2))then clkout<='1'; else

clkout<='0'; end if; end if;

end process P1; end rt1;

2)pulsegen.vhd LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

entity pulsegen is port (

clr:in std_logic; clk:in std_logic;

Q :out std_logic_vector(7 downto 0) );

end pulsegen;

architecture rt1 of pulsegen is signal clk_r:std_logic;

signal temp :std_logic_vector(7 downto 0); component frediv port (

clkin : in std_logic;

29

clkout: out std_logic );

end component; begin

u1:frediv port map(clk,clk_r); process(clr,clk_r) begin

Beijing Universal Pioneering Technology Co.,LTD. if clr = '1' then

temp <= \

elsif clk_r'event and clk_r = '1' then temp <= temp(6 downto 0) & temp(7); end if;

Q <= temp; end process; end rt1; 仿真结果

2.6 序列信号发生器

一、实验目的

1.学习序列信号发生器的设计,进一步了解、熟悉和掌握FPGA 开发软件Quartus II的使用方法 。

2.学习Verilog HDL 和VHDL 的编程方法 。 3.学会使用Vector Wave 功能仿真 。 4.掌握使用多种方法分配管脚 。 二、实验内容

编写一个序列信号发生器的Verilog 代码和VHDL代码并仿真,编译下载验证。

三、实验原理

在数字电路中, 序列信号是指在同步脉冲作用下循环地产生一串周期性的二进制信号.能产生这种信号的逻辑器件就称为序列信号发生器.根据结构不同,它可分为反馈移位型和计数型两种。 移位型序列信号发生器是由移位寄存器和组合电路两部分构成,组合电路的输出,作为移位寄存器的串行输入。 计数型序列信号发生器能产生多组序列信号,这是移位型发生器所没有的功能.计数型序列信

30

号发生器是由计数器和组合电路构成的。 本实验的目的就是设计一个序列信号发生器。序列信号发生器的原理图如下所示

设计产生序列11100100、11100100、???的计数型序列信号发生器电路。从原理图中可见,因为核心板的时钟是 50MHz,所以必须先对进入的始终进行分频。分频文件在工程里面(为了便于软件仿真,在本程序里面只设置了50 分频,可以更具实际情况更改为50000000) 。清零位clr 采用SW2,LED1 显示输出数据。 引脚分配情况

设计端口 芯片引脚 开发平台模块 设计端口 芯片引脚 开发平台模块 clk PIN_P2 CLK1 clr PIN_Y13 SW2 led[0] PIN_AB20 LED1 四、实验步骤 源代码如下: 1)frediv.vhd library ieee;

use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all;

entity frediv is

generic (N:integer:=50); //注意:核心板上的时钟是50MHz,这里可以将N 改成

//50000000,这样分频值即为1s,更精确;这里写50 只 //是为了能够在QuartusII进行软件仿真 port (

clkin : in std_logic; clkout: out std_logic );

end frediv;

architecture rt1 of frediv is begin

process(clkin)

variable count: integer range 0 to 60; begin

if(clkin'event and clkin='1')then if(count=N‐1)then count:=0;

31

else

count:=count+1; end if;

if count<(integer(N/2))then clkout<='1'; else

clkout<='0'; end if; end if;

end process P1; end rt1;

2)seqgen.vhd library ieee;

use ieee.std_logic_1164.all;

entity seqgen is

port (

clk: in std_logic; clr: in std_logic; q : out std_logic );

end seqgen;

architecture rt1 of seqgen is

signal temp:std_logic_vector(7 downto 0); signal clk_r:std_logic; component frediv port (

clkin : in std_logic; clkout: out std_logic );

end component; begin

u1: frediv port map(clk,clk_r); process(clr,clk_r) begin

Beijing Universal Pioneering if clr = '1' then

temp <= \

elsif clk_r'event and clk_r = '1' then

temp <= temp(6 downto 0) & temp(7); end if;

Technology 32

Co.,LTD.

q <= temp(0); end process; end rt1;

仿真结果

2.7 分频器

一、实验目的

1.学习分频器的设计,进一步了解、熟悉和掌握FPGA 开发软件Quartus II 的使用方法 。

2.学习Verilog HDL 和VHDL 的编程方法 。 3.学会使用Vector Wave 功能仿真 。 4.掌握使用多种方法分配管脚 。 二、实验内容

编写一个分频器的Verilog 代码和VHDL 代码并仿真,编译下载验证 三、实验原理

在数字电路中, 时钟信号的分频是很常见的电路。分频器除了可以对时钟信号频率做除以二的计算外,分频器同时很类似涟波计数器。 涟波计数器是计数器的一种,它属于异步设计。因为触发器并非皆由同一个时钟信号同步操作,所以它非常节省电路面积。 本实验要设一个带选择的分频时钟,SEL[1:0]用于选择是几分频。分频器设计原理框 图如图所示:

从原理图中可见, 核心板的时钟是50MHz, 通过sel[1:0]选择分频数,00:不分频;01:12.5M分频;10:25M 四分频;11:50M 分频。采用SW1‐SW2 设置分频值,SW3 复位。LED1 为时钟的输出,通过调整SW1、SW2,可以得到不同的闪烁频率。 引脚分配情况

设计端口 芯片引脚 开发平台模块 设计端口 芯片引脚 开发平台模块 clk PIN_P2 CLK1 rst PIN_W10 SW3 sel[1] PIN_Y13 SW2 sel[0] PIN_AA16 SW1 clkout PIN_AB20 LED1

33

四、源代码如下: library ieee;

use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all;

entity frediv is port (

clk :in std_logic; rst :in std_logic;

sel :in std_logic_vector(1 downto 0); clkout:out std_logic );

end frediv;

architecture rt1 of frediv is begin

process(rst,clk)

variable cn1,cn2,cn3:integer range 0 to 50000000; begin

if rst = '1' then clkout <= '0';

elsif clk'event and clk = '1' then if sel = \

if cn1 = 12499999 then cn1 := 0; else

cn1 := cn1 + 1;

if cn1 <= 6249999 then clkout <= '1'; else

clkout <= '0'; end if; end if;

elsif sel = \

if cn2 = 24999999 then cn2 := 0; else

cn2 := cn2 + 1;

if cn2 <= 12499999 then clkout <= '1'; else

clkout <= '0';

34

end if; end if;

elsif sel = \

if cn3 = 49999999 then cn3 := 0; else

cn3 := cn3 + 1;

if cn3 <= 24999999 then clkout <= '1'; else

clkout <= '0'; end if; end if; else

clkout <= clk; end if; end if;

end process; end rt1;

35

本文来源:https://www.bwwdw.com/article/2oi.html

Top