版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
项目5
常用数字单元的VerilogHDL实现摘要ABSTRACT
任何复杂的数字系统都是由简单的电路元件和底层模块搭建而成的,如组合逻辑中的加法器、编码器、译码器、比较器、选择器;时序逻辑电路中的触发器、寄存器、计数器;存储器电路中的RAM、ROM;状态机的中Moore状态机、Mealy状态机等。本项目结合数字逻辑电路的基础和项目4中介绍的VerilogHDL语言基本语法,使用QuartusII软件工具对上述基本电路进行设计,使读者能更深入理解使用VerilogHDL语言设计逻辑电路的方法。项目导图本项目学习目标知识目标①了解常用数字单元电路的设计方法②掌握常用数字单元电路的VerilogHDL语言编程方法本项目学习目标技能目标①能应用门级描述、连续赋值语句描述及过程赋值语句描述等方式进行常用数字单元电路的设计②能够掌握几种描述方式的异同之处,并在设计过程中加以灵活运用本项目学习目标素养目标①弘扬脚踏实地、刻苦钻研、爱岗敬业的劳模精神②加强实践练习,注重学思结合、知行统一,增强勇于探索的创新精神1目录CONTENTS组合逻辑电路的实现2时序逻辑电路的实现状态机的实现43存储器电路的实现任务5.1组合逻辑电路的实现
在数字电路中,任何时刻输出信号的稳态值仅决定于该时刻各个输入信号取值的组合,而与先前状态无关的逻辑电路叫组合逻辑电路。常用的组合逻辑门电路包括编码器、译码器、数值比较器、数据选择器、总线缓冲器等。在FPGA数字系统中,组合逻辑电路主要负责信号传输。组合逻辑本质上是由逻辑门构成,而逻辑层是从逻辑门组合及连接角度去描述整个系统的。5.1.1基本门电路的实现【例5-1】编写以二输入为基础,并使用VerilogHDL中定义的逻辑运算符的与门、或门、与非门、或非门、异或门及反相器的逻辑程序。moduleex_gate(a,b,y_and,y_or,y_nand,y_nor,y_not,y_xor);
inputa,b;
outputy_and,y_or,y_nand,y_nor;
outputy_not,y_xor;/*门级结构描述方式*/and(y_and,a,b);//与门输出or(y_or,a,b);//或门输出nand(y_nand,a,b);//与非门输出nor(y_nor,a,b);
//或非门输出not(y_not,a);
//取反输出xor(y_xor,a,b);
//异或输出endmodule/*数据流描述方式*/assigny_and=a&b;//与门输出assigny_or=a|b;//或门输出assigny_nand=~(a&b);//与非门输出assigny_nor=~(a|b);//或非门输出assigny_not=~a;//取反输出assigny_xor=a^b;
//异或输出5.1.1基本门电路的实现【例5-2】编写以二输入与门为基础,生成一个多输入与门模块的VerilogHDL程序。//顶层模块程序文件ex_andnmoduleex_andn(inputwire[width-1:0]din,outputwiredout);parameterwidth=8;//定义常量为8wire[width:0]tmp;assigntmp[width]=1'b1;generategenvari;for(i=0;i<width;i=i+1)
//重复执行8次
begin:G_Block//生成模块名称为G_Block
ex_andu1(.a(tmp[i+1]),.b(din[i]),.f(tmp[i]));//名字关联endendgenerateassigndout=tmp[0];endmodule//底层模块程序文件ex_andmoduleex_and(a,b,f);inputa,b;
//定义两个输入端口outputf;
//定义输出端口assignf=(a&b)?1'b1:1'b0;//与门逻辑endmodule5.1.2编码器的实现1.普通编码器符号输
入输
出D7D6D5D4D3D2D1D0Y2Y1Y00111111111110111111110110111111011110111110011110111011111110110101111110100111111110000表5-18线-3线编码器的符号与真值表5.1.2编码器的实现moduleex_code1(a7,a6,a5,a4,a3,a2,a1,a0,y2,y1,y0);inputa7,a6,a5,a4,a3,a2,a1,a0;outputy2,y1,y0;reg[2:0]dout;always@(*)case({a7,a6,a5,a4,a3,a2,a1,a0})8'b01111111:dout=3'b111;8'b10111111:dout=3'b110;8'b11011111:dout=3'b101;8'b11101111:dout=3'b100;8'b11110111:dout=3'b011;8'b11111011:dout=3'b010;8'b11111101:dout=3'b001;8'b11111110:dout=3'b000;default:dout=3'bzzz;//使用'z'表示高阻抗状态
endcaseassigny2=dout[2];assigny1=dout[1];assigny0=dout[0];endmodulemoduleex_code2(a,y);input[7:0]a;outputreg[2:0]y;always@(a)case(a)
8'b01111111:y=3'b111;8'b10111111:y=3'b110;8'b11011111:y=3'b101;8'b11101111:y=3'b100;8'b11110111:y=3'b011;8'b11111011:y=3'b010;8'b11111101:y=3'b001;8'b11111110:y=3'b000;default:y=3'bzzz;
//使用'z'表示高阻抗状态
endcaseendmodule【例5-3】普通编码器电路的VerilogHDL实现。5.1.2编码器的实现2.优先编码器表5-274LS148的符号与真值表符号输
入输
出EIA7A6A5A4A3A2A1A0Y2Y1Y0EOGS1×
×
×
×
×
×
×
×111110111111111110100×
×
×
×
×
×
×00010010×
×
×
×
×
×001100110×
×
×
×
×0101001110×
×
×
×01110011110×
×
×100100111110×
×1011001111110×11010011111110111105.1.2编码器的实现【例5-4】优先编码器电路74LS148的VerilogHDL实现。moduleex_code3(EI,A,Y,EO,GS);inputEI;input[7:0]A;output[2:0]Y;outputEO,GS;reg[4:0]dout;always@(*)
if(EI==1'b1)dout=5'b11111;elseif(A[7]==1'b0)dout=5'b00010;elseif(A[6]==1'b0)dout=5'b00110;elseif(A[5]==1'b0)dout=5'b01010;elseif(A[4]==1'b0)dout=5'b01110;elseif(A[3]==1'b0)dout=5'b10010;elseif(A[2]==1'b0)dout=5'b10110;elseif(A[1]==1'b0)dout=5'b11010;elseif(A[0]==1'b0)dout=5'b11110;elseif(A==8'b1111_1111)dout=5'b11101;assign{Y,EO,GS}=dout;endmodule5.1.3译码器的实现1.二进制译码器表5-374LS138的符号与真值表符号输
入输
出e3e2e1abcy7y6y5y4y3y2y1y01000001111111000111111101010111110110111111011110011101111101110111111101011111111101111111000×××ZZZZZZZZ5.1.3译码器的实现【例5-5】译码器电路74LS138的VerilogHDL实现。moduleex_decode1(e3,e2,e1,a,b,c,y7,y6,y5,y4,y3,y2,y1,y0);inpute3,e2,e1,a,b,c;outputy7,y6,y5,y4,y3,y2,y1,y0;reg[2:0]en,din;
//en暂存控制端状态;din暂存输入端状态reg[7:0]dout;
//定义变量dout暂存分支输出always@(*)begin
en={e3,e2,e1};
//控制端与en进行关联din={a,b,c};
//输入端与din进行关联if(en==3'b100)case(din)//根据din状态进行多分支选择3'b000:dout=8'b11111110;3'b001:dout=8'b11111101;3'b010:dout=8'b11111011;
3'b011:dout=8'b11110111;3'b100:dout=8'b11101111;3'b101:dout=8'b11011111;3'b110:dout=8'b10111111;3'b111:dout=8'b01111111;endcase
elseif(en==3'b000)
dout=8'bzzzz_zzzz;endassign{y7,y6,y5,y4,y3,y2,y1,y0}=dout;
//将dout各位状态送到相关输出端endmodule5.1.3译码器的实现2.十进制译码器表5-474LS42的真值表
输入输出A3A2A1A0Y0Y1Y2Y3Y4Y5Y6Y7Y8Y9000000111111111100011011111111200101101111111300111110111111401001111011111501011111101111601101111110111701111111111011810001111111101910011111111110伪码1010111111111110111111111111110011111111111101111111111111101111111111111111111111115.1.3译码器的实现【例5-6】译码器电路74LS42的VerilogHDL实现。moduleex_decode2(A,Y);input[3:0]A;outputreg[9:0]Y;always@(A)case(A)
4'b0000:Y=10'b11_1111_1110;//数字0的译码4'b0001:Y=10'b11_1111_1101;//数字1的译码4'b0010:Y=10'b11_1111_1011;//数字2的译码4'b0011:Y=10'b11_1111_0111;//数字3的译码4'b0100:Y=10'b11_1110_1111;//数字4的译码4'b0101:Y=10'b11_1101_1111;//数字5的译码4'b0110:Y=10'b11_1011_1111;//数字6的译码4'b0111:Y=10'b11_0111_1111;//数字7的译码4'b1000:Y=10'b10_1111_1111;//数字8的译码4'b1001:Y=10'b01_1111_1111;//数字9的译码default:Y=10'b11_1111_1111;
//数字10~15的译码
endcaseendmodule5.1.3译码器的实现3.七段显示译码器
数码管中的发光二极管有两种接法:①所有发光二极管的阳极连接在一起,这种连接方法称为共阳极接法;②所有二极管的阴极连接在一起,这种连接方法称为共阴极接法。共阳极的数码管为低电平时,对应的段码被点亮;共阴极的数码管为高电平时,对应段码被点亮。一般共阴极可以不外接电阻,但共阳极中的发光二极管一定要外接电阻。5.1.3译码器的实现表5-5七段数码管的显示段码与输入/输出的关系显示内容输入输出段码A3A2A1A0dpgfedcba共阴共阳00000001111118’h3F8’hC010001000001108’h068’hF920010010110118’h5B8’hA430011010011118’h4F8’hB040100011001108’h668’h9950101011011018’h6D8’h9260110011111018’h7D8’h8270111000001118’h078’hF881000011111118’h7F8’h8091001011011118’h6F8’h90A1010011101118’h778’h88B1011011111008’h7C8’h83C1100001110018’h398’hC6D1101010111108’h5E8’hA1E1110011110018’h798’h86F1111011100018’h718’h8E5.1.3译码器的实现【例5-7】共阴极、共阳极可选输出的七段数码管显示译码器的VerilogHDL实现。moduleex_LED(flag,A3,A2,A1,A0,dp,g,h,f,e,d,c,b,a);inputflag,A3,A2,A1,A0;outputdp,g,h,f,e,d,c,b,a;reg[7:0]dout;//dout用于暂存数码管的显示值always@(flag,A3,A2,A1,A0)begin
case({A3,A2,A1,A0})//flag=1,共阴极输出
4'b0000:dout=8'h3F;//显示0
4'b0001:dout=8'h06;//显示1
4'b0010:dout=8'h5B;//显示2
4'b0011:dout=8'h4F;//显示3
4'b0100:dout=8'h66;//显示4
4'b0101:dout=8'h6D;//显示5
4'b0110:dout=8'h7D;//显示6
4'b0111:dout=8'h07;//显示7
4'b1000:dout=8'h7F;//显示8
4'b1001:dout=8'h6F;//显示94'b1010:dout=8'h77;//显示A
4'b1011:dout=8'h7C;//显示B
4'b1100:dout=8'h39;//显示C
4'b1101:dout=8'h5E;//显示D
4'b1110:dout=8'h79;//显示E
4'b1111:dout=8'h71;//显示F
endcase
if(!flag)
dout=~dout;//flag=0,共阳极输出endassign{dp,g,h,f,e,d,c,b,a}=dout;endmodule5.1.4数据比较器的实现【例5-8】编写两个n位数据比较器的VerilogHDL程序,要求将A和B大小的比较结果分别送入Y0、Y1和Y2中。moduleex_compn(A,B,Y);parameterwidth=8;input[width-1:0]A,B;output[2:0]Y;reg[2:0]temp;
//暂存比较结果regflag;
//比较标志位integeri;always@(A,B)begin
temp=3'b001;
//比较结果默认为相等flag=0;
//标志位默认为0for(i=width-1;i>=0;i=i-1)
begin
if(!flag)
//标志位为0,继续比较,否则退出
begin
if(A[i]==1'b1&&B[i]==1'b0)//A[i]大于B[i]
begin
temp=3'b100;flag=1;//A[i]大于B[i],flag为1end
elseif(A[i]==1'b0&&B[i]==1'b1)//A[i]小于B[i]
begintemp=3'b010;
flag=1;//A[i]小于B[i],flag为1
end end
end
endassignY[0]=(temp[0]&(~temp[2]))|(temp[0]&(~temp[1]));//A等于BassignY[2]=temp[2];//A大于BassignY[1]=temp[1];//A小于Bendmodule5.1.5数据选择器与数据分配器的实现1.数据选择器表5-68选1数据选择器的符号与真值表符号输
入输
出GCBAY0000D0001D1010D2011D3100D4101D5110D6111D71×××05.1.5数据选择器与数据分配器的实现【例5-9】8选1数据选择器电路的VerilogHDL实现。moduleex_mux(C,B,A,G,D0,D1,D2,D3,D4,D5,D6,D7,Y);inputC,B,A,G;//C~A为数据选择端,G为使能端inputD0,D1,D2,D3,D4,D5,D6,D7;//数据输入outputregY;//数据输出always@(C,B,A,G)if(!G)
//G为低电平执行case语句
case({C,B,A})3'b000:Y=D0;3'b001:Y=D1;3'b010:Y=D2;3'b011:Y=D3;3'b100:Y=D4;3'b101:Y=D5;3'b110:Y=D6;3'b111:Y=D7;endcase
else
Y=1'b0;//G为高电平,Y输出为低电平endmodule5.1.5数据选择器与数据分配器的实现1.数据分配器表5-78路数据分配器的真值表输入输出S2S1S0Y7Y6Y5Y4Y3Y2Y1Y00001111111D001111111D101011111D110111111D111100111D111110111D111111101D111111111D11111115.1.5数据选择器与数据分配器的实现【例5-10】8路数据分配器电路的VerilogHDL实现。moduleex_dmux(S,D,Y);input[2:0]S;
//选择端的定义inputD;
//数据输入端的定义outputreg[7:0]Y;//输出端的定义always@(S,D)begin
Y=8'b1111_1111;
//预置输出的初始状态case(S)
//根据S的状态将D送到相应的端子输出
3'b000:Y[0]=D;
3'b001:Y[1]=D;
3'b010:Y[2]=D;
3'b011:Y[3]=D;
3'b100:Y[4]=D;
3'b101:Y[5]=D;
3'b110:Y[6]=D;
3'b111:Y[7]=D;endcase
endendmodule任务5.2时序逻辑电路的实现
时序电路,它是由最基本的逻辑门电路加上反馈逻辑回路(输出到输入)或器件组合而成的电路,与组合电路本质上的区别在于时序电路具有记忆功能。时序电路的特点是:输出不仅取决于当时的输入值,而且还与电路过去的状态有关。它类似于含储能元件的电感或电容的电路,如触发器、锁存器、寄存器和计数器等。5.2.1触发器的实现1.RS触发器SR0001010111不确定表5-9钟控RS触发器的状态转移真值表【例5-11】钟控RS触发器的VerilogHDL描述。
5.2.1触发器的实现2.D触发器【例5-12】基本D触发器的VerilogHDL描述。moduleex_basic_D(D,CP,Q,Qn);inputD,CP;outputregQ;outputQn;assignQn=~Q;//将Q的状态取反后送入Qnalways@(posedgeCP)
//CP发生上升沿跳变,则进行赋值操作begin Q<=D; endendmodule【例5-13】异步复位/置位的D触发器的VerilogHDL描述。moduleex_asyn_D(D,CP,RST,PRE,Q,Qn);inputD,CP,RST,PRE;outputregQ;outputQn;assignQn=~Q;
always@(posedgeCP,posedgePRE,posedgeRST)if(PRE)Q<=1'b1;//异步置位
elseif(RST)Q<=1'b0;//异步复位
elseQ<=D;//CP发生上升沿跳变,则进行赋值操作endmodule5.2.1触发器的实现2.D触发器【例5-14】同步复位/置位的D触发器的VerilogHDL描述。moduleex_syn_D(D,CP,RST,PRE,Q,Qn);inputD,CP,RST,PRE;outputregQ;outputQn;assignQn=~Q;always@(posedgeCP)if(PRE)Q<=1'b1;
//同步置位elseif(RST)Q<=1'b0;//同步复位
elseQ<=D;
//CP发生上升沿跳变,则进行赋值操作endmodule5.2.1触发器的实现3.JK触发器【例5-15】异步复位/置位的JK触发器的VerilogHDL描述。moduleex_asyn_JK(J,K,CP,RST,PRE,Q,Qn);inputJ,K,CP,RST,PRE;outputregQ;outputQn;assignQn=~Q;always@(posedgeCP,posedgePRE,posedgeRST)begin
if(RST)Q<=1'b0;//异步复位elseif(PRE)Q<=1'b1;//异步置位elsecase({J,K})
2'b00:Q<=Q;
//保持
2'b01:Q<=1'b0;
//复位
2'b10:Q<=1'b1;
//置位
2'b11:Q<=~Q;
//翻转
defaultQ<=1'bx;
//任意endcase
endendmodule5.2.1触发器的实现4.T触发器【例5-16】T触发器的VerilogHDL描述。moduleex_T_trigger(T,CP,Q,Qn);inputT,CP;outputregQ,Qn;always@(posedgeCP)if(T)
begin
Qn<=Q;Q<=~Q;//翻转end
else
begin
Q<=Q;Qn<=Qn;//保持endendmodule5.2.2锁存器的实现表5-1074373锁存器的逻辑符号与真值表符
号ENGQ01(D7~D0)→(Q7~Q0)
00保持1×Q7~Q0高阻态【例5-17】74373锁存器的VerilogHDL描述。moduleex_Latch(EN,G,D,Q);parameterwidth=8;inputEN,G;input[width-1:0]D;outputreg[width-1:0]Q;always@(EN,G)if(!EN)
begin
if(G)Q<=D;//传送数据
elseQ<=Q;
//锁存数据end
else
Q<=8'bz;
//高阻态endmodule5.2.3寄存器的实现1.数码寄存器【例5-18】74374数码寄存器的VerilogHDL描述。moduleex_Register(OEN,D,CLK,Q);parameterwidth=8;inputOEN,CLK;input[width-1:0]D;outputreg[width-1:0]Q;always@(posedgeCLK,posedgeOEN)if(OEN)Q<=8'bz;
//高阻态
elseQ<=D;
//数据传输endmodule2.移位寄存器【例5-19】串入-并出移位寄存器74164的VerilogHDL描述。moduleex_sfhit_Register(A,B,CLK,CLR,Q);inputA,B,CLK,CLR;outputreg[7:0]Q;always@(posedgeCLKornegedgeCLR)beginif(!CLR)Q<=8'b00000000;elseQ<={Q[6:0],(A&B)};endendmodule5.2.4计数器的实现1.异步计数器【例5-20】使用元件生成语句,编写由4个触发器构成的计数范围为0~F的异步计数器程序。//顶层文件,通过4次调用D触发器程序实现计数moduleex_count(CLK,RST,COUT);inputCLK,RST;output[3:0]COUT;wire[4:0]cnt;assigncnt[0]=CLK;genvari;generate//循环生成for(i=0;i<4;i=i+1)
begin:G1//例化语句differU1(.CP(cnt[i]),.CLR(RST),.D(cnt[i+1]),.Q(COUT[i]),.Qn(cnt[i+1]));endendgenerateendmodule//D触发器程序differ.vmodulediffer(CP,CLR,D,Q,Qn);inputCP,CLR,D;outputregQ;outputQn;assignQn=~Q;always@(posedgeCP,posedgeCLR)if(CLR)Q<=1'b0;
//异步复位
elseQ<=D;endmodule5.2.4计数器的实现2.同步计数器【例5-21】编写一个模为60具有异步复位、同步置数功能的8421BCD码加法计数器。moduleex_cnt60(EN,Load,RST,CLK,Din,Dout,CO);inputEN,Load,RST,CLK;input[7:0]Din;
//预置数输入outputregCO;
//计数溢出outputreg[7:0]Dout;
//计数输出reg[3:0]cnt_H,cnt_L;//暂存计数值的十位和个数always@(posedgeCLK,negedgeRST)beginif(!RST)//异步复位,低电平有效begin
cnt_H<=4'h0;cnt_L<=4'h0;CO<=1'b0;endelsebeginif(Load)//同步置数begincnt_H<=Din[7:4];cnt_L<=Din[3:0];
end
elseif(EN)beginif((cnt_H==4'h5)&&(cnt_L==4'h9))//当前值是否为59begin
cnt_H<=4'h0;cnt_L<=4'h0;//为59,则十位和个位清零
CO<=1'b1;
//产生溢出信号end
elseif(cnt_L==4'h9)//否则再判断个位是否为9begin//个位为9
cnt_H<=cnt_H+1;cnt_L<=4'h0;//则十位加1,个位清零
CO<=1'b0; endelsebegincnt_H<=cnt_H;cnt_L<=cnt_L+1;//否则个位加1CO<=1'b0;end
end
endDout<={cnt_H,cnt_L};//将当前计数值输出endendmodule5.2.4计数器的实现3.可逆计数器【例5-22】编写一个模为100具有异步复位、同步置数功能的8421BCD码可逆计数器。moduleex_cnt100(EN,Load,RST,CLK,Din,DIR,Dout,CO);inputEN,Load,RST,CLK,DIR;input[7:0]Din;//预置数输入outputregCO;
//计数溢出outputreg[7:0]Dout;
//计数输出reg[3:0]cnt_H,cnt_L;
//暂存计数值的十位和个数always@(posedgeCLK,negedgeRST)begin
if(!RST)//异步复位,低电平有效
begin
cnt_H<=4'h0;cnt_L<=4'h0;
CO<=1'b0;
endelse
begin
if(Load)//同步置数
begin
cnt_H<=Din[7:4];cnt_L<=Din[3:0];end
elseif(EN)begin
if(!DIR)
//低电平加计数
beginif((cnt_H==4'h9)&&(cnt_L==4'h9))
//当前值是否为99
begin
cnt_H<=4'h0;cnt_L<=4'h0;//为99,则十位和个位清零
CO<=1'b1;//产生溢出信号
end
elseif(cnt_L==4'h9)
//否则再判断当前个位是否为9
begin
//个位为9
cnt_H<=cnt_H+1;cnt_L<=4'h0;
//则十位加1,个位清零5.2.4计数器的实现
CO<=1'b0;end
elsebegin
cnt_H<=cnt_H;cnt_L<=cnt_L+1;
//否则个位加1
CO<=1'b0;
end
end
else//DIR为高电平减计数
begin
if((cnt_H==4'h0)&&(cnt_L==4'h0))
//当前值是否为00begin
cnt_H<=4'h9;cnt_L<=4'h9;
//为00,则十位和个位置9
CO<=1'b1;//产生借位信号end
elseif(cnt_L==4'h0)//否则再判断当前个位是否为0begin//个位为0cnt_H<=cnt_H-1;cnt_L<=4'h9;
//则十位减1,个位置9CO<=1'b0;end
else
begin
cnt_H<=cnt_H;cnt_L<=cnt_L-1;//否则个位减1CO<=1'b0;endend
end
end
Dout<={cnt_H,cnt_L};//将当前计数值输出endendmodule5.2.5分频器的实现1.偶数分频器【例5-23】10分频电路的VerilogHDL描述。moduleex_divider10(clkin,CLR,clkout);parametern=10;inputclkin,CLR;outputregclkout;reg[7:0]cnt;/*第1个always过程块实现cnt的计数*/always@(posedgeclkinornegedgeCLR)begin
if(!CLR)cnt<=1'b0;
elsebegin
if(cnt==n-1)cnt<=1'b0;
elsecnt<=cnt+1'b1;
end
end/*第2个always过程块实现占空比为50%的波形输出*/always@(*)
begin
if(cnt<n/2)clkout<=1'b0;elseclkout<=1'b1;
endendmodule5.2.5分频器的实现2.奇数分频器【例5-24】7分频电路的VerilogHDL描述,要求占空比为50%。moduleex_divider7(clkin,CLR,clkout);parametern=7;inputclkin,CLR;outputclkout;reg[7:0]cnt,cnm;regclk_A,clk_B;/*第1个always过程块根据上升沿实现cnt的计数*/always@(posedgeclkinornegedgeCLR)begin
if(!CLR)cnt<=1'b0;else
begin
if(cnt==n-1)cnt<=1'b0;
elsecnt<=cnt+1'b1;
end end/*第2个always过程块根据下降沿实现cnm的计数*/always@(negedgeclkinornegedgeCLR)begin
if(!CLR)cnm<=1'b0;
else
begin
if(cnm==n-1)cnm<=1'b0;
elsecnm<=cnm+1'b1;end
end/*第3个always过程块根据cnt和cnm输出两个方波信号*/always@(*)
begin
if(cnt<n/2)clk_A<=1'b1;elseclk_A<=1'b0;if(cnm<n/2)clk_B<=1'b1;
elseclk_B<=1'b0;
end
assignclkout=clk_A|clk_B;endmodule5.2.5分频器的实现3.2n分频器【例5-25】设计一个2n分频器,输入频率为48MHz,输出频率分别为24MHz、6MHz、1.5MHz、750kHz、375kHz。moduleex_fdivider(clkin,EN,RST,clk_1,clk_2,clk_3,clk_4,clk_5);inputclkin,EN,RST;outputclk_1,clk_2,clk_3,clk_4,clk_5;reg[6:0]cnt;always@(posedgeclkin,negedgeRST)
begin
if(!RST)cnt<=1'b0;elseif(EN)cnt<=cnt+1;end
assignclk_1=cnt[0];//输出24MHz频率assignclk_2=cnt[2];//输出6MHz频率assignclk_3=cnt[4];//输出1.5MHz频率assignclk_4=cnt[5];//输出750kHz频率assignclk_5=cnt[6];//输出375kHz频率endmodule5.2.5分频器的实现4.半整数分频器【例5-26】一个4.5的半整数分频器的VerilogHDL描述。moduleex_fdivder45(clkin,clkout);parametern=5;inputclkin;outputclkout;wireclk1;regdiv2,clk2;reg[2:0]cnt;//初始化信号initialbegin
cnt=3'b0;
div2=1'b0;
clk2=1'b0;
endassignclk1=clkin^div2;always@(posedgeclk1begin
if(cnt==n-1)
begin
cnt<=1'b0;clk2<=1'b1;
end
else
begin
cnt<=cnt+1;
clk2<=1'b0;endend
always@(posedgeclk2)
begindiv2<=~div2;endassignclkout=clk2;endmodule5.2.5分频器的实现5.数控分频器【例5-27】数控分频器的VerilogHDL描述。moduleex_digital_freq(clkin,Din,clkout);inputclkin;input[7:0]Din;outputclkout;regfull,clk;reg[7:0]cnt;always@(posedgeclkin)beginif(cnt==8'b1111_1111)begin
cnt<=Din;full<=1'b1//设置分频系数endelsebegincnt<=cnt+1;full<=1'b0;endend
always@(posedgefull)clk<=~clk;//输出占空比为50%的分频信号
assignclkout=clk;endmodule任务5.3存储器电路的实现
存储器是数字系统的重要组成部分,是用于存储程序和数据的部件。存储器还可以完成一些特殊的功能,如多路复用、速率变换、数值计算、脉冲形成、特殊序列产生以及数字频率合成等。根据功能的不同,可以将存储器分为只读存储器(Read-OnlyMemory,ROM)和随机存储器(RandomAccessMemory,RAM)两大类。5.3.1只读存储器的实现【例5-28】用VHDL描述一个容量为256×4B的ROM存储器,该ROM有10位地址线address[9..0],8位数据输出线dataout[7..0]和使能EN端。moduleex_ROM(address,en,Dout);inputen;//使能端input[9:0]address;
//10位地址线outputreg[7:0]Dout;
//8位数据输出线always@(address,en)
if(en)case(address)10'b00_0000_0010:Dout<=8'b0000_1001;10'b00_0000_0001:Dout<=8'b0001_1010;10'b00_0000_0011:Dout<=8'b0001_1011;10'b00_1101_0101:Dout<=8'b0100_1100;10'b00_1101_0110:Dout<=8'b1110_0000;10'b00_1101_0111:Dout<=8'b1111_0000;10'b00_1110_0000:Dout<=8'b0001_0000;10'b00_1110_0001:Dout<=8'b0101_0000;10'b00_1110_1011:Dout<=8'b0001_0100;10'b00_1110_1100:Dout<=8'b0001_1000;10'b00_1111_1101:Dout<=8'b1111_0001;10'b00_1111_1110:Dout<=8'b1001_0000;10'b01_0000_0000:Dout<=8'b1101_0000;10'b01_0000_0010:Dout<=8'b0101_0100;10'b01_0000_0011:Dout<=8'b0001_1010;10'b01_0000_0001:Dout<=8'b0001_1011;10'b01_0001_0100:Dout<=8'b0111_1010;10'b01_0011_1001:Dout<=8'b0101_1011;10'b01_0100_0101:Dout<=8'b1101_1011;
defaultDout<=8'b0000_0000;//默认值
endcaseelseDout<=8'b0000_0000;endmodule5.3.2随机存储器的实现【例5-29】用VerilogHDL描述一个容量为16×8位的单口RAM存储器,该RAM有4位地址线address[3..0]、8位数据输入线datain[7..0]、8位数据输出线dataout[7..0]、时钟端clk和读/写控制端wr。`definewidth8//定义数据宽度为8`definedepth16
//定义深度为16moduleex_RAMa(address,clk,wr,Din,Dout);
inputclk,wr;input[3:0]address;//定义数据线为4位input[`width-1:0]Din;outputreg[`width-1:0]Dout;reg[`width-1:0]mem[`depth-1:0];
//定义RAM存储器大小always@(posedgeclk)if(wr)mem[address]<=Din;//写入数据else
Dout<=mem[address];
//读取数据endmodule5.3.2随机存储器的实现【例5-30】用VerilogHDL描述一个容量为8×8位的双口RAM存储器,该RAM有4位写地址线w_addr[3..0]、4位读地址线r_addr[3..0]、8位数据输入线datain[7..0]、8位数据输出线dataout[7..0]、时钟端clk、写控制端we和读控制端re。`definewidth8//定义数据宽度为8`definesize4//定义地址宽度为4`definedepth8//定义深度为8moduleex_RAMb(wr_addr,rd_addr,clk,we,re,Din,Dout);inputclk,we,re;input[`size-1:0]wr_addr,rd_addr;input[`width-1:0]Din;outputreg[`width-1:0]Dout;reg[`width-1:0]mem[`depth-1:0];//定义RAM存储器大小always@(posedgeclk,posedgewe,posedgere)begin
if(we)mem[wr_addr]<=Din;//写入数据
elseif(re)
Dout<=mem[rd_addr];//读出数据endendmodule任务5.4状态机的实现
有限状态机(finite-statemachine,FSM),又称有限状态自动机,简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。在数字电路系统中,状态机是一种十分重要的时序逻辑电路模块,它是一组触发器的输出状态随着时钟脉冲和输入信号按照一定的规律变
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年山东国企招聘考试(工程管理)仿真试题及答案
- 2026年人力资源从业基础知识考核试题题库与答案
- 广东省深圳市2026年中考模拟考试物理试题附答案
- 2026年煤矿知识竞赛题库(附答案)
- 2026年慢性阻塞性肺疾病考核试题及答案
- 2025年黑龙江省海林市高三历史上册期末考试自测卷附参考答案(B卷)
- 2026年河北省武安市高三历史下册期末考试自测卷【名师系列】附答案
- 2026届河南省商丘市高考临考冲刺语文试卷含解析
- 2025年河南省荥阳市高二历史上册期末考试检测卷附参考答案【突破训练】
- 2026年中山市高考考前模拟语文试题含解析
- 2026届深圳市高三英语高考三模原创仿真模拟试卷(含答案逐题解析、听力原文与作文范文)第843套
- 2025年课件-(已瘦身)2023版马原马克思主义基本原理(2023年版)全套教学课件-新版
- 人教版数学小学五年级下册期末测试卷附答案(满分必刷)
- 学校收费调整应急预案
- 核电站反应堆控制棒驱动机构课件
- 2023新高考Ⅰ卷数学真题(原卷版)
- 大学生本科毕业后,先工作还是先考研辩论稿5篇汇编
- 职业技能大赛:中式烹调师(三级)理论知识考核要素细目表(征求意见稿)
- 国际航运管理课程设计
- 事业单位公开招聘人员政审表(样表)
- GB/T 42061-2022医疗器械质量管理体系用于法规的要求
评论
0/150
提交评论