VerilogDHL实验报告.docx
《VerilogDHL实验报告.docx》由会员分享,可在线阅读,更多相关《VerilogDHL实验报告.docx(35页珍藏版)》请在冰豆网上搜索。
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_passignhalf_div_p=(count_p<(F_DIV>>1)-1);
assignfull_div_n=(count_nassignhalf_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(count1begin
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(count2begin
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,