VerilogHDL硬件描述语言实验报告.docx

上传人:b****6 文档编号:8459555 上传时间:2023-01-31 格式:DOCX 页数:20 大小:60.41KB
下载 相关 举报
VerilogHDL硬件描述语言实验报告.docx_第1页
第1页 / 共20页
VerilogHDL硬件描述语言实验报告.docx_第2页
第2页 / 共20页
VerilogHDL硬件描述语言实验报告.docx_第3页
第3页 / 共20页
VerilogHDL硬件描述语言实验报告.docx_第4页
第4页 / 共20页
VerilogHDL硬件描述语言实验报告.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

VerilogHDL硬件描述语言实验报告.docx

《VerilogHDL硬件描述语言实验报告.docx》由会员分享,可在线阅读,更多相关《VerilogHDL硬件描述语言实验报告.docx(20页珍藏版)》请在冰豆网上搜索。

VerilogHDL硬件描述语言实验报告.docx

VerilogHDL硬件描述语言实验报告

VerilogHDL实验报告

学院:

应用科学学院

班级:

电科13-2班

姓名:

学号:

实验一组合逻辑电路设计

(1)

实验目的

(1)熟悉FPGA设计流程;

(2)熟悉DE2开发板的基本元件使用(开关、发光二极管);

(3)学习基本组合逻辑元件的VerilogHDL设计以及实现(数据选择器);

(4)掌握连续赋值语句使用;

实验内容

本实验的目的是学习如何连接一个简单的外部输入、输出器件到FPGA芯片以及如何在FPGA器件上实现逻辑电路控制简单外部器件。

考虑使用DE2开发板上拨动开关SW17-0(toggleSwitch)作为电路的输入。

使用发光二极管(LightEmitt-ingDiodes,LEDs)和7段显示数码管(7-segmentDisplay)作为电路的输出。

第1部分连续赋值语句

步骤

1、新建QuartusII工程,选择CycloneIIEP2C35F672C6作为目标芯片,该芯片是DE2开发板上的FPGA芯片;

2、编写VerilogHDL代码加入到QuarutsII工程;

3、引脚分配,并编译工程该工程;

4、将编译好的电路下载到FPGA器件。

扳动拨动开关观察相应的发光二极管显示,验证电路功能是否正确;

代码

modulepart1(

inputwire[2:

0]SW,

outputwireLEDR

);

wirer_g,s_g,qa,qb;

andu1(r_g,SW[0],SW[1]);

andu2(s_g,SW[1],SW[2]);

noru3(qa,r_g,qb);

noru4(qb,qa,s_g);

assignLEDR=qa;

endmodule

第2部分简单的数据选择器

步骤

1.新建QuartusII工程;

2.在工程中加入8位宽的2选1数据选择器VerilogHDL代码。

使用DE2开发板上的SW17作为输入s,开关SW7-0作为输入X,SW15-8作为输入Y。

连接拨动开关SW到红色的发光二极管LEDR,同时连接输出M到绿色的发光二极管LEDG7-0。

3.引脚分配,确保作为电路的输入端口的CycloneIIFPGA的引脚正确连接到拨动开关SW,作为电路输出的PPGA引脚正确与LEDR和LEDG连接;

4.编译;

5.将编译好的电路下载到FPGA器件。

通过扳动拨动开关SW改变电路输入,同时观察LEDR和LEDG的显示是否与之匹配,测试8位宽的2选1数据选择器的功能是否正确。

代码

设计文件

modulepart2(

input[17:

0]SW,

output[17:

0]LEDR,

output[7:

0]LEDG

);

assignLEDR=SW;

mux_8bit_2to1NQ(SW[17],SW[15:

8],SW[7:

0],LEDG);

endmodule

modulemux_2to1(

inputs,

inputx,y,

outputm

);

assignm=(s&y)|(~s&x);

endmodule

modulemux_8bit_2to1(

inputS,

input[7:

0]X,Y,

output[7:

0]M

);

mux_2to1m7(S,X[7],Y[7],M[7]);

mux_2to1m6(S,X[6],Y[6],M[6]);

mux_2to1m5(S,X[5],Y[5],M[5]);

mux_2to1m4(S,X[4],Y[4],M[4]);

mux_2to1m3(S,X[3],Y[3],M[3]);

mux_2to1m2(S,X[2],Y[2],M[2]);

mux_2to1m1(S,X[1],Y[1],M[1]);

mux_2to1m0(S,X[0],Y[0],M[0]);

endmodule

测试台文件

`timescale1ns/100ps

modulemux2to1_test;

regx,y;

regs;

wirem;

mux2to1M(s,x,y,m);

initial

begin

x=1;y=0;

s=0;

#10s=0;

#10s=1;

#10$stop;

end

endmodule

波形

实验二组合逻辑电路设计

(2)数码和显示

实验目的

(1)采用always块设计组合逻辑电路;

(2)熟悉二进制-十进制译码器和BCD码加法器等组合逻辑电路。

实验内容

(1)组合逻辑7段显示译码器

(2)二进制-BCD转换电路

(3)组合逻辑4位全加器

(4)BCD码加法电路

第1部分组合逻辑7段显示译码器步骤

步骤

1、1、新建QuartusII工程,在DE2开发板实现该电路。

本试验的目的是用手动方式设计7段显示译码电路。

要求只能使用连续赋值语句,将输出定义为关于输入的逻辑表达式。

2、编写电路的VerilogHDL源文件,并将其包含到Quartus工程。

将FPGA引脚连接到相应的拨动开关和7段显示数码管。

(参考UserManualfortheDE2board)。

引脚分配过程也可以参考QuartusIIIntroductionusingVerilogDesign,该文件可以在Altera公司网站大学计划网站的DE2SystemCD上找到。

3、编译,并且将编译好的电路下载到FPGA中;

4、扳动拨动开关改变电路输入,观察数码管显示并分析电路功能是否正确;

代码

modulepart1(

input[17:

0]SW,

output[17:

0]LEDR,

output[6:

0]HEX0,HEX1,HEX2,HEX3

);

assignLEDR=SW;

decoder4_7decoder4_7_01(SW[0+:

4],HEX0);

decoder4_7decoder4_7_02(SW[4+:

4],HEX1);

decoder4_7decoder4_7_03(SW[8+:

4],HEX2);

decoder4_7decoder4_7_04(SW[12+:

4],HEX3);

endmodule

moduledecoder4_7(

input[3:

0]a,

output[6:

0]HEX

);

assignHEX[6]=~a[3]&~a[2]&~a[1]|a[2]&a[1]&a[0];

assignHEX[5]=~a[3]&~a[2]&a[0]|~a[2]&a[1]|a[1]&a[0];

assignHEX[4]=a[0]|a[2]&~a[1];

assignHEX[3]=~a[3]&~a[2]&~a[1]&a[0]|

a[2]&~a[1]&~a[0]|

a[2]&a[1]&a[0];

assignHEX[2]=~a[2]&a[1]&~a[0];

assignHEX[1]=a[2]&~a[1]&a[0]|a[2]&a[1]&~a[0];

assignHEX[0]=a[2]&~a[1]&~a[0]|~a[3]&~a[2]&~a[1]&a[0];

endmodule

第2部分二进制-BCD转换电路

步骤

1、新建QuartusII工程;

2、编译,功能仿真;验证比较器、数据选择器和电路A的功能是否正确;

3、编写电路B和7段显示译码电路的VerilogHDL代码。

使用DE2开发板上开关SW3-0代表输入V,使用HEX1和HEX0显示数字d1和d0。

确保引脚分配正确;

4、编译,下载编译好电路到FPGA芯片中;

5、拨动拨动开关SW3-0改变收入值V,观察输出显示以测试电路的正确性;

代码

//niqi1307010213

//toplevelw

modulepart2(

input[3:

0]SW,

output[3:

0]LEDR,

output[6:

0]HEX0,HEX1

);

wire[2:

0]a;

wirez;

wire[3:

0]m;

wire[6:

0]b,HEX;

assignLEDR=SW;

compartorcompartor_1(SW,z);

circuit_AA(SW[2:

0],a);

mux_4bit_2to1M(z,SW,{1'b0,a},m);

circuit_BB(z,HEX1);

decoder4_7dec(m,HEX0);

endmodule

//7-segmentdecoder

moduledecoder4_7(

input[3:

0]a,

output[6:

0]HEX

);

assignHEX[6]=~a[3]&~a[2]&~a[1]|a[2]&a[1]&a[0];

assignHEX[5]=~a[3]&~a[2]&a[0]|~a[2]&a[1]|a[1]&a[0];

assignHEX[4]=a[0]|a[2]&~a[1];

assignHEX[3]=~a[3]&~a[2]&~a[1]&a[0]|

a[2]&~a[1]&~a[0]|

a[2]&a[1]&a[0];

assignHEX[2]=~a[2]&a[1]&~a[0];

assignHEX[1]=a[2]&~a[1]&a[0]|a[2]&a[1]&~a[0];

assignHEX[0]=a[2]&~a[1]&~a[0]|~a[3]&~a[2]&~a[1]&a[0];

endmodule

//circuit_A

modulecircuit_A(

input[2:

0]v,

output[2:

0]a

);

assigna=v+3'o6;

endmodule

//circuit_B

modulecircuit_B(

inputb,

output[6:

0]HEX

);

assignHEX=b?

7'b111_1001:

7'b111_1111;

endmodule

//4-bit2-to-1multiplexer

modulemux_4bit_2to1(

inputs,

input[3:

0]x1,x2,

output[3:

0]f

);

assignf=s?

x2:

x1;

endmodule

//Comparator

modulecompartor(

input[3:

0]v,

outputz

);

assignz=(v>4'h9)?

1'B1:

1'B0;

endmodule

实验三锁存器、触发器和寄存器

实验目的

(1)掌握锁存器、触发器和寄存器的门级描述以及行为级描述;

(2)掌握组合逻辑电路和基本存元件描述方式不同;

(3)学习QuartusII功能仿真和时序仿真方法;

(4)学习QuartusII的RTLViewer和TechnologyViewer工具的使用;

实验内容

1.门控RS触发器的设计

2.D锁存器的设计

3.D触发器的设计

第1部分门控RS触发器

步骤

1.新建QuartusII工程,选择目标器件为CycloneIIEP2C35F672C6。

2.按照例3-1或者例3-2新建VerilogHDL文件,然后将该文件包含到工程中。

注意:

两个版本的VerilogHDL代码产生的电路结构是相同的。

3.编译。

使用QuartusII软件的RTLViewer工具观察两种描述方式产生的电路结构,使用TechnologyViewer工具验证QuartusII软件实现的电路结构是否与图3-3(b)一致。

提示:

点击Tools->NetlistViewer->RTLViewer可以打开RTLViewer工具;

4.新建VectorWaveformFile(.vwf)文件,在vwf文件包含电路的输入和输出,在QuarutsII软件中画出电路输入R和S的波形,使用QuartusII仿真器仿真该电路。

验证电路的功能和时序是否正确。

提示:

点击File->New,在弹出的对话框中选择VectorWaveformFile新建波形文件。

仿真过程参考QuartusII简明教程。

代码

//RSflipflop

modulepart1

inputclk,R,S,

outputQ

);

wirer_g,s_g,qa,qb/*synthesiskeep*/;

assignr_g=R&clk;

assigns_g=S&clk;

assignqa=~(r_g&qb);

assignqb=~(s_g&qa);

assignQ=qa;

endmodule

综合结果(quartusII13.0)

第2部分D锁存器

步骤

1.新建QuartusII工程。

按照例3-2的代码风格设计图3-3所示的D锁存器的VerilogHDL代码。

使用/*synthesiskeep*/综合指令,以确保使用独立的逻辑单元实现信号R,S_g,R_g,Qa和Qb。

2.选择CycloneIIEP2C35F672C6作为目标芯片,编译该工程。

使用TechnologyVeiwer工具观察电路结构。

3.在QuarutusII中执行功能仿真,验证电路功能是否正确,执行时序仿真验证D锁存器的时序是否正确;

4.新建QuartusII工程,在DE2开发板上实现D锁存器电路。

在该工程的顶层文件中需要为D锁存器电路设计合适的输入和输出端口,在工程的顶层模块中实例D锁存器模块。

使用SW0代表D锁存器的数据输入D,SW1代表D锁存器的时钟输入Clk,D锁存器的输出Q到LEDR0。

5.重新编译,下载电路到DE2开发板;

6.改变拨动开关SW的状态,观察D锁存器的输出,测试电路功能是否正确;

代码

moduletop_level(SW,LEDR0);

input[1:

0]SW;//clk&d

outputLEDR0;//q

gated_d_latch(LEDR0,SW[0],SW[1]);

endmodule

//part2.vgatedd_latch

modulegated_d_latch(q,d,clk);

inputd,clk;

outputq;

wirer,s_g,r_g,qa,qb/*synthesiskeep*/;

nand(s_g,d,clk);

nand(r_g,r,clk);

not(r,d);

nand(qa,s_g,qb);

nand(qb,r_g,qa);

assignq=qa;

endmodule

实验四计数器设计

(一)

实验目的

(1)学习计数器的基本原理以及VerilogHDL实现方法;

(2)学习查看QuartusII编译报告(查看电路的最高工作频率);

(3)时序电路时序分析的基本方法

(4)掌握参数化模块库的使用;

实验内容

(1)4位同步计数器设计

(2)行为级描述电路设计

(3)使用LPM设计计数器

第1部分4位同步计数器

步骤

1.使用VerilogHDL设计16位同步计数器。

要求:

首先设计1个T触发器,通过实例化16个T触发器实现该16位同步计数器。

编译,观察该实现需要多少个基本逻辑单元(LogicElements,LEs),电路的最高工作频率Fmax是多少?

2.功能仿真,验证电路功能是否正确。

3.使用KEY0作为clock输入,开关SW1和SW2分别作为enable和reset输入,7段显示数码管HEX3-HEX0用来显示十进制计数值。

按照DE2开发板上的电路做好正确的引脚分配,重新编译。

4.下载编译好的电路到FPGA器件,扳动拨动开关改变电路输入,测试电路功能。

使用QuartusII软件RTLViewer工具观察QuartusII软件是如何综合电路的?

并比较QuartusII软件综合的电路与图1的差别。

按照同样的方式设计1个4位同步计数器,

代码

modulepart

input[1:

0]KEY,

output[3:

0]LEDR,

output[1:

0]LEDG,

output[6:

0]HEX0

);

wire[3:

0]q;

assignLEDR=q;

assignLEDG=KEY;

counter_4u1(~KEY[0],~KEY[1],1'b1,q);

decoder4_7H0(q[3:

0],HEX0);

endmodule

modulecounter_4

inputclk,reset,en,

output[3:

0]q

);

wire[3:

0]qq,tt;

assignq=qq;

assigntt[0]=en;

assigntt[1]=en&qq[0];

assigntt[2]=tt[1]&qq[1];

assigntt[3]=tt[2]&qq[2];

T_FFu1(clk,reset,1'b1,tt[0],qq[0]);

T_FFu2(clk,reset,1'b1,tt[1],qq[1]);

T_FFu3(clk,reset,1'b1,tt[2],qq[2]);

T_FFu4(clk,reset,1'b1,tt[3],qq[3]);

endmodule

moduledecoder4_7

input[3:

0]a,

outputreg[6:

0]f

);

always@*

case(a)

4'h0:

f=7'hC0;

4'h1:

f=7'hF9;

4'h2:

f=7'hA4;

4'h3:

f=7'hB0;

4'h4:

f=7'h99;

4'h5:

f=7'h92;

4'h6:

f=7'h82;

4'h7:

f=7'hF8;

4'h8:

f=7'h80;

4'h9:

f=7'h90;

4'hA:

f=7'h88;

4'hB:

f=7'h83;

4'hC:

f=7'hC6;

4'hD:

f=7'hA1;

4'hE:

f=7'h86;

4'hF:

f=7'h8E;

defaultf=7'hff;

endcase

endmodule

 

moduleT_FF

inputclk,reset,en,t,

outputregq

);

always@(posedgeclk,posedgereset)

if(reset)

q<=1'b0;

elseif(en)

q<=t?

~q:

q;

endmodule

实验7有限状态机

第8部分二进制BCD码转换电路

设计文件

//2015/10/21

modulebin2bcd

inputclk,reset,

inputstart,

input[12:

0]bin,

outputready,done_tick,

output[3:

0]bcd3,bcd2,bcd1,bcd0

);

//finitestatedeclaration

localparam

IDLE=2'b00,

OP=2'b01,

DONE=2'b10;

//signaldeclaration

reg[1:

0]state_reg,state_next;

reg[3:

0]n_reg,n_next;//counter

reg[3:

0]bcd0_reg,bcd0_next;

reg[3:

0]bcd1_reg,bcd1_next;

reg[3:

0]bcd2_reg,bcd2_next;

reg[3:

0]bcd3_reg,bcd3_next;

wire[3:

0]bcd3_temp,bcd2_temp,bcd1_temp,bcd0_temp;

reg[12:

0]p2s_reg,p2s_next;

//statemachine

//stateregister

always@(posedgeclk,posedgereset)

if(reset)

state_reg<=IDLE;

else

state_reg<=state_next;

//nextlogic

//always@(state_reg,start,n_next)

always@*

begin

state_next=state_reg;//在此做过改动

case(state_reg)

IDLE:

begin

if(start)

state_next=OP;

else

state_next=IDLE;

end

OP:

begin

if(n_next==0)

state_next=DONE;

else

state_next=OP;

end

DONE:

state_next=IDLE;

default:

state_next=IDLE;

endcase

end

//mooreoutputlogic

assigndone_tick=(state_reg==DONE)?

1'b1:

1'b0;

assignready=(state_reg==IDLE)?

1'b1:

1'b0;

//datapass

//dataregister

always@(posedgeclk,posedgereset)

begin

if(reset)

begin

bcd0_reg<=3'b0;

bcd1_reg<=3'b0;

bcd2_reg<=3'b0;

bcd3_reg<=3'b0;

p2s_reg<=0;

n_reg<=0;

end

else

begin

bcd0_reg<=bcd0_next;

bcd1_reg<=bcd1_next;

bcd2_reg<=bcd2_next;

bcd3_reg<=bcd3_next;

p2s_reg<=p2s_next;

n_reg<=n_next;

end

end

//datapassnext-statelogic

always@*

begin

bcd0_next=bcd0_reg;

bcd1_n

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 人文社科 > 哲学历史

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1