verilog HDL基础程序.doc_第1页
verilog HDL基础程序.doc_第2页
verilog HDL基础程序.doc_第3页
verilog HDL基础程序.doc_第4页
verilog HDL基础程序.doc_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

涉及到需要时间的并且在不同的时间执行程序时就要用到分频计数器至于需要分频多少看需要执行多少次,也就是需要用到的时间有多少次。3-8 译码器 /学习3 8译码器的原理,/拨码开关的 1 2 3作为输入/本实验采用拨码开关来作为输入,LED作为状态显示/当然如果你的学习板没有拨码开关,可以用key1 key2 key3 作为数据输入。module decoder_38(out,key_in);output7:0 out; /3 8译码器输出有8钟状态,所以要8个LED灯。input2:0 key_in; /(1 2 3)key1 key2 key3 作为数据输入reg7:0 out;always (key_in)begincase(key_in) 3d0: out=8b11111110; /LED作为状态显示,低电平有效3d1: out=8b11111101;3d2: out=8b11111011;3d3: out=8b11110111;3d4: out=8b11101111;3d5: out=8b11011111;3d6: out=8b10111111;3d7: out=8b01111111;endcase end endmodule1位数码管动态显示/一位数码管试验/利用分频计数器得到数码管,效果module SMG_LED (clk_50M,rst,led_bit,dataout);input clk_50M,rst; /系统时钟50M输入 从12脚输入。output 7:0 dataout; /我们这里用数码管,output led_bit; /一位数码管的位选择reg 7:0 dataout;reg led_bit; reg 27:0 count; /分频计数器/分频计数器always ( posedge clk_50M ) begin count=count+1; /计数器自加 endalways ( posedge clk_50M or negedge rst) begin led_bit = b0; /是数码管的位选择处于导通状态 case ( count27:24 ) / case ( count27:24 )这一句希望初学者看明白, / 也是分频的关键 / 在数码管上面显示0到F 0: dataout=8b11000000; /0 1: dataout=8b11111001; 2: dataout=8b10100100; 3: dataout=8b10110000; 4: dataout=8b10011001; 5: dataout=8b10010010; 6: dataout=8b10000010; 7: dataout=8b11111000; 8: dataout=8b10000000; 9: dataout=8b10010000; 10:dataout=8b10001000; 11:dataout=8b10000011; 12:dataout=8b11000110; 13:dataout=8b10100001; 14:dataout=8b10000110; 15:dataout=8b10001110; /f endcase endendmodule7段数码管静态显示/本实验就是学习单个数码管的显示module SMG_LED (clk_50M,led_bit,dataout);input clk_50M ; /系统时钟50M输入 从12脚输入。output 7:0 dataout; /我们这里用数码管,output led_bit; /一位数码管的位选择reg 7:0 dataout;reg led_bit; always ( posedge clk_50M ) begin led_bit = b0; /是数码管的位选择处于导通状态 dataout=8b11000000; /修改7段码,可以显示不同的字符 /本实验初始是在数码管显示0 end数码管静态显示0到7/段数码管测试实验:以动态扫描方式在位数码管/“同时”显示-7/实验的目的是向用户介绍多个数码管动态显示的方法。/动态显示的方法是,按一定的频率轮流向各个数码管的COM端送出低电平/,同时送出对应的数据给各段module led_0_7 (clk,rst,dataout,en);input clk,rst; /系统时钟50M输入 从12脚输入。output7:0 dataout; /数码管的段码输出output7:0 en; /数码管的位选使能输出reg7:0 dataout; reg7:0 en;reg15:0 cnt_scan;/扫描频率计数器reg4:0 dataout_buf;always(posedge clk or negedge rst)beginif(!rst) begincnt_scan=0; endelse begincnt_scan=cnt_scan+1;endendalways (cnt_scan)begin case(cnt_scan15:13) 3b000 : en = 8b1111_1110; 3b001 : en = 8b1111_1101; 3b010 : en = 8b1111_1011; 3b011 : en = 8b1111_0111; 3b100 : en = 8b1110_1111; 3b101 : en = 8b1101_1111; 3b110 : en = 8b1011_1111; 3b111 : en = 8b0111_1111; default : en = 8b1111_1110; endcaseendalways(en) /对应COM信号给出各段数据begincase(en)8b1111_1110:dataout_buf=0;8b1111_1101:dataout_buf=1;8b1111_1011:dataout_buf=2;8b1111_0111:dataout_buf=3;8b1110_1111:dataout_buf=4;8b1101_1111:dataout_buf=5;8b1011_1111:dataout_buf=6;8b0111_1111:dataout_buf=7;default: dataout_buf=8; endcaseendalways(dataout_buf)begincase(dataout_buf)4b0000:dataout=8b1100_0000;4b0001:dataout=8b1111_1001;4b0010:dataout=8b1010_0100;4b0011:dataout=8b1011_0000;4b0100:dataout=8b1001_1001;4b0101:dataout=8b1001_0010;4b0110:dataout=8b1000_0010;4b0111:dataout=8b1111_1000;4b1000:dataout=8b1000_0000;4b1001:dataout=8b1001_1000;4b1010:dataout=8b1000_1000;4b1011:dataout=8b1000_0011;4b1100:dataout=8b1100_0110;4b1101:dataout=8b1010_0001;4b1110:dataout=8b1000_0110;4b1111:dataout=8b1000_1110; endcaseendendmodule8位优先编码器/学习编码器的原理/优先编码器,拨码开关来作为输入,结果由数码管显示 module encode(a,c,en);input8:1 a; /由键盘输入数据output7:0 c; /结果由数码管显示reg7:0 c;output7:0 en;reg3:0 c_tmp;integer i;assign en=0;always(a) beginc_tmp=0;for(i=1;i9;i=i+1) beginif(ai)c_tmp=i;endendalways(c_tmp)begin/下面是7段码显示的段码case(c_tmp)4b0000:c=8b11000000; /04b0001:c=8b11111001; /14b0010:c=8b10100100;4b0011:c=8b10110000;4b0100:c=8b10011001;4b0101:c=8b10010010;4b0110:c=8b10000010;4b0111:c=8b11111000;4b1000:c=8b10000000;4b1001:c=8b10010000;4b1010:c=8b10001000;4b1011:c=8b10000011;4b1100:c=8b11000110;4b1101:c=8b10100001;4b1110:c=8b10000110;4b1111:c=8b10001110; /f endcaseendendmodulebuzzer向蜂鸣器发送一定频率的方波可以使蜂鸣器发出相应的音调,该实验通过设计一个状态机和分频器使蜂鸣器发出多来咪发梭拉西多的音调。module buzzer(clk,rst,out);input clk,rst;output out;reg out;reg3:0 clk_div1; /基频分频计数器,基频为4Mreg12:0 clk_div2;/音阶分频计数器,由基频分频产生各个音阶reg21:0 cnt;/各音阶发声时间长短计数器reg2:0 state;parameter duo=3822, /各个音调的分频系数 lai=3405,mi=3034,fa=2865,suo=2551,la=2273,xi=2024,duo1=1911;always(posedge clk or negedge rst)beginif(!rst) beginclk_div1=0; endelse beginif(clk_div1!=9)clk_div1=clk_div1+1;elseclk_div1=0; endendalways(posedge clk or negedge rst)beginif(!rst) beginclk_div2=0;state=0;cnt=0;out=0; endelse if(clk_div1=9) begincase(state)3b000: begin /发“多”cnt=cnt+1;if(cnt=22h3fffff) state=3b001;if(clk_div2!=duo)clk_div2=clk_div2+1;else beginclk_div2=0;out=out;end end3b001: begin/发“来”cnt=cnt+1;if(cnt=22h3fffff) state=3b010;if(clk_div2!=lai)clk_div2=clk_div2+1;else beginclk_div2=0;out=out;end end3b010:begin /发米“cnt=cnt+1;if(cnt=22h3fffff) state=3b011;if(clk_div2!=mi)clk_div2=clk_div2+1;else beginclk_div2=0;out=out;end end3b011: begin /发法“cnt=cnt+1;if(cnt=22h3fffff) state=3b100;if(clk_div2!=fa)clk_div2=clk_div2+1;else beginclk_div2=0;out=out;end end3b100: begin /发梭“ cnt=cnt+1;if(cnt=22h3fffff) state=3b101;if(clk_div2!=suo)clk_div2=clk_div2+1;else beginclk_div2=0;out=out;end end3b101: begin /发拉“cnt=cnt+1;if(cnt=22h3fffff) state=3b110;if(clk_div2!=la)clk_div2=clk_div2+1;else beginclk_div2=0;out=out;end end3b110: begin /发西“cnt=cnt+1;if(cnt=22h3fffff) state=3b111;if(clk_div2!=xi)clk_div2=clk_div2+1;else beginclk_div2=0;out=out;end end3b111: begin /发多“(高音)cnt=cnt+1;if(cnt=22h3fffff) state=3b000;if(clk_div2!=duo1)clk_div2=clk_div2+1;else beginclk_div2=0;out=out;end end endcase endendendmoduleLCD1602_B//本实验是用LCD1602显示英文。(LCD带字库)module lcd(clk, rs, rw, en,dat); input clk; /系统时钟输入50M output 7:0 dat; /LCD的8位数据口 output rs,rw,en; /LCD的控制脚 reg e; reg 7:0 dat; reg rs; reg 15:0 counter; reg 4:0 current,next; reg clkr; reg 1:0 cnt; parameter set0=4h0; parameter set1=4h1; parameter set2=4h2; parameter set3=4h3; parameter dat0=4h4; parameter dat1=4h5; parameter dat2=4h6; parameter dat3=4h7; parameter dat4=4h8; parameter dat5=4h9; parameter dat6=4hA; parameter dat7=4hB; parameter dat8=4hC; parameter dat9=4hD; parameter dat10=4hE; parameter dat11=5h10; parameter nul=4hF; always (posedge clk) begin counter=counter+1; if(counter=16h000f) clkr=clkr; end always (posedge clkr) begin current=next; case(current) set0: begin rs=0; dat=8h31; next=set1; end /*设置8位格式,2行,5*7* set1: begin rs=0; dat=8h0C; next=set2; end /*整体显示,关光标,不闪烁*/ set2: begin rs=0; dat=8h6; next=set3; end /*设定输入方式,增量不移位*/ set3: begin rs=0; dat=8h1; next=dat0; end /*清除显示*/ /上面是LCD的初始化 dat0: begin rs=1; dat=8h3C; next=dat1; end dat1: begin rs=1; dat=F; next=dat2; end dat2: begin rs=1; dat=P; next=dat3; end dat3: begin rs=1; dat=G; next=dat4; end dat4: begin rs=1; dat=A; next=dat5; end dat5: begin rs=1; dat=8h3E; next=dat6; end dat6: begin rs=1; dat=G; next=dat7; end dat7: begin rs=1; dat=O; next=dat8; end dat8: begin rs=1; dat=O; next=dat9; end dat9: begin rs=1; dat=D; next=dat10; end dat10: begin rs=1; dat=!; next=dat11; end dat11: begin rs=1; dat=!; next=nul; end /上面是在这12个状态中要显示的字符 FPGA GOOD! nul: begin rs=0; dat=8h00; /行一遍 然后 把液晶的E 脚 拉高 if(cnt!=2h2) begin e=0;next=set0;cnt=cnt+1; end else begin next=nul; e=1; end end default: next=set0; endcase end assign en=clkr|e; assign rw=0; endmodule LCD12864显示汉字/利用VHDL驱动LCD12864/视频教程适合我们21EDA电子的所有学习板)/本实验是用LCD12864显示汉字。(LCD带字库)module LCD12864 (clk, rs, rw, en,dat); input clk; /系统时钟输入50M output 7:0 dat; /LCD的8位数据口 output rs,rw,en; /LCD的控制脚 reg e; reg 7:0 dat; reg rs; reg 15:0 counter; reg 6:0 current,next; reg clkr; reg 1:0 cnt; parameter set0=6h0; parameter set1=6h1; parameter set2=6h2; parameter set3=6h3; parameter set4=6h4; parameter set5=6h5; parameter set6=6h6; parameter dat0=6h7; parameter dat1=6h8; parameter dat2=6h9; parameter dat3=6hA; parameter dat4=6hB; parameter dat5=6hC; parameter dat6=6hD; parameter dat7=6hE; parameter dat8=6hF; parameter dat9=6h10; parameter dat10=6h12; parameter dat11=6h13; parameter dat12=6h14; parameter dat13=6h15; parameter dat14=6h16; parameter dat15=6h17; parameter dat16=6h18; parameter dat17=6h19; parameter dat18=6h1A; parameter dat19=6h1B; parameter dat20=6h1C; parameter dat21=6h1D; parameter dat22=6h1E; parameter dat23=6h1F; parameter dat24=6h20; parameter dat25=6h21; parameter dat26=6h22; parameter dat27=6h23; parameter dat28=6h24; parameter dat29=6h25; parameter dat30=6h26; parameter dat31=6h27; parameter dat32=6h28; parameter dat33=6h29; parameter dat34=6h2A; parameter dat35=6h2B; parameter dat36=6h2C; parameter dat37=6h2E; parameter dat38=6h2F; parameter dat39=6h30; parameter dat40=6h31; parameter dat41=6h32; parameter dat42=6h33; parameter dat43=6h34; parameter nul=6h35; always (posedge clk) /da de shi zhong pinlv begin counter=counter+1; if(counter=16h000f) clkr=clkr; end always (posedge clkr) begin current=next; case(current) set0: begin rs=0; dat=8h31; next=set1; end /*设置8位格式,2行,5*7* set1: begin rs=0; dat=8h0C; next=set2; end /*整体显示,关光标,不闪烁*/ set2: begin rs=0; dat=8h6; next=set3; end /*设定输入方式,增量不移位*/ set3: begin rs=0; dat=8h1; next=dat0; end /*清除显示*/ dat0: begin rs=1; dat=8hc9; next=dat1; end /显示第一行 dat1: begin rs=1; dat=8hee; next=dat2; end dat2: begin rs=1; dat=8hdb; next=dat3; end dat3: begin rs=1; dat=8hda;next=dat4; end dat4: begin rs=1; dat=8hca; next=dat5; end dat5: begin rs=1; dat=8hd0; next=dat6; end dat6: begin rs=1; dat=2; next=dat7; end dat7: begin rs=1; dat=1;next=dat8; end dat8: begin rs=1; dat=E; next=dat9; end dat9: begin rs=1; dat=D;next= dat10 ; end dat10: begin rs=1; dat=8hB5; next=dat11; end dat11: begin rs=1; dat=8hE7; next=dat12; end dat12: begin rs=1; dat=8hd7;next=dat13; end dat13: begin rs=1; dat=8hd3; next=set4; end set4: begin rs=0; dat=8h90; next=dat14; end /显示第二行 dat14: begin rs=1; dat=C; next=dat15; end dat15: begin rs=1; dat=P; next=dat16; end dat16: begin rs=1; dat=L; next=dat17; end dat17: begin rs=1; dat=D; next=dat18; end dat18: begin rs=1; dat=-; next=dat19; end dat19: begin rs=1; dat=2; next=dat20; end dat20: begin rs=1; dat=1; next=dat21; end dat21: begin rs=1; dat=E; next=dat22; end dat22: begin rs=1; dat=D; next=dat23; end dat23: begin rs=1; dat=A; next=dat24 ; end dat24: begin rs=1; dat=8hbf; next=dat25; end dat25: begin rs=1; dat=8haa; next=dat26; end dat26: begin rs=1; dat=8hb7; next=dat27; end dat27: begin rs=1; dat=8ha2; next=dat28; end dat28: begin rs=1; dat=8hb0; next=dat29; end dat29: begin rs=1; dat=8he5; next=set5 ; end set5: begin rs=0; dat=8h88; next=dat30; end /显示第三行 dat30: begin rs=1; dat=L; next=dat31; end dat31: begin rs=1; dat=C; next=dat32; end dat32: begin rs=1; dat=D; next=dat33; end dat33: begin rs=1; dat=-; next=dat34; end dat34: begin rs=1; dat=8hbf; next=dat35; end dat35: begin rs=1; dat=8hd8; next=dat36; end dat36: begin rs=1; dat=8hd6; next=dat37; end dat37: begin rs=1; dat=8hc6; next=set6; end set6: begin rs=0; dat=8h9C; next=dat38; end /显示第四行 dat38: begin rs=1; dat=G; next=dat39; end dat39: begin rs=1; dat=O; next=dat40; end dat40: begin rs=1; dat=O; next=dat41; end dat41: begin rs=1; dat=D; next=dat42; end dat42: begin rs=1; dat=!; next=dat43; end dat43: begin rs=1; dat=!; next=nul; end nul: begin rs=0; dat=8h00; / 把液晶的E 脚 拉高 if(cnt!=2h2) begin e=0;next=set0;cnt=cnt+1; end else begin next=nul; e=1; end end default: next=set0; endcase end assign en=clkr|e; assign rw=0; endmodule LED花样流水灯/LED流水灯试验/利用分频计数器得到显示流水灯的效果module ledwater (clk_50M,rst,dataout);input clk_50M,rst; /系统时钟50M输入 从12脚输入。output 11:0 dataout; /我们这里用12个LED灯,reg 11:0 dataout;reg 27:0 count; /分频计数器/分频计数器always ( posedge clk_50M ) begin count=count+1; endalways ( posedge clk_50M or negedge rst) begin case ( count27:24 ) / case ( count25:22 )这一句希望初学者看明白, / 也是分频的关键 / 只有在0的那一位 对应的LED灯才亮。 0: dataout=12b111000111000; 1: dataout=12b000111000111; 2: dataout=12b110110110110; 3: dataout=12b101101101101; 4: dataout=12b011011011011; 5: dataout=12b000000000000; 6: dataout=12b010000010000; 7: dataout=12b111000111000; 8: dataout=12b111101111101; 9: dataout=12b111111111111; 10: dataout=12b111101111101; 11:dataout=12b111000111000; 12:dataout=12b010000010000; 13:dataout=12b000000000000; 14:dataout=12b111110000011; 15:dataout=switch) led0=0; else led0=1; end endmodule 按键与数码管显示/学习按键识别,FPGA检测 /key1 key2 key3 key4的状态作为数据输入,数码管作为状态显示/视频教程适合我们21EDA电子的所有学习板module key_led(clk_50M,key,duan_ma,wei_ma);input clk_50M; /系统时钟50M输入 从12脚输入。input 3:0 key; /key1 key2 key3 key4为输入的键码的值output 3:0 wei_ma; /数码管的位选output 7:0 duan_ma; /数码管的段码ABCDEFGHwire 3:0 key;reg 7:0 duan_ma;reg 3:0 wei_ma;reg 3:0 key_temp; /设置了一个寄存器always (posedge clk_50M )beginkey_temp=key; /把键码的值赋给寄存器case ( key_temp )4b1110:duan_ma=8b1111_1001; /段码/KEY1按下去显示14b1101:duan_ma=8b1010_0100; /段码/KEY2按下去显示24b1011:duan_ma=8b1011_0000; /段码/KEY3按下去显示34b0111:duan_ma=8

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论