e几个灯同时亮灭两次verilog_【FPGA】3,先从简单的例子出发,38译码器,LED,流水灯...

本文介绍了使用Verilog实现38译码器控制LED及数码管显示的实例,包括38译码器的逻辑设计和数码管显示的数组赋值方法。还探讨了时钟分频技术,展示了如何通过Verilog实现不同频率的时钟信号输出,并解释了分频器的工作原理。
摘要由CSDN通过智能技术生成

1,38译码器  http://www.stepfpga.com/doc/altera_3ymq这样可以跟着学一些语法,比如alwaysmoduledecode38(sw,led);input[2:0]sw;//开关输入信号,利用了其中3个开关作为3-8译码器的输入output[7:0]led;//输出信号控制特定LEDreg[7:0]led;//定义led为reg型变量,在always过程块中只能对reg型变量赋值//always过程块,括号中sw为敏感变量,当sw变化一次执行一次always中所有语句,否则保持不变always@(sw)begincase(sw)//case语句,一定要跟default语句3'b000:led=8'b0111_1111;//条件跳转,其中“_”下划线只是为了阅读方便,无实际意义3'b001:led=8'b1011_1111;//位宽'进制+数值是Verilog里常数的表达方法,进制可以是b、o、d、h(二、八、十、十六进制)3'b010:led=8'b1101_1111;3'b011:led=8'b1110_1111;3'b100:led=8'b1111_0111;3'b101:led=8'b1111_1011;3'b110:led=8'b1111_1101;3'b111:led=8'b1111_1110;default:;endcaseendendmodule2,数码管显示http://www.stepfpga.com/doc/altera_4seg了解数组reg[8:0]seg[9:0];modulesegment(seg_data_1,seg_data_2,seg_led_1,seg_led_2);input[3:0]seg_data_1;//数码管需要显示0~9十个数字,所以最少需要4位输入做译码input[3:0]seg_data_2;//小脚丫上第二个数码管output[8:0]seg_led_1;//在小脚丫上控制一个数码管需要9个信号 MSB~LSB=DIG、DP、G、F、E、D、C、B、Aoutput[8:0]seg_led_2;//在小脚丫上第二个数码管的控制信号 MSB~LSB=DIG、DP、G、F、E、D、C、B、Areg[8:0]seg[9:0];//定义了一个reg型的数组变量,相当于一个10*9的存储器,存储器一共有10个数,每个数有9位宽initial//在过程块中只能给reg型变量赋值,Verilog中有两种过程块always和initial//initial和always不同,其中语句只执行一次beginseg[0]=9'h3f;//对存储器中第一个数赋值9'b00_0011_1111,相当于共阴极接地,DP点变低不亮,7段显示数字 0seg[1]=9'h06;//7段显示数字 1seg[2]=9'h5b;//7段显示数字 2seg[3]=9'h4f;//7段显示数字 3seg[4]=9'h66;//7段显示数字 4seg[5]=9'h6d;//7段显示数字 5seg[6]=9'h7d;//7段显示数字 6seg[7]=9'h07;//7段显示数字 7seg[8]=9'h7f;//7段显示数字 8seg[9]=9'h6f;//7段显示数字 9endassignseg_led_1=seg[seg_data_1];//连续赋值,这样输入不同四位数,就能输出对于译码的9位输出assignseg_led_2=seg[seg_data_2];endmodule3,时钟分频  http://www.stepfpga.com/doc/altera_5clkhttps://www.cnblogs.com/halflife/archive/2010/09/26/1836251.htmlmoduledivide(clk,rst_n,clkout);inputclk,rst_n;//输入信号,其中clk连接到FPGA的C1脚,频率为12MHzoutputclkout;//输出信号,可以连接到LED观察分频的时钟//parameter是verilog里常数语句parameterWIDTH=3;//计数器的位数,计数的最大值为 2**WIDTH-1parameterN=5;//分频系数,请确保 N < 2**WIDTH-1,否则计数会溢出//N < 2**WIDTH-1=2^3-1=7reg[WIDTH-1:0]cnt_p,cnt_n;//cnt_p为上升沿触发时的计数器,cnt_n为下降沿触发时的计数器regclk_p,clk_n;//clk_p为上升沿触发时分频时钟,clk_n为下降沿触发时分频时钟//上升沿触发时计数器的控制always@(posedgeclkornegedgerst_n)//posedge和negedge是verilog表示信号上升沿和下降沿//当clk上升沿来临或者rst_n变低的时候执行一次always里的语句beginif(!rst_n)cnt_p<=0;elseif(cnt_p==(N-1))cnt_p<=0;//来一次posedge,cnt_p就加1次,这几个always过程块是同时触发的elsecnt_p<=cnt_p+1;//计数器一直计数,当计数到N-1的时候清零,这是一个模N的计数器end//上升沿触发的分频时钟输出,如果N为奇数得到的时钟占空比不是50%;如果N为偶数得到的时钟占空比为50%always@(posedgeclkornegedgerst_n)beginif(!rst_n)clk_p<=0;elseif(cnt_p>1))//N>>1表示右移一位,相当于除以2去掉余数。有点意思,以前没注意到这种操作//注意cnt_p这里是0-N/2时输出低电平,在N/2~N-1时输出高电平

clk_p<=0;elseclk_p<=1;//得到的分频时钟正周期比负周期多一个clk时钟end//下降沿触发时计数器的控制always@(negedgeclkornegedgerst_n)beginif(!rst_n)cnt_n<=0;elseif(cnt_n==(N-1))cnt_n<=0;elsecnt_n<=cnt_n+1;end//下降沿触发的分频时钟输出,和clk_p相差半个时钟always@(negedgeclk)beginif(!rst_n)clk_n<=0;elseif(cnt_n>1))clk_n<=0;elseclk_n<=1;//得到的分频时钟正周期比负周期多一个clk时钟endassignclkout=(N==1)?clk:(N[0])?(clk_p&clk_n):clk_p;//条件判断表达式//当N=1时,直接输出clk//当N为偶数也就是N的最低位为0,N(0)=0,输出clk_p//当N为奇数也就是N最低位为1,N(0)=1,输出clk_p&clk_n。正周期多所以是相与endmoduleassign clk_out = (F_DIV == 1) ? clock : (F_DIV[0] ? (clk_p_r & clk_n_r) : clk_p_r); 相当于if (F_DIV == 1) clk_out = clock;else{ if(F_DIV[0] == 1)

clk_out = clk_p_r & clk_n_r; else clk_out =clk_p_r;}

4,http://www.stepfpga.com/doc/6._led%E6%B5%81%E6%B0%B4%E7%81%AFmoduleflashled(clk,rst,led);inputclk,rst;output[7:0]led;wireclk1h;//定义一个中间变量,表示分频得到的时钟,用作计数器的触发//例化分频器模块,产生一个1Hz时钟信号divide#(.WIDTH(32),.N(12000000))u2(//传递参数.clk(clk),.rst_n(rst),//例化的端口信号都连接到定义好的信号.clkout(clk1h));//1Hz时钟上升沿触发循环赋值reg[7:0]led;always@(posedgeclk1hornegedgerst)beginif(!rst)//在最开始的20ns左右,已经完成对LED赋初值,即led <= 8'b11111110;led<=8'b11111110;// <=为非阻塞赋值elseled<={led[0],led[7:1]};//当时钟上升沿来一次,执行一次赋值,赋值内容是led[0]与led[7:1]重新拼接成8位赋给led,相当于循环右移end

verilog 大括号{}作用http://blog.sina.com.cn/s/blog_81a6d1330101c1bj.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值