本节摘要

这是本学期第四节高速EDA设计课程,本节课的主要内容是结合前面所学Verilog的入门以及配合老师下发的Altera™公司的DE0开发板,去实地操作的将要实现的一些简单的逻辑功能通过软硬件配合的方式实现,并在这个过程中进一步熟悉Verilog语法和Quartus软件的使用。
本篇博客中代码和操作步骤部分基本来自于杜老师实验教学网站。 FPGA 电路开发入门实验

ALTERA DE0开发板驱动安装

在进行这次实验工作之前,必须进行很重要的一步,安装驱动板的驱动程序。步骤如下

  1. 打开设备管理器面板,在设备列表的其他设备中找到USB-Blaster

  2. 右键点击USB-Blaster,选择列表中的更新驱动程序

  3. 在弹出的窗口中选择-浏览我的计算机以查找驱动程序软件

  4. 选择安装目录中的usb-blaster文件夹,具体路径为quartus\drivers\usb-blaster

  1. 点击下一步,等待驱动安装完成,此时就能在usb列表中看到该开发板已经能正确识别,驱动安装成功

开发板常用管脚对应说明

本次课程需要使用开发板上一部分按钮(button)、开关(switch)、发光二极管(LED)以及时钟电路clk,下面给出这些器件所对应的管脚示意图:




项目创建、编译和下载

以老师给出例子中的学生实验为例,即用1个拨码开关控制所有的LED灯亮灭
首先和之前的任务相同,在quartus 中创建一个项目文件

在项目中新建一个bdf文件,并在网格中放置一个input和十个output管脚,并将他们器件连接起来,并分别将其命名为开关SW和发光二极管LED0-9

接下来打开pin planer面板进行指派管脚,并按照上面已知的开发板管脚对应图,将input与开发板最右侧的开关SW0连接,output与所有LED连接

并在设置中将没有用到的管脚设定为三态

接下来进行编译,并将开发板接点,并通过USB连接到电脑,在顶栏中先点击编译接着点击打开下载面板


点击下载面板左侧的start按钮,将程序烧录进开发板等待右上角的progress进度条加载至100%

此时将开发板的SW0开关打到闭合状态,会发现LED0-9十个LED均被点亮,实验完成

译码器组合逻辑

2个2-4译码器实现两组SW分别控制其对应的LED组

将已经写好的2-4译码器模块的Verilog代码文件rtl_module.v加入项目

2-4译码器的Verilog原型代码如下所示

module dec_2to4(
IN  ,
OUT);
input  [2-1:0] IN  ;
output [4-1:0] OUT ;reg [4-1:0] OUT ;always @ (IN) begincase(IN)2'b00: OUT = 4'b 0001;2'b01: OUT = 4'b 0010;2'b10: OUT = 4'b 0100;2'b11: OUT = 4'b 1000;endcase
endendmodule // module dec_2to4;

右键点击文件列表里的rtl_module.v选择列表中的Create Symbol Files For Current File为代码文件创建符号以便在BDF文件中调用

新建一个bdf文件,并搭建实现该逻辑所需要的电路

通过Pin Planer将开关与发光二极管LED管脚连接指派

编译下载后验证实验

写出3-8译码器,完成拨码开关实验

根据已经给出的2-4译码器的Verilog原型代码,写出3-8译码器的Verilog代码并为其创建符号,如下所示

module dec_3to8(
IN  ,
OUT);
input  [3-1:0] IN  ;
output [8-1:0] OUT ;reg [8-1:0] OUT ;always @ (IN) begincase(IN)3'b000: OUT = 8'b 00000001;3'b001: OUT = 8'b 00000010;3'b010: OUT = 8'b 00000100;3'b011: OUT = 8'b 00001000;3'b100: OUT = 8'b 00010000;3'b101: OUT = 8'b 00100000;3'b110: OUT = 8'b 01000000;3'b111: OUT = 8'b 10000000;endcase
endendmodule // module dec_3to8;

新建一个bdf格式文件画出实验所需电路图如下所示,并指派管脚


编译下载,并拨动开关验证

译码器控制7段译码器

查阅手册中的7段译码器管脚对应关系,用4个拨码开关控制一个7段译码器的数字,从0-9-A-F,共16个数字和字母
在已知的译码器的Verilog原型代码上改动,得到实验要求的译码器的Verilog代码,如下

module bcd7seg(
IN  ,
OUT);
input  [4-1:0] IN  ;
output [7-1:0] OUT ;reg [7-1:0] OUT ;always @ (IN) begincase(IN)4'b0000: OUT = 7'b 11000000;//04'b0001: OUT = 7'b 11111001;//14'b0010: OUT = 7'b 10100100;//24'b0011: OUT = 7'b 10110000;//34'b0100: OUT = 7'b 10011001;//44'b0101: OUT = 7'b 10010010;//54'b0110: OUT = 7'b 10000010;//64'b0111: OUT = 7'b 11111000;//74'b1000: OUT = 7'b 10000000;//84'b1001: OUT = 7'b 10010000;//94'b1010: OUT = 7'b 10001000;//A4'b1011: OUT = 7'b 10000011;//B4'b1100: OUT = 7'b 11000110;//C4'b1101: OUT = 7'b 10100001;//D4'b1110: OUT = 7'b 10000110;//E4'b1111: OUT = 7'b 10001110;//Fdefault: OUT = 7'b 10000000;endcase
endendmodule // module dec_3to8;

新建一个bdf文件,画出实现逻辑所需电路图,并指派管脚


编译下载,并拨动开关进行验证

计数器、波形仿真、SignalTap

学生实验一

设计一个0-17的计数器,当计数值为17的时候,OV输出1,其他输出0

根据设计中老师给出的例子,修改部分代码及电路图实现如下:

module cnt_0to17(CLK   ,   // clockCNTVAL,   // counter valueOV    );  // overflow
input CLK;
output [5-1:0] CNTVAL;
output OV;reg [5-1:0] CNTVAL;
reg OV;always @ (posedge CLK) beginif(CNTVAL >= 17)CNTVAL <= 0;elseCNTVAL <= CNTVAL + 1'b1;
endalways @ (CNTVAL) beginif(CNTVAL == 17)OV = 1'b1;elseOV = 1'b0;
endendmodule   // module cnt_0to17

编译运行,没有问题之后将程序下载到开发板中,利用SignalTap进行观察验证

在signaltap中可以观测到在OUT计数到17(十六进制为11)时,OV输出了1,实验无误。

学生实验二

修改输出逻辑,当计数值为0-8时,OV输出0,9-17时OV输出1
要完成这个实验,只需修改一部分代码即可

module cnt_0to17(CLK   ,   // clockCNTVAL,   // counter valueOV    );  // overflow
input CLK;
output [5-1:0] CNTVAL;
output OV;reg [5-1:0] CNTVAL;
reg OV;always @ (posedge CLK) beginif(CNTVAL >= 17)CNTVAL <= 0;elseCNTVAL <= CNTVAL + 1'b1;
endalways @ (CNTVAL) beginif(CNTVAL >= 9)OV = 1'b1;elseOV = 1'b0;
endendmodule   // module cnt_0to17

电路图不做变更

编译运行无误后,下载到开发板中,通过signaltap抓取信号,结果如下,可以发现,当OUT输出为0-8时,OV输出为0,9-17时,OV输出为1。结果符合要求。

时间基准电路和带使能的多周期计数器

本实验的目的在于设计时间基准电路和带使能的多周期计数器
• 时间基准电路生成同步时间基准信号
• 多周期计数器对时间基准信号进行计数
• 本质上是一个两级计数器级联的的电路结构
– 第一级计数器生成时间基准信号
– 第二级计数器用时间基准信号作为计数使能

实验一

把后级计数器的计数范围改为0-15。
参考代码如下,运行编译后创建器件,并搭建电路图

module cnt_sync(CLK   ,   // clockCNTVAL,   // counter valueOV    );  // overflow
input CLK;
output [32-1:0] CNTVAL;
output OV;
parameter MAX_VAL = 25_000_000;
reg [32-1:0] CNTVAL;
reg OV;always @ (posedge CLK) beginif(CNTVAL >= MAX_VAL)CNTVAL <= 0;elseCNTVAL <= CNTVAL + 1'b1;
endalways @ (CNTVAL) beginif(CNTVAL == MAX_VAL)OV = 1'b1;elseOV = 1'b0;
endendmodule   // 时间基准电路部分
module cnt_en_0to15(CLK   ,   // clockCNTVAL,   // counter valueEN    ,OV    );  // overflow
input CLK;
input EN;
output [4-1:0] CNTVAL;
output OV;reg [4-1:0] CNTVAL;
reg OV;always @ (posedge CLK) beginif(EN) begin  // work enableif(CNTVAL >= 15)CNTVAL <= 0;elseCNTVAL <= CNTVAL + 1'b1;endelseCNTVAL <= CNTVAL ;  // hold same value
endalways @ (CNTVAL) beginif(CNTVAL == 15)OV = 1'b1;elseOV = 1'b0;
endendmodule   // module cnt_en_0to15

电路图搭建如下

编译下载之后,开发板的LED0-LED4开始闪烁并开始二进制计数,每计数记满15,最左侧的LED亮一次。
过程如下图所示。

实验二

把计数器的0-15计数值经过译码,在DE0 的HEX LED上显示成0-9-A-F的十六 进制数

在上例的基础上,编写一个新的模块,新模块需要有译码功能,可以将0-15计数器输出的数值译码为七段数码管要显示的16个字符。参考代码如下

module cnt_sync(CLK   ,   // clockCNTVAL,   // counter valueOV    );  // overflow
input CLK;
output [32-1:0] CNTVAL;
output OV;
parameter MAX_VAL = 25_000_000;
reg [32-1:0] CNTVAL;
reg OV;always @ (posedge CLK) beginif(CNTVAL >= MAX_VAL)CNTVAL <= 0;elseCNTVAL <= CNTVAL + 1'b1;
endalways @ (CNTVAL) beginif(CNTVAL == MAX_VAL)OV = 1'b1;elseOV = 1'b0;
endendmodule   // module cnt_en_0to9
module cnt_en_0to15(CLK   ,   // clockCNTVAL,   // counter valueEN    ,OV    );  // overflow
input CLK;
input EN;
output [4-1:0] CNTVAL;
output OV;reg [4-1:0] CNTVAL;
reg OV;always @ (posedge CLK) beginif(EN) begin  // work enableif(CNTVAL >= 15)CNTVAL <= 0;elseCNTVAL <= CNTVAL + 1'b1;endelseCNTVAL <= CNTVAL ;  // hold same value
endalways @ (CNTVAL) beginif(CNTVAL == 15)OV = 1'b1;elseOV = 1'b0;
end
endmodule   // module cnt_en_0to15
module led7seg(
IN  ,
OUT);
input  [4-1:0] IN  ;
output [8-1:0] OUT ;reg [8-1:0] OUT ;always @ (IN) begincase(IN)4'b0000: OUT = 7'b 11000000;//04'b0001: OUT = 7'b 11111001;//14'b0010: OUT = 7'b 10100100;//24'b0011: OUT = 7'b 10110000;//34'b0100: OUT = 7'b 10011001;//44'b0101: OUT = 7'b 10010010;//54'b0110: OUT = 7'b 10000010;//64'b0111: OUT = 7'b 11111000;//74'b1000: OUT = 7'b 10000000;//84'b1001: OUT = 7'b 10010000;//94'b1010: OUT = 7'b 10001000;//A4'b1011: OUT = 7'b 10000011;//B4'b1100: OUT = 7'b 11000110;//C4'b1101: OUT = 7'b 10100001;//D4'b1110: OUT = 7'b 10000110;//E4'b1111: OUT = 7'b 10001110;//Fdefault: OUT = 7'b 10000000;endcase
end
endmodule //七段数码管译码模块

为代码创建符号,并搭建电路指派管脚如下图

将程序下载到开发板中,可以看到七段数码管随着时间进行自动将0-9-A-F显示出来。

实验三

修改时间基准发生器,设计一个使用2个HEX LED,精度为0.1秒,范围为0-9.9秒的计时秒表
根据上面两个例子,修改模块代码及电路图,代码如下:

module cnt_sync(CLK   ,   // clockCNTVAL,   // counter valueOV    );  // overflow
input CLK;
output [32-1:0] CNTVAL;
output OV;
parameter MAX_VAL = 5_000_000;
reg [32-1:0] CNTVAL;
reg OV;always @ (posedge CLK) beginif(CNTVAL >= MAX_VAL)CNTVAL <= 0;elseCNTVAL <= CNTVAL + 1'b1;
endalways @ (CNTVAL) beginif(CNTVAL == MAX_VAL)OV = 1'b1;elseOV = 1'b0;
endendmodule   // module cnt_sync
module cnt_en_0to9(CLK   ,   // clockCNTVAL,   // counter valueEN    ,OV    );  // overflow
input CLK;
input EN;
output [4-1:0] CNTVAL;
output OV;reg [4-1:0] CNTVAL;
reg OV;always @ (posedge CLK) beginif(EN==1) begin  // work enableif(CNTVAL >= 9)CNTVAL <= 0; elseCNTVAL <= CNTVAL + 1'b1;endelseCNTVAL <= CNTVAL ;  // hold same value
end
always @ (CNTVAL) beginif(CNTVAL == 9)OV = 1'b1;elseOV = 1'b0;
endendmodule   // module cnt_en_0to9

module bcd7seg(
IN  ,
OUT );
input  [4-1:0] IN  ;
output reg[8-1:0] OUT ;
always @ (IN) begincase(IN)
4'b0000:OUT=8'b01000000;
4'b0001:OUT=8'b01111001;
4'b0010:OUT=8'b00100100;
4'b0011:OUT=8'b00110000;
4'b0100:OUT=8'b00011001;
4'b0101:OUT=8'b00010010;
4'b0110:OUT=8'b00000010;
4'b0111:OUT=8'b01111000;
4'b1000:OUT=8'b00000000;
4'b1001:OUT=8'b00010000;endcase
endendmodule // module bcd7seg;module bcd7seg1(
IN,
OUT,
OV);
input wire [4-1:0] IN;
output reg [8-1:0] OUT;
output reg OV;
always @ (IN) begin
case (IN)
4'b0000:OUT=8'b01000000;
4'b0001:OUT=8'b01111001;
4'b0010:OUT=8'b00100100;
4'b0011:OUT=8'b00110000;
4'b0100:OUT=8'b00011001;
4'b0101:OUT=8'b00010010;
4'b0110:OUT=8'b00000010;
4'b0111:OUT=8'b01111000;
4'b1000:OUT=8'b00000000;
4'b1001:OUT=8'b00010000;
endcase
end
endmodule       //module bcd4to82

搭建电路图如下所示:

运行编译,并下载进开发板,观察开发板上数码管变化,变化过程如下图所示

做完这个实验,本次的FPGA实验译码器部分任务就已经完成

多周期时序逻辑 移位寄存电路

设计时间基准电路和带使能的多周期移位寄存器
• 电路工作在50MHz
• 在每个时间基准信号有效的时钟周期
– 把一个拨码开关的状态值移位输入到寄存器的最低位
– 顺序移动移位寄存器的值
– 寄存器的每个比特送至一个LED灯上显示
并设计新的功能
– 在原有的电路基础上,添加方向选择功能。
– SW0仍然是移位寄存器组的输入
– 使用SW1开关,控制移位寄存的方向
– 从实验现象上应当能够看到,SW1可以控制LED闪烁的
移动方向,以及控制SW0值的对LED组的输入位置(即从LED组的最左边或是最右边)
在老师给出示例的基础上,进行修改,实现代码如下所示:

 串入并出移位寄存器  /
module shift_reg_SIPO(RST   ,   // 异步复位, 高有效CLK   ,   // 时钟,上升沿有效EN    ,   // 输入数据串行移位使能EN_L  ,IN    ,   // 输入串行数据OUT   );  // 并行输出数据
parameter SHLEN = 6;
input RST, CLK, EN, EN_L;
input IN;
output[SHLEN-1:0] OUT;
reg [SHLEN-1:0] shift_R;assign OUT[SHLEN-1:0] = shift_R[SHLEN-1:0];
// 时序逻辑 根据输入使能进行串行移位
// shift_R 会被编译为D触发器
always @ (posedge CLK or posedge RST) beginif(RST) beginshift_R[SHLEN-1:0] <= 0;endelse beginif(EN) begin // 串行移位的使能有?if(EN_L) beginshift_R[SHLEN-2:0] <= shift_R[SHLEN-1:1] ;shift_R[SHLEN-1]<= IN;endelse beginshift_R[SHLEN-1:1] <= shift_R[SHLEN-2:0];shift_R[0]<= IN;endendelse begin // 使能无效保持不动shift_R[SHLEN-1:0] <= shift_R[SHLEN-1:0];endend
end // always
endmodule
 时间基准计数器  /
module cnt_sync(CLK   ,   // clockCNTVAL,   // counter valueOV    );  // overflow
input CLK;
output [32-1:0] CNTVAL;
output OV;
parameter MAX_VAL = 25_000_000;
reg [32-1:0] CNTVAL;
reg OV;always @ (posedge CLK) beginif(CNTVAL >= MAX_VAL)CNTVAL <= 0;elseCNTVAL <= CNTVAL + 1'b1;
endalways @ (CNTVAL) beginif(CNTVAL == MAX_VAL)OV = 1'b1;elseOV = 1'b0;
end
endmodule   

搭建电路图如下

编译运行程序,并将程序下载进开发板中,拨动开关,观察LED闪烁现象

可以发现,当仅拨动开关SW0的时候,移位寄存器由右向左开始运行
当SW0与SW1同时拨动后,移位寄存器由左向右开始运行,功能成功实现。

计数器、ROM和DDS

• 认识ROM
• 用计数器生成地址、读叏ROM数据
• 用SignalTAP观察ROM的输出波形
• 理解二进制补码和无符号数
• 修改计数增量值,观察波形变化,思考输出频率
和计数器增量值的关系。
实验中涉及到所需的实现代码如下:

实验一

// ************************************************************** //
// FILE    : sine_rom.v
// DSCP    : sine_rom FILE
// ABOUT   : auto generated rom file by gen_rom_rtl.m
// DATE    : 14-Nov-2013 16:29:45
// ************************************************************** //
// module sine_rom()
module sine_rom(CLK    ,           // clockRA     ,           // read addressRD     );          // read data
input          CLK;
input  [6  :0] RA;
output [7  :0] RD;
reg    [7  :0] RD;
always @ (posedge CLK)case(RA)7 'd 0     :RD = #1 8 'b 00000000; //      0 0x0 7 'd 1     :RD = #1 8 'b 00000110; //      6 0x6 7 'd 2     :RD = #1 8 'b 00001100; //     12 0xC 7 'd 3     :RD = #1 8 'b 00010010; //     18 0x12 7 'd 4     :RD = #1 8 'b 00011000; //     24 0x18 7 'd 5     :RD = #1 8 'b 00011110; //     30 0x1E 7 'd 6     :RD = #1 8 'b 00100100; //     36 0x24 7 'd 7     :RD = #1 8 'b 00101010; //     42 0x2A 7 'd 8     :RD = #1 8 'b 00110000; //     48 0x30 7 'd 9     :RD = #1 8 'b 00110110; //     54 0x36 7 'd 10    :RD = #1 8 'b 00111011; //     59 0x3B 7 'd 11    :RD = #1 8 'b 01000001; //     65 0x41 7 'd 12    :RD = #1 8 'b 01000110; //     70 0x46 7 'd 13    :RD = #1 8 'b 01001011; //     75 0x4B 7 'd 14    :RD = #1 8 'b 01010000; //     80 0x50 7 'd 15    :RD = #1 8 'b 01010101; //     85 0x55 7 'd 16    :RD = #1 8 'b 01011001; //     89 0x59 7 'd 17    :RD = #1 8 'b 01011110; //     94 0x5E 7 'd 18    :RD = #1 8 'b 01100010; //     98 0x62 7 'd 19    :RD = #1 8 'b 01100110; //    102 0x66 7 'd 20    :RD = #1 8 'b 01101001; //    105 0x69 7 'd 21    :RD = #1 8 'b 01101100; //    108 0x6C 7 'd 22    :RD = #1 8 'b 01110000; //    112 0x70 7 'd 23    :RD = #1 8 'b 01110010; //    114 0x72 7 'd 24    :RD = #1 8 'b 01110101; //    117 0x75 7 'd 25    :RD = #1 8 'b 01110111; //    119 0x77 7 'd 26    :RD = #1 8 'b 01111001; //    121 0x79 7 'd 27    :RD = #1 8 'b 01111011; //    123 0x7B 7 'd 28    :RD = #1 8 'b 01111100; //    124 0x7C 7 'd 29    :RD = #1 8 'b 01111101; //    125 0x7D 7 'd 30    :RD = #1 8 'b 01111110; //    126 0x7E 7 'd 31    :RD = #1 8 'b 01111110; //    126 0x7E 7 'd 32    :RD = #1 8 'b 01111111; //    127 0x7F 7 'd 33    :RD = #1 8 'b 01111110; //    126 0x7E 7 'd 34    :RD = #1 8 'b 01111110; //    126 0x7E 7 'd 35    :RD = #1 8 'b 01111101; //    125 0x7D 7 'd 36    :RD = #1 8 'b 01111100; //    124 0x7C 7 'd 37    :RD = #1 8 'b 01111011; //    123 0x7B 7 'd 38    :RD = #1 8 'b 01111001; //    121 0x79 7 'd 39    :RD = #1 8 'b 01110111; //    119 0x77 7 'd 40    :RD = #1 8 'b 01110101; //    117 0x75 7 'd 41    :RD = #1 8 'b 01110010; //    114 0x72 7 'd 42    :RD = #1 8 'b 01110000; //    112 0x70 7 'd 43    :RD = #1 8 'b 01101100; //    108 0x6C 7 'd 44    :RD = #1 8 'b 01101001; //    105 0x69 7 'd 45    :RD = #1 8 'b 01100110; //    102 0x66 7 'd 46    :RD = #1 8 'b 01100010; //     98 0x62 7 'd 47    :RD = #1 8 'b 01011110; //     94 0x5E 7 'd 48    :RD = #1 8 'b 01011001; //     89 0x59 7 'd 49    :RD = #1 8 'b 01010101; //     85 0x55 7 'd 50    :RD = #1 8 'b 01010000; //     80 0x50 7 'd 51    :RD = #1 8 'b 01001011; //     75 0x4B 7 'd 52    :RD = #1 8 'b 01000110; //     70 0x46 7 'd 53    :RD = #1 8 'b 01000001; //     65 0x41 7 'd 54    :RD = #1 8 'b 00111011; //     59 0x3B 7 'd 55    :RD = #1 8 'b 00110110; //     54 0x36 7 'd 56    :RD = #1 8 'b 00110000; //     48 0x30 7 'd 57    :RD = #1 8 'b 00101010; //     42 0x2A 7 'd 58    :RD = #1 8 'b 00100100; //     36 0x24 7 'd 59    :RD = #1 8 'b 00011110; //     30 0x1E 7 'd 60    :RD = #1 8 'b 00011000; //     24 0x18 7 'd 61    :RD = #1 8 'b 00010010; //     18 0x12 7 'd 62    :RD = #1 8 'b 00001100; //     12 0xC 7 'd 63    :RD = #1 8 'b 00000110; //      6 0x6 7 'd 64    :RD = #1 8 'b 00000000; //      0 0x0 7 'd 65    :RD = #1 8 'b 11111010; //     -6 0xFA 7 'd 66    :RD = #1 8 'b 11110100; //    -12 0xF4 7 'd 67    :RD = #1 8 'b 11101110; //    -18 0xEE 7 'd 68    :RD = #1 8 'b 11101000; //    -24 0xE8 7 'd 69    :RD = #1 8 'b 11100010; //    -30 0xE2 7 'd 70    :RD = #1 8 'b 11011100; //    -36 0xDC 7 'd 71    :RD = #1 8 'b 11010110; //    -42 0xD6 7 'd 72    :RD = #1 8 'b 11010000; //    -48 0xD0 7 'd 73    :RD = #1 8 'b 11001010; //    -54 0xCA 7 'd 74    :RD = #1 8 'b 11000101; //    -59 0xC5 7 'd 75    :RD = #1 8 'b 10111111; //    -65 0xBF 7 'd 76    :RD = #1 8 'b 10111010; //    -70 0xBA 7 'd 77    :RD = #1 8 'b 10110101; //    -75 0xB5 7 'd 78    :RD = #1 8 'b 10110000; //    -80 0xB0 7 'd 79    :RD = #1 8 'b 10101011; //    -85 0xAB 7 'd 80    :RD = #1 8 'b 10100111; //    -89 0xA7 7 'd 81    :RD = #1 8 'b 10100010; //    -94 0xA2 7 'd 82    :RD = #1 8 'b 10011110; //    -98 0x9E 7 'd 83    :RD = #1 8 'b 10011010; //   -102 0x9A 7 'd 84    :RD = #1 8 'b 10010111; //   -105 0x97 7 'd 85    :RD = #1 8 'b 10010100; //   -108 0x94 7 'd 86    :RD = #1 8 'b 10010000; //   -112 0x90 7 'd 87    :RD = #1 8 'b 10001110; //   -114 0x8E 7 'd 88    :RD = #1 8 'b 10001011; //   -117 0x8B 7 'd 89    :RD = #1 8 'b 10001001; //   -119 0x89 7 'd 90    :RD = #1 8 'b 10000111; //   -121 0x87 7 'd 91    :RD = #1 8 'b 10000101; //   -123 0x85 7 'd 92    :RD = #1 8 'b 10000100; //   -124 0x84 7 'd 93    :RD = #1 8 'b 10000011; //   -125 0x83 7 'd 94    :RD = #1 8 'b 10000010; //   -126 0x82 7 'd 95    :RD = #1 8 'b 10000010; //   -126 0x82 7 'd 96    :RD = #1 8 'b 10000001; //   -127 0x81 7 'd 97    :RD = #1 8 'b 10000010; //   -126 0x82 7 'd 98    :RD = #1 8 'b 10000010; //   -126 0x82 7 'd 99    :RD = #1 8 'b 10000011; //   -125 0x83 7 'd 100   :RD = #1 8 'b 10000100; //   -124 0x84 7 'd 101   :RD = #1 8 'b 10000101; //   -123 0x85 7 'd 102   :RD = #1 8 'b 10000111; //   -121 0x87 7 'd 103   :RD = #1 8 'b 10001001; //   -119 0x89 7 'd 104   :RD = #1 8 'b 10001011; //   -117 0x8B 7 'd 105   :RD = #1 8 'b 10001110; //   -114 0x8E 7 'd 106   :RD = #1 8 'b 10010000; //   -112 0x90 7 'd 107   :RD = #1 8 'b 10010100; //   -108 0x94 7 'd 108   :RD = #1 8 'b 10010111; //   -105 0x97 7 'd 109   :RD = #1 8 'b 10011010; //   -102 0x9A 7 'd 110   :RD = #1 8 'b 10011110; //    -98 0x9E 7 'd 111   :RD = #1 8 'b 10100010; //    -94 0xA2 7 'd 112   :RD = #1 8 'b 10100111; //    -89 0xA7 7 'd 113   :RD = #1 8 'b 10101011; //    -85 0xAB 7 'd 114   :RD = #1 8 'b 10110000; //    -80 0xB0 7 'd 115   :RD = #1 8 'b 10110101; //    -75 0xB5 7 'd 116   :RD = #1 8 'b 10111010; //    -70 0xBA 7 'd 117   :RD = #1 8 'b 10111111; //    -65 0xBF 7 'd 118   :RD = #1 8 'b 11000101; //    -59 0xC5 7 'd 119   :RD = #1 8 'b 11001010; //    -54 0xCA 7 'd 120   :RD = #1 8 'b 11010000; //    -48 0xD0 7 'd 121   :RD = #1 8 'b 11010110; //    -42 0xD6 7 'd 122   :RD = #1 8 'b 11011100; //    -36 0xDC 7 'd 123   :RD = #1 8 'b 11100010; //    -30 0xE2 7 'd 124   :RD = #1 8 'b 11101000; //    -24 0xE8 7 'd 125   :RD = #1 8 'b 11101110; //    -18 0xEE 7 'd 126   :RD = #1 8 'b 11110100; //    -12 0xF4 7 'd 127   :RD = #1 8 'b 11111010; //     -6 0xFA default : RD = #1 0;endcase
endmodule 
module cnt_incr(CLK   ,   // clockINCR  ,   // counter increase value CNTVAL);  // counter value
input CLK;
input  [7-1:0] INCR;
output [7-1:0] CNTVAL;reg [7-1:0] CNTVAL;always @ (posedge CLK) beginCNTVAL <= INCR + CNTVAL;
end
endmodule   // module cnt_incr

搭建实验电路,并指派管脚如下所示:

拨动开关,调整不同的计数值,观察SignalTap抓取的波形变化情况,如下所示





总结回答:
1.拨动开关观察不同频率的正弦波,得到的正弦波频率与计数器增量值的对应关系是?
答:随着计数值的增加,正弦波频率也增加

2.其中能得到的最低频率的正弦波是多少?设该频率为 f1
答:正弦波信号一个周期采样512点,电路的工作时钟为50MHz,即是采样周期为所以

3.能有什么方法得到比F1频率还低的正弦波 ?
答:增加计数值

实验二

• 修改电路,把计数器的计数值和输入的计数增量信号都改为9比特,
计数值的高7位连接ROM的地址线,低2位悬空。如上图所示。
– 把9比特的计数器增量输入信号连接到9个拨码开关上
– 根据理论分析和实验结果,回答以下问题
– 请回答,你能得到的正弦波频率和计数器增量值的对应关系是什么?
• 设输出正弦波频率为f1,电路系统时钟为 fsys, 计数器步进增量为 CNT
• 请给出 f1 和 fsys 以及 CNT 关系的数学表达式
– 请回答,在这种连接方式下,你能得到的最低频率的正弦波是多少
修改电路如下所示:

总结

至此,本节课所有的实验任务基本都做完了,通过这节课的学习,我们进一步掌握了在一些基础Verilog代码基础上组合完成模块的进阶使用和变换,并能通过开发板与软件的软硬结合,实现一些的逻辑功能。对Quatus的使用更加熟练。
实验时间:2019.11.10-11.17
报告时间:2019.11.17-11.24

高速EDA设计课程报告(三)相关推荐

  1. 基于C#+unity的3D平衡球游戏设计 课程报告+展示PPT+项目源码

    资源下载地址:https://download.csdn.net/download/sheziqiong/85705538 资源下载地址:https://download.csdn.net/downl ...

  2. 高速PCB设计指南系列(三)

    第一篇  高密度(HD)电路的设计 本文介绍,许多人把芯片规模的BGA封装看作是由便携式电子产品所需的空间限制的一个可行的解决方案,它同时满足这些产品更高功能与性能的要求.为便携式产品的高密度电路设计 ...

  3. 基于C#的自动生成视频和海报营销号助手软件设计 课程报告+展示PPT+项目源码

    目录 营销号"助手"软件 1 需求分析与概要设计 1 项目说明 1 1.1. 项目目标: 2 1.2. 软硬件环境需求 2 1.3. 使用的关键技术: 2 需求分析 3 2.1. ...

  4. 基于C#+unity的2D跑酷闯关对战冒险游戏设计 课程报告+答辩PPT+源码

    目录 项目说明 1 1.1. 项目目标 1 1.2. 软硬件环境需求 2 1.3. 使用的关键技术 2 需求分析 2 2.1. 系统用例 2 2.2. 业务流程 3 概要设计 4 3.1. 功能模块设 ...

  5. 算法分析与设计实验报告三——动态规划算法

    一.实验目的 掌握动态规划方法贪心算法思想 掌握最优子结构原理 了解动态规划一般问题 二.实验内容 编写一个简单的程序,解决0-1背包问题.设N=5,C=10,w={2,2,6,5,4},v={6,3 ...

  6. 2019春第二次课程设计实验报告

    2019春第二次课程设计实验报告 一.实验项目名称: 贪吃蛇游戏编写: 二.实验项目功能描述: 这个实验主要是实现游戏的正常运行,实现的目标是对小蛇移动的控制, 同时对小蛇数据的保存,如何实现转弯的效 ...

  7. 20165219王彦博《基于Cortex-M4的虚拟机制作与测试》课程设计个人报告

    20165219王彦博<基于Cortex-M4的虚拟机制作与测试>课程设计个人报告 一.个人贡献 参与课设题目讨论及完成全过程: 资料收集: 负责环境搭建,代码运行下载: 撰写小组结题报告 ...

  8. 2109春第一次课程设计实验报告

    2019春第一次课程设计实验报告 一.实验项目名称: 飞机游戏的编写 二.实验项目功能描述: 这个实验主要是实现游戏的正常运行,实现控制飞机的移动功能,增加其实用度, 同时还实现发射子弹和出现敌机的操 ...

  9. c语言图形时钟编程,C语言图形时钟课程设计实验报告.doc

    C语言图形时钟课程设计实验报告.doc 目录 1.系统功能要求 . 2. 数据结构设计及 说明 . 3.程序结构(画流程图) . 4.各模块的功能 . 5.试验结果(包括输入数据和输出结果) . 6. ...

  10. 2019春第一次课程设计实验报告

    2019春第一次课程设计实验报告 一.实验项目名称 反弹球消砖块 二 .实验项目功能描述 用c语言编写一个反弹球小游戏,可以自己改变游戏的各项数据,可以通过键盘的 "a",&quo ...

最新文章

  1. Vue开发使用Axios遇到了大坑!
  2. C#生成CHM文件(外篇使用hha.dll)
  3. Start DWM manually on Windows 7 and vista
  4. androidsettitle方法_Android 去掉title bar的3个方法
  5. 在ie中关于ajax请求获得数据缓存问题的解决办法
  6. python pandas安装不了_python安装pandas问题!python pandas安装教程
  7. 游戏测试面试总结(网易雷火、飞鱼科技、冰川网络、完美世界、搜狐畅游)
  8. 自己动手实现简易光线追踪算法
  9. 年轻人“新宠”冷泡茶:能否开启下一个“立顿时代”?
  10. 【数据库】(三)-- mysql 数据库操作应用
  11. 局域网聊天软件源代码(包括语音聊天)
  12. Java导出excel表格,数字数据带E
  13. 工作用什么企业邮箱比较正式?常用的商务企业邮箱有哪些?
  14. TV服务器的安装维护和调试,广电机顶盒安装调试教程及系统设置密码
  15. 《我是一只IT小小鸟》读书笔记(2)
  16. iOS开发之三大计时器(Timer、DispatchSourceTimer、CADisplayLink)
  17. 办公自动化打卡 task01
  18. 关于系统失效和随机硬件失效
  19. mmdetection3d简单安装(官方教程就是坑)
  20. python中datetime是什么意思_python中datetime的使用方法

热门文章

  1. ar电力远程巡检可视化系统强化员工现场作业能力
  2. Java基础知识点汇总
  3. 屏幕录像专家的使用说明
  4. DXGI高帧率屏幕录像软件源码解析(声音捕获,抓屏,ffmpeg录像,MP4录像,flv录像,麦克风采集)(第4篇编码,录像部分)
  5. 文件加密新招--WinRAR文件加密(上)
  6. it项目管理之项目进度报告
  7. 参考文献格式字号字体_论文格式字体字号要求
  8. 跟着小甲鱼学习C语言
  9. war、jar、ear文件对比
  10. Remoting技术