VerilogDHL实验报告.docx

上传人:b****7 文档编号:23776040 上传时间:2023-05-20 格式:DOCX 页数:35 大小:2.05MB
下载 相关 举报
VerilogDHL实验报告.docx_第1页
第1页 / 共35页
VerilogDHL实验报告.docx_第2页
第2页 / 共35页
VerilogDHL实验报告.docx_第3页
第3页 / 共35页
VerilogDHL实验报告.docx_第4页
第4页 / 共35页
VerilogDHL实验报告.docx_第5页
第5页 / 共35页
点击查看更多>>
下载资源
资源描述

VerilogDHL实验报告.docx

《VerilogDHL实验报告.docx》由会员分享,可在线阅读,更多相关《VerilogDHL实验报告.docx(35页珍藏版)》请在冰豆网上搜索。

VerilogDHL实验报告.docx

VerilogDHL实验报告

实验一二选一数据选择器

一、实验原理

数据选择是指经过选择,把多路数据中的某一路传送到公共数据线上,实现数据选择功能的逻辑电路称为数据选择器。

它的作用相当于多输入的单刀多掷开关。

表1:

二选一数据选择器真值表

图1:

数据选择器的工作原理图

二、实验代码

module mux2(out,a,b,sl);

input a,b,sl;

output out;

mymux2 m2(out,a,b,sl);

endmodule

module mymux2(out,a,b,sl);

input a,b,sl;

output out;

not u1(nsl,sl);

and u2(sela,a,nsl);

and u3(selb,b,sl);

or u4(out,sela,selb);

endmodule

三、仿真结果

实验二8*8乘法器

一、实验原理

乘法器(multiplier)是一种完成两个互不相关的模拟信号相乘作用的电子器件。

它可以将两个二进制数相乘。

它是由更基本的加法器组成的。

图3:

乘法器的原件图

图4:

串行乘法器的RTL结构图

二、实验代码

module mult_for(outcome,a,b);

parameter size=8;

input[size:

1] a,b;

output[2*size:

1] outcome;

integer i;

reg[2*size:

1] outcome;

always @ (a or b)

  begin

outcome=0;

for(i=1;i<=size;i=1+i)

if(b[i]==1)

outcome=outcome+(a<<(i-1));

end

endmodule

三、仿真结果

实验三八位带奇偶校验位的并入串出移位寄存器

一、实验原理

在数字电路中,移位寄存器(英语:

shiftregister)是一种在若干相同时间脉冲下工作的以触发器为基础的器件,数据以并行或串行的方式输入到该器件中,然后每个时间脉冲依次向左或右移动一个比特,在输出端进行输出。

这种移位寄存器是一维的,事实上还有多维的移位寄存器,即输入、输出的数据本身就是一些列位。

实现这种多维移位寄存器的方法可以是将几个具有相同位数的移位寄存器并联起来。

根据移位方向,常把它分成左移寄存器、右移寄存器和双向移位寄存器三种。

根据移位数据的输入-输出方式,又可将它分为串行输入-串行输出、串行输入-并行输出、并行输入-串行输出和并行输入-并行输出四种电路结构。

图4:

八位带奇偶校验位的并入串出移位寄存器元件图

  

  奇校验位逻辑值的表达式 

  当采用偶校验时,被校验的数据和校验位满足偶数个1,组成 5位偶校验码

  

  偶校验位逻辑值的表达式 

  ② 电路实现

  

二、实验代码

moduleshift(Din,P,CP,Dout);

input[7:

0]Din;

inputP,CP;

outputDout;

reg[8:

0]Q;

assignDout=Q[0];

always@(posedgeCP)

if(P)

begin

Q[7:

0]<=Din;

Q[8]<=^Din;

end

else

begin

Q[7:

0]=Q[8:

1];

Q[8]=0;

end

endmodule

三、仿真结果

实验四交通灯

一、实验原理

当reset_n(复位信号)、emergency(紧急状态信号)和test(测试状态信号)是状态控制信号。

当reset_n是复位信号且为有效时,若prim_flag(主、次路口标志)输入为1,表示该路口是主干道,复位信号无效后此路口为绿灯状态;若prim_flag输入为0,表示该路口是次干道,复位信号无效后此路口为红灯状态。

Emergency是紧急状态控制信号,当emergency=1时,表示此时进入紧急状态,在此状态下倒计时时间wait_time(倒计时时间)数据始终为88,红、黄、绿、信号灯输出ryg_light(红、黄、绿灯状态)=3’b110,即红、黄灯亮,绿灯灭。

Test是测试状态控制信号,当test=1时,表示对信号灯和七段数码管进行测试,此时wait_time数据交替为88和00,当wait_time信号连接七段数码管时,出现闪烁显示“88“的状态,以此判断七段数码管各个段的电路是否发生故障,ryg_light交替为3’b111和3’b000(红、黄、绿灯同时亮或灭),用来检测信号灯的故障。

当reset_n、emgency和test信号均无效时,此模块处于正常工作模式,ryg_light依次输出3’b100->3’b001->3’b010->3’b100,即红、黄、绿信号灯循环输出红->绿->黄->红->….的状态,wait_time则根据输入的红、黄、绿灯时间显示当前信号灯剩余的等待时间。

输入信号:

Clk——1Hz时钟信号;

Reset_n——复位信号,低电平有效;

Prim_flag——主、次干道标志,1位主干道,0为次干道;

Red_time——红灯时间(秒);

Green_time——绿灯时间(秒);

Yellow_time——绿灯时间(秒);

Emergency——紧急状态控制信号;

Test——信号灯测试控制信号。

输出信号:

Wait_time——当前状态的倒计时时间输出;

ryg_light[2:

0]——红、黄、绿信号灯状态输出。

二、实验代码

(1)单个路口交通灯控制模块

moduletraffic_con(clk,reset_n,prim_flag,red_time,green_time,yellow_time,wait_time,ryg_light,emergency,test);

parameteron=1'b1,off=1'b0;

inputclk,reset_n;

inputprim_flag;

input[7:

0]red_time,green_time,yellow_time;

inputemergency,test;

outputreg[7:

0]wait_time;

outputreg[2:

0]ryg_light;

regcnt;

reg[7:

0]ticks,n;

reg[1:

0]s,state;

initial

begin

ryg_light<={on,off,off};

cnt<=1'b0;

s<=2'b00;

ticks<=8'b0;

n<=0;

end

always@(posedgeclk)

begin

if(~reset_n)

begin

state<=2'b10;

ryg_light<={off,off,off};

//cnt<=1'b0;

if(prim_flag)

s<=2'b00;

else

s<=2'b10;

//ticks<=8'b0;

n<=1;

end

elseif(emergency)

begin

state<=2'b00;

ryg_light<={on,on,off};

end

elseif(test)

begin

state<=2'b01;

if(~cnt)

ryg_light<={on,on,on};

else

ryg_light<={off,off,off};

end

else

begin

state<=2'b11;

if(n==ticks)

begin

if(s==2'b10)

s<=2'b00;

else

s<=s+1;

n<=1;

end

else

n<=n+1;

case(s)

2'b00:

ryg_light<={off,off,on};

2'b01:

ryg_light<={off,on,off};

2'b10:

ryg_light<={on,off,off};

endcase

end

wait_time<=(state==2'b11)?

ticks-n+1:

8'h88;

end

always@(sorstate)

begin

if(state==2'b11)

case(s)

2'b00:

ticks=green_time;

2'b01:

ticks=yellow_time;

2'b10:

ticks=red_time;

endcase

else

ticks<=8'b0;

end

always@(posedgeclk)

begin

if(~reset_n)

cnt<=1'b0;

else

cnt<=~cnt;

end

endmodule

三、仿真结果

(1)主干道复位仿真波形

(2)次干道复位仿真波形

(3)通行时间更新后的仿真波形

(4)紧急工作状态截图

(5)测试工作状态截图

实验五多功能数字钟

一、实验原理

数字钟是一个最常用的数字系统,其主要功能是计时和显示时间。

这里通过一个数字钟表的规模化设计方法,说明自顶向下的模块化设计方法和实现一个项目的设计步骤。

这里实现的电子表具有显示和调时的基本功能,可以显示时、分、秒和毫秒,并通过按键进行工作模式选择,工作模式有4种,分别是正常计时模式、调时模式、调分模式、调秒模式。

构成电子表的基本模块由4个,分别是时钟调校及计时模块myclock、整数分频模块int_div、时钟信号选择模块clkgen和七段显示模块disp_dec。

输入信号:

RSTn——复位信号;

CLK——100Hz时钟信号;

FLAG[1:

0]——工作模式控制信号,模式定义为00表示正常显示,01表示调时,10表示调分,11表示调秒;

UP——调校模式时以加1方式调节信号;

DN——调校模式时以减1方式调节信号;

输出信号:

H[7:

0]——“时”数据(十六进制);

M[7:

0]——“分”数据(十六进制);

S[7:

0]——“秒”数据(十六进制);

MS[7:

0]——“百分秒”数据(十六进制);

二、实验代码

(1)时钟调教与计时模块

modulemyclock(RSTn,CLK,FLAG,UP,DN,H,M,S,MS);

inputRSTn,CLK,UP,DN;

output[7:

0]H,M,S;

output[7:

0]MS;

input[1:

0]FLAG;

reg[5:

0]m_H,m_M,m_S;

reg[6:

0]m_MS;

assignH=m_H;

assignM=m_M;

assignS=m_S;

assignMS=m_MS;

always@(posedgeCLK)

if(~RSTn)

begin

m_H<=8'd23;

m_M<=8'd52;

m_S<=8'b0;

m_MS<=8'b0;

end

elseif(FLAG==2'b01)

begin

if(UP)

begin

if(m_H==8'd23)

m_H<=8'd0;

else

m_H<=m_H+1'b1;

end

elseif(DN)

begin

if(m_H==8'd00)

m_H<=8'd23;

elsem_H<=m_H-1'b1;

end

end

elseif(FLAG==2'b10)

begin

if(UP)

begin

if(m_M==8'd59)

m_M<=8'd0;

else

m_M<=m_M+1'b1;

end

elseif(DN)

begin

if(m_M==8'h00)

m_M<=8'd59;

elsem_M<=m_M-1;

end

end

elseif(FLAG==2'b11)

begin

if(UP)

begin

if(m_S==8'd59)

m_S<=8'b0;

else

m_S<=m_S+1'b1;

end

elseif(DN)

begin

if(m_S==8'h00)

m_S<=8'd59;

elsem_S<=m_S-1'b1;

end

end

else

begin

if(m_MS==8'd99)

begin

m_MS<=8'd0;

if(m_S==8'd59)

begin

m_S=8'd0;

if(m_M==8'd59)

begin

m_M=8'd0;

if(m_H==8'd23)

m_H<=0;

elsem_H<=m_H+1'b1;

end

elsem_M<=m_M+8'd1;

end

elsem_S<=m_S+1'b1;

end

elsem_MS<=m_MS+1'b1;

end

endmodule

(2)整数分频模块

moduleint_div(clock,clk_out);

parameterF_DIV=48000000;

parameterF_DIV_WIDTH=32;

inputclock;

outputclk_out;

regclk_p_r;

regclk_n_r;

reg[F_DIV_WIDTH-1:

0]count_p;

reg[F_DIV_WIDTH-1:

0]count_n;

wirefull_div_p;

wirehalf_div_p;

wirefull_div_n;

wirehalf_div_n;

assignfull_div_p=(count_p

assignhalf_div_p=(count_p<(F_DIV>>1)-1);

assignfull_div_n=(count_n

assignhalf_div_n=(count_n<(F_DIV>>1)-1);

assignclk_out=(F_DIV==1)?

clock:

(F_DIV[0]?

(clk_p_r&clk_n_r):

clk_p_r);

always@(posedgeclock)

begin

if(full_div_p)

begin

count_p<=count_p+1'b1;

if(half_div_p)

clk_p_r<=1'b0;

else

clk_p_r<=1'b1;

end

else

begin

count_p<=0;

clk_p_r<=1'b0;

end

end

always@(negedgeclock)

begin

if(full_div_n)

begin

count_n<=count_n+1'b1;

if(half_div_n)

clk_n_r<=1'b0;

else

clk_n_r<=1'b1;

end

else

begin

count_n<=0;

clk_n_r<=1'b0;

end

end

endmodule

(3)时钟信号选择模块

moduleclkgen(flag,clk_100hz,clk_2hz,clkout);

input[1:

0]flag;

inputclk_100hz,clk_2hz;

outputclkout;

assignclkout=(flag==2'b00)?

clk_100hz:

clk_2hz;

endmodule

(4)BCD码显示模块

moduledisp_dec(hex,dispout);

input[7:

0]hex;

output[15:

0]dispout;

reg[7:

0]dec;

always@(hex)

begin

dec[7:

4]=hex/4'd10;

dec[3:

0]=hex%4'd10;

end

dual_hexu1(1'b0,dec,dispout);

endmodule

(5)2位七段显示模块

moduledual_hex(iflag,datain,dispout);

inputiflag;

input[7:

0]datain;

output[15:

0]dispout;

seg_decoderu1(iflag,datain[7:

4],dispout[15:

8]);

seg_decoderu2(iflag,datain[3:

0],dispout[7:

0]);

endmodule

(6)1位七段显示模块

moduleseg_decoder(iflag,iA,oY);

inputiflag;

input[3:

0]iA;

outputreg[7:

0]oY;

always@(iflag,iA)

begin

case(iA)

4'b0000:

oY=8'h3f;

4'b0001:

oY=8'h06;

4'b0010:

oY=8'h5b;

4'b0011:

oY=8'h4f;

4'b0100:

oY=8'h66;

4'b0101:

oY=8'h6d;

4'b0110:

oY=8'h7d;

4'b0111:

oY=8'h27;

4'b1000:

oY=8'h7f;

4'b1001:

oY=8'h6f;

4'b1010:

oY=8'h77;

4'b1011:

oY=8'h7c;

4'b1100:

oY=8'h58;

4'b1101:

oY=8'h5e;

4'b1110:

oY=8'h79;

4'b1111:

oY=8'h71;

endcase

if(!

iflag)

oY=~oY;

end

endmodule

(7)顶层模块

moduleclock(iCLK_50,RSTn,FLAG,UP,DN,H_dis,M_dis,S_dis,MS_dis,Mode,H,M,S,MS);

inputiCLK_50;

inputRSTn,UP,DN;

input[1:

0]FLAG;

output[1:

0]Mode;

output[15:

0]H_dis,M_dis,S_dis,MS_dis;

output[7:

0]H,M,S,MS;

//wire[7:

0]MS;

wireclk_100hz,clk_2hz;

wireclk;

assignMode=FLAG;

int_div#(500000,32)nclk100(iCLK_50,clk_100hz);

int_div#(50000000,32)nclk2(iCLK_50,clk_2hz);

clkgenu0(FLAG,clk_100hz,clk_2hz,clk);

myclocku1(RSTn,iCLK_50,FLAG,UP,DN,H,M,S,MS);

disp_decHour(H,H_dis);

disp_decMinute(M,M_dis);

disp_decSecond(S,S_dis);

disp_dechour(MS,MS_dis);

endmodule

三、仿真结果

(1)计时状态仿真波形

此图为ms计时。

此图为小时、分、秒计时。

(2)时调整功能仿真波形

(3)分调整功能仿真波形

(4)秒调整功能仿真波形

实验六分频器

一、实验原理

分频器在数字系统中的应用非常广泛,它的功能是根据分频系数N将频率为f的输入信号进行N分频后输出,即输出信号的频率为f/N。

对一个数字系统而言,时钟信号、选通信号、中断信号是很常用的,这些信号往往是由电路中具有频率较高的基本频率源经过分频电路产生的。

常见的分频器根据分频系数可以分为偶数分频器和奇数分频器;按照分频信号的占空比则可以将分频器分为方波分频器和非方波分频器。

二、实验代码

moduleN_division(clk,rst,clk_out,N);

inputclk,rst;

outputclk_out;

input[3:

0]N;

reg[3:

0]count1,count2;

regclkA,clkB;

wireclk_re;

assignclk_re=~clk;

assignclk_out=clkA|clkB;

always@(posedgeclk)

begin

if(!

clk)

begin

count1<=1'b0;

clkA<=1'b0;

end

elseif(N%2==1)

begin

if(count1<(N-1))

begin

count1<=count1+1'b1;

if(count1==(N-1)/2)

begin

clkA=~clkA;

end

end

else

begin

clkA=~clkA;

count1<=1'b0;

end

end

else

if(count1

begin

count1<=count1+1'b1;

end

else

begin

clkA<=~clkA;

count1<=1'b0;

end

end

always@(posedgeclk_re)

begin

if(!

rst)

begin

count2<=1'b0;

clkB<=1'b0;

end

elseif(N%2==1)

begin

if(count2

begin

count2<=count2+1'b1;

if(count2==(N-1)/2)

clkB<=~clkB;

end

else

begin

clkB<=~clkB;

count2<=1'b0;

end

end

else

clkB=1'b0;

end

endmodule

三、仿真结果

实验七乐曲播放器

一、实验原理

这里设计的乐曲播放器是由时钟信号发生模块、音频产生模块、乐曲储存模块、乐曲控制模块四个模块组成。

二、实验代码

(1)时钟信号发生模块

moduleclk_gen(reset_n,clk50M,clk_4hz,clk_5Mhz);

inputreset_n;

inputclk50M;

outputregclk_4hz;

outputregclk_5Mhz;

reg[20:

0]count;

reg[2:

0]cnt;

always@(posedgeclk_5Mhzornegedgereset_n)

if(!

reset_n)

begin

count<=0;

clk_4hz<=0;

end

else

begin

if(count==21'h98968)

begin

count<=0;

clk_4hz<=~clk_4hz;

end

else

count<=count+1'b1;

end

always@(posedgeclk50Mornegedgereset_n)

if(!

reset_n)

begin

cnt<=0;

clk_5Mhz<=0;

end

else

if(cnt==3'b100)

begin

cnt<=0;

clk_5Mhz<=~clk_5Mhz;

end

else

cnt<=cnt+1'b1;

endmodule

(2)音频产生模块

moduletone_gen(reset_n,clk,code,freq_out);

inputreset_n,

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

当前位置:首页 > 幼儿教育 > 幼儿读物

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

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