特权同学-深入浅出玩转FPGA源代码

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

特权同学深入浅出玩转FPGA课程源代码首先,感谢特权同学的分享、教导,让向我这样的初学者,能够有一个良好的入门平台。。言归正传,这是我整理出来的代码文档,希望能帮到各位初学者。1.分频器`timescale1ns/1psmoduleclkdiv(clk,rst_n,clk_div);inputclk;//50MHzinputrst_n;//低电平复位信号outputclk_div;//分频信号,连接到蜂鸣器//---------------------------------------------------reg[19:0]cnt;//分频计数器always@(posedgeclkornegedgerst_n)//异步复位if(!rst_n)cnt=20'd0;elsecnt=cnt+1'b1;//寄存器cnt20ms循环计数//----------------------------------------------------regclk_div_r;//clk_div信号值寄存器always@(posedgeclkornegedgerst_n)if(!rst_n)clk_div_r=1'b0;elseif(cnt==20'hfffff)clk_div_r=~clk_div_r;//每20ms让clk_div_r值翻转一次assignclk_div=clk_div_r;endmodule2.按键`timescale1ns/1ps//说明:当三个独立按键的某一个被按下后,相应的LED被点亮;//再次按下后,LED熄灭,按键控制LED亮灭modulesw_debounce(clk,rst_n,sw1_n,sw2_n,sw3_n,led_d1,led_d2,led_d3);inputclk;//主时钟信号,50MHzinputrst_n;//复位信号,低有效inputsw1_n,sw2_n,sw3_n;//三个独立按键,低表示按下outputled_d1,led_d2,led_d3;//发光二极管,分别由按键控制//---------------------------------------------------------------------------reg[2:0]key_rst;always@(posedgeclkornegedgerst_n)if(!rst_n)key_rst=3'b111;elsekey_rst={sw3_n,sw2_n,sw1_n};reg[2:0]key_rst_r;//每个时钟周期的上升沿将low_sw信号锁存到low_sw_r中always@(posedgeclkornegedgerst_n)if(!rst_n)key_rst_r=3'b111;elsekey_rst_r=key_rst;//当寄存器key_rst由1变为0时,led_an的值变为高,维持一个时钟周期wire[2:0]key_an=key_rst_r&(~key_rst);//---------------------------------------------------------------------------reg[19:0]cnt;//计数寄存器always@(posedgeclkornegedgerst_n)if(!rst_n)cnt=20'd0;//异步复位elseif(key_an)cnt=20'd0;elsecnt=cnt+1'b1;reg[2:0]low_sw;always@(posedgeclkornegedgerst_n)if(!rst_n)low_sw=3'b111;elseif(cnt==20'hfffff)//满20ms,将按键值锁存到寄存器low_sw中cnt==20'hffffflow_sw={sw3_n,sw2_n,sw1_n};//---------------------------------------------------------------------------reg[2:0]low_sw_r;//每个时钟周期的上升沿将low_sw信号锁存到low_sw_r中always@(posedgeclkornegedgerst_n)if(!rst_n)low_sw_r=3'b111;elselow_sw_r=low_sw;//当寄存器low_sw由1变为0时,led_ctrl的值变为高,维持一个时钟周期wire[2:0]led_ctrl=low_sw_r[2:0]&(~low_sw[2:0]);regd1;regd2;regd3;always@(posedgeclkornegedgerst_n)if(!rst_n)begind1=1'b0;d2=1'b0;d3=1'b0;endelsebegin//某个按键值变化时,LED将做亮灭翻转if(led_ctrl[0])d1=~d1;if(led_ctrl[1])d2=~d2;if(led_ctrl[2])d3=~d3;endassignled_d3=d1?1'b1:1'b0;//LED翻转输出assignled_d2=d2?1'b1:1'b0;assignled_d1=d3?1'b1:1'b0;endmodule3.Johnson计数器`timescale1ns/1psmodulejohnson(clk,rst_n,key1,key2,key3,led0,led1,led2,led3);inputclk;//主时钟,50MHzinputrst_n;//低电平复位inputkey1,key2,key3;//按键接口outputled0,led1,led2,led3;//LED等接口//------------------------------------reg[23:0]delay;//延时计数器always@(posedgeclkornegedgerst_n)if(!rst_n)delay=0;elsedelay=delay+1;//不断计数,周期为320msreg[2:0]key_value;//键值寄存器always@(posedgeclkornegedgerst_n)if(!rst_n)key_value=3'b111;elseif(delay==24'hffffff)key_value={key3,key2,key1};//delay320ms,锁定键值//-------------------------------------reg[2:0]key_value_r;always@(posedgeclkornegedgerst_n)if(!rst_n)key_value_r=3'b111;elsekey_value_r=key_value;wire[2:0]key_change;//判定前后20ms的键值是否发生了改变,若是,则key_change置高assignkey_change=key_value_r&(~key_value);//checkkey_valuenegedgeperclk//------------------------------------regstop_start,left_right;//流水灯控制位always@(posedgeclkornegedgerst_n)if(!rst_n)beginstop_start=1;left_right=1;endelseif(key_change[2])stop_start=~stop_start;//开始结束控制位elseif(key_change[1])left_right=1;//流水灯方向控制elseif(key_change[0])left_right=0;//流水灯方向控制//-------------------------------------reg[3:0]led_value_r;//LED值寄存器always@(posedgeclkornegedgerst_n)if(!rst_n)led_value_r=4'b1110;elseif(delay==24'h3fffff&&stop_start)//流水灯控制case(left_right)//方向控制1:led_value_r={led_value_r[2:0],led_value_r[3]};//右移0:led_value_r={led_value_r[0],led_value_r[3:1]};//左移default:;endcaseassign{led3,led2,led1,led0}=~led_value_r;endmodule4.数码管显示`timescale1ns/1psmoduleled_seg7(clk,rst_n,sm_cs1_n,sm_cs2_n,sm_db);inputclk;//50MHzinputrst_n;//复位信号,低有效outputsm_cs1_n,sm_cs2_n;//数码管片选信号,低有效output[6:0]sm_db;//7段数码管(不包括小数点)reg[24:0]cnt;//计数器,最大可以计数到2的25次方*20ns=640msalways@(posedgeclkornegedgerst_n)if(!rst_n)cnt=25'd0;elsecnt=cnt+1'b1;//循环计数reg[3:0]num;//显示数值always@(posedgeclkornegedgerst_n)if(!rst_n)num=4'd0;elseif(cnt==24'hffffff)num=num+1'b1;//每640ms增一//-------------------------------------------------------------------------------/*共阴极:不带小数点;0,1,2,3,4,5,6,7,db3fh,06h,5bh,4fh,66h,6dh,7dh,07h;8,9,a,b,c,d,e,f,灭db7fh,6fh,77h,7ch,39h,5eh,79h,71h,00h*/parameterseg0=7'h3f,seg1=7'h06,seg2=7'h5b,seg3=7'h4f,seg4=7'h66,seg5=7'h6d,seg6=7'h7d,seg7=7'h07,seg8=7'h7f,seg9=7'h6f,sega=7'h77,segb=7'h7c,segc=7'h39,segd=7'h5e,sege=7'h79,segf=7'h71;reg[6:0]sm_dbr;//7段数码管(不包括小数点)always@(num)case(num)//NUM值显示在两个数码管上4'h0:sm_dbr=seg0;4'h1:sm_dbr=seg1;4'h2:sm_dbr=seg2;4'h3:sm_dbr=seg3;4'h4:sm_dbr=seg4;4'h5:sm_dbr=seg5;4'h6:sm_dbr=seg6;4'h7:sm_dbr=seg7;4'h8:sm_dbr=seg8;4'h9:sm_dbr=seg9;4'ha:sm_dbr=sega;4'hb:sm_dbr=segb;4'hc:sm_dbr=segc;4'hd:sm_dbr=segd;4'he:sm_dbr=sege;4'hf:sm_dbr=segf;default:;endcaseassignsm_db=sm_dbr;assignsm_cs1_n=1'b0;//数码管1常开assignsm_cs2_n=1'b0;//数码管2常开endmodule5.16位乘法器`timescale1ns/1psmodulemux16(clk,rst_n,start,ain,bin,yout,done);inputclk;//芯片的时钟信号

1 / 54
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功