EDA实验三 图形和Verilog混合输入的电路设计 实验报告 (1)

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验六图形和Verilog HDL语言混合输入的电路设计

电子1602班王文涛1605020226

一、实验目的

1、学习在QUARTUSII软件中模块符号文件的生成与调用。

2、掌握模块符号与模块符号之间的连线规则与方法。

3、掌握从设计文件到模块符号的创建过程。

二、实验原理

在层次化的设计文件中,经常需要将已经设计好的工程文件生成一个模块符号文件作为自己的功能模块符号在顶层调用,该符号就像图形设计文件中的任何其它宏功能符号一样可被高层设计重复调用。本实验的实验原理就是用Verilog HDL语言分别实现50M信号源的分频、十进制、六进制模块,然后通过QUARTUSII软件合并成一个设计文件。实现60进制的功能。

三、实验内容

在实验中,时钟信号为50MHZ,经过分频电路分频后得到一个较低的频率(1HZ)做为计数器的时钟频率进行计数器的加法运算。得到的值在发光二级管上显示出来。实验箱中的数字时钟模块、按键开关LED与FPGA的接口电路,以及与FPGA的管脚连接在前面的实验中都做了详细说明,这里不在赘述。

四、实验步骤

1、打开QUARTUSII软件,新建一个工程。

2、选择File>new命令,新建一个Verilog文件。点击OK按钮确认,然后点击保存按钮,

弹出一对话框,重命名为fenpin.v,保存。在打开的文本编辑器中写分频程序

代码。

3、选择File>new命令,新建一个Verilog文件。点击OK按钮确认,然后点击保存按钮,

弹出一对话框,重命名为counter10.v,保存。在打开的文本编辑器中写十进制

程序代码。

4、选择File>new命令,新建一个Verilog文件。点击OK按钮确认,然后点击保存按钮,

弹出一对话框,重命名为counter6.v,保存。在打开的文本编辑器中写十进制

程序代码。

5、在File菜单中选择Create/Update项,进而选择Create Symbol for Current File,

点击确定按钮,即可创建一个代表刚才打开的设计文件功能的符号(.bsf),如图6-2所示。如果该文件对应的符号文件已经创建过,则执行该操作时会弹出提示信息,询

问是否要覆盖现存的符号文件。用户可以根据自己的意愿进行选择。

图6-2 从现行文件创建模块符号文件

6、用同样的方法对其它设计文件(counter10.V、counter6.V)进行模块符号文件的创

建。

7、模块符号文件创建完成后,再新建一个图形编辑文件,打开图形编辑器对话框。在图

形编辑器窗口的工件区双击鼠标的左键,或点击图中的符号工具按钮,或选择菜单Edit>Insert Symbol…,则弹出如图6-3所示的Symbol对话框。

图6-3 Symbol对话框

8、在Symbol对话框(图6-3)中的Project项下会出现前面创建的模块符号文件(fenpin、

counter10、counter6),我们现在就可以任意调用这些功能模块符号文件。

9、选取这些模块符号文件放置到工作区,调入需要的模块符号以后,进行符号之间的连

线,以及放置输入、输出或双向引脚。需要说明的是,在这个实验中,做为同步使能端的信号EN我们加入了一个VCC信号,使使能端信号EN有效。所有设计完成后的电路如图6-4所示。

图6-4 设计图形符号文件

10、对自己编写的图形符号输入文件程序进行保存,然后编译并仿真,对程序的错误进

行修改。

11、编译仿真无误后,依照拨动开关、LED与FPGA的管脚连接表(表1-1)或参照附

录进行管脚分配。表6-1是示例程序的管脚分配表。分配完成后,再进行全编译一次,以使管脚分配生效。

表6-1 端口管脚分配表

12、用下载电缆通过JTAG口将对应的sof文件加载到FPGA中。观察实验结果是否与

自己的编程思想一致。

五、实验现象与结果

以设计的参考示例为例,当设计文件加载到目标器件后,则八位LED发光二极管按一定的速率开始变化,按复位键显示的数值又从0开始。

六、实验报告

分频模块

module fenpin(Clk,clkout);

input Clk;

output clkout;

reg clkout;

reg [31:0] Cout; //always 语句里赋值需要定义为 reg 类型

reg Clk_En; //always 语句里赋值需要定义为 reg 类型

initial //赋初值

clkout<=0;

always @(posedge Clk )

begin

Cout <= (Cout == 32'd50000_000) ? 32'd0 : (Cout + 32'd1);

Clk_En <= (Cout >= 32'd25000_000) ? 1'd1 : 1'd0; //把脉冲源 50Mhz 分频为 1hz clkout<=Clk_En;

end

endmodule

注:如果用软件进行仿真,没有必要进行 50 分频把对应的程序改为

begin

Cout <= (Cout == 32'd2) ? 32'd0 : (Cout + 32'd1);

Clk_En <= (Cout >= 32'd1) ? 1'd1 : 1'd0; clkout<=Clk_En;

end

即可

十进制模块

module counter10( Clk, EN, RET, CQ,OUT);

input Clk;

input EN,RET;

output [3:0] CQ;

output OUT;

reg OUT;

/*---------------------------------------------------*/ wire Rst_n;

assign

Rst_n = RET;

/*---------------------------------------------------*/ reg[3:0] Led;

reg Clk_En;

always @(posedge Clk or negedge Rst_n)

begin

if(~Rst_n)

begin

OUT<=0;

Led <= 4'd0;

end

else

begin

Clk_En <= Clk;

if(Clk_En&EN) //==0.5s

begin

begin

begin

if(Led>=4'd9)

OUT<=1'd1;

else

OUT<=1'd0;

相关文档
最新文档