按键去抖 最经典的程序,你应该能看懂,自己试着改一下吧,这样才能进步啊
always @ (posedge clk or negedge rst_n)
if (!rst_n)
begin
d1 <= 1'b0;
d2 <= 1'b0;
d3 <= 1'b0;
end
else
begin
if ( led_ctrl[0] ) d1 <= ~d1;
if ( led_ctrl[1] ) d2 <= ~d2;
if ( led_ctrl[2] ) d3 <= ~d3;
end
assign led_d5 = d1 1'b1 : 1'b0;
assign led_d3 = d2 1'b1 : 1'b0;
assign led_d4 = d3 1'b1 : 1'b0;
verilog用ALTERA软件编写vcs。
如果只是仿真的话,可以使用modelsim;如果要对程序进行编译、综合、烧写且调试的话,可以使用altera公司的quartus ii和xilinx公司的ise软件。这几种软件我都用过,网上都可以下到相关的安装软件。verilog hdl是一种硬件描述语言,跟C语言有点像,比较容易上手。
verilog设计:
描述复杂的硬件电路,设计人员总是将复杂的功能划分为简单的功能,模块是提供每个简单功能的基本结构。设计人员可以采取“自顶向下”的思路,将复杂的功能模块划分为低层次的模块。这一步通常是由系统级的总设计师完成。
而低层次的模块则由下一级的设计人员完成。自顶向下的设计方式有利于系统级别层次划分和管理,并提高了效率、降低了成本。“自底向上”方式是“自顶向下”方式的逆过程。
使用Verilog描述硬件的基本设计单元是模块(module)。构建复杂的电子电路,主要是通过模块的相互连接调用来实现的。模块被包含在关键字module、endmodule之内。
看你这代码真的很蛋疼,我给你写一个:
module led(clk,rst,led0,led1)
input clk,rst; output led0,led1;
reg [31:0 ]cnt_led0;
reg [31:0 ]cnt_led1;
reg led0,led1;
begin
if(rst) begin cnt<=0; led0<=0; led1<=0; end
else
begin
cnt_led0<=cnt_led0+1;
cnt_led1<=cnt_led1+1;
if(cnt_led0==99) begin led0<=~led0;cnt_led0<=0; end
if(cnt_led1==999) begin led1<=~led1;cnt_led1<=0; end
end
end
以上代码应该可以实现led1闪烁是led0频率的十分之一,只需调整一下CLK的频率即可实现人眼可分辨的频闪,led1是CLK频率的2000分频,led0是CLK的200分频
/ 信号定义与说明:
CLK:为同步时钟;
EN:使能信号,为1的话,则控制器开始工作;
LAMPA:控制A方向四盏灯的亮灭;其中,LAMPA0~LAMPA3,分别控制A方向的左拐灯、绿灯、黄灯和红灯;
LAMPB:控制B 方向四盏灯的亮灭;其中,LAMPB0 ~ LAMPB3,分别控制B方向的
左拐灯、绿灯、黄灯和红灯;
ACOUNT: 用于A方向灯的时间显示,8位,可驱动两个数码管;
BCOUNT: 用于B方向灯的时间显示,8位,可驱动两个数码管。
module traffic(CLK,EN,LAMPA,LAMPB,ACOUNT,BCOUNT);
output[7:0] ACOUNT,BCOUNT;
output[3:0] LAMPA,LAMPB;
input CLK,EN;
reg[7:0] numa,numb;
reg tempa,tempb;
reg[2:0] counta,countb;
reg[7:0] ared,ayellow,agreen,aleft,bred,byellow,bgreen,bleft;
reg[3:0] LAMPA,LAMPB;
always @(EN)
if(!EN)
begin //设置各种灯的计数器的预置数
ared <=8'd55; //55 秒
ayellow <=8'd5; //5 秒
agreen <=8'd40; //40 秒
aleft <=8'd15; //15 秒
bred <=8'd65; //65 秒
byellow <=8'd5; //5 秒
bleft <=8'd15; //15 秒
bgreen <=8'd30; //30 秒
end
assign ACOUNT=numa;
assign BCOUNT=numb;
always @(posedge CLK) //该进程控制A 方向的四种灯
begin
if(EN)
begin
if(!tempa) //tempa=0进入A方向状态改变模式;tempa=1,进入A方向在当前状态下的倒计时模式
begin
tempa<=1;
case(counta) //控制亮灯的顺序 //状态机方式控制A方向的4盏灯,counta表示当前A方向的状态 ;
LAMPA[的4位由高到低,分别控制A方向的红灯、黄灯、绿灯、左转灯,某一位为“1”,则该位控制的灯点亮;
numa 表示某盏灯亮的时间,在计数器的预置数中可以修改该值
0: begin numa<=agreen; LAMPA<=2; counta<=1; end //count=0 绿灯亮(LAMPA[1]=1),点亮40秒(agreen <=8'd40),40秒后转到下一状态,绿灯灭,黄灯亮(counta<=1)
1: begin numa<=ayellow; LAMPA<=4; counta<=2; end // count=1 黄灯亮(LAMPA[2]=1),点亮5秒(ayellow <=8'd5),5秒后转到下一状态,黄灯灭,左转灯亮(counta<=2)
2: begin numa<=aleft; LAMPA<=1; counta<=3; end // count=2 左转灯亮(LAMPA[0]=1),点亮15秒(aleft <=8'd15),15秒后转到下一状态,左转灯灭,黄灯亮(counta<=3)
3: begin numa<=ayellow; LAMPA<=4; counta<=4; end // count=3 黄灯亮(LAMPA[2]=1),点亮5秒(ayellow <=8'd5),5秒后转到下一状态,黄灯灭,红灯亮(counta<=4)
4: begin numa<=ared; LAMPA<=8; counta<=0; end // count=4 红灯亮(LAMPA[3]=1),点亮55秒(ared <=8'd55),55秒后转到下一状态,红灯灭,绿灯亮(counta<=0)
default: LAMPA<=8;
endcase
end
else begin //倒计时 //根据当前状态,某盏灯应该点亮的时间来倒计时
if(numa>1) //判断倒计时是否结束,当前状态倒计时结束后 把tempa置0,下1秒,系统进入状态改变模式,切换到下一状态
if(numa[3:0]==0) //倒计时显示的个位为0,十位要退位
begin
numa[3:0]<=4'b1001;
numa[7:4]<=numa[7:4]-1;
end
else numa[3:0]<=numa[3:0]-1; //倒计时显示的个位不为0,十位保持,个位减1
if (numa==2) tempa<=0; //tempa置0后,下1秒,状态才能改变,所以要提前1秒,置tempa为0
end
end
else begin
LAMPA<=4'b1000;
counta<=0; tempa<=0;
end
end
always @(posedge CLK) //该进程控制B 方向的四种灯
begin
if (EN)
begin
if(!tempb)
begin
tempb<=1;
case (countb) //控制亮灯的顺序
0: begin numb<=bred; LAMPB<=8; countb<=1; end
1: begin numb<=bgreen; LAMPB<=2; countb<=2; end
2: begin numb<=byellow; LAMPB<=4; countb<=3; end
3: begin numb<=bleft; LAMPB<=1; countb<=4; end
4: begin numb<=byellow; LAMPB<=4; countb<=0; end
default: LAMPB<=8;
endcase
end
else
begin //倒计时
if(numb>1)
if(!numb[3:0]) begin
numb[3:0]<=9;
numb[7:4]<=numb[7:4]-1;
end
else numb[3:0]<=numb[3:0]-1;
if(numb==2) tempb<=0;
end
end
else begin
LAMPB<=4'b1000;
tempb<=0; countb<=0;
end
end
endmodule
B方向类似A方向
整个系统:
A方向 绿灯(1s-40s) 黄灯(41s-45s) 左转(46s-60s) 黄灯(61s-65s) 红灯(66s-120s) 绿灯(121s-160s) 以后循环
B方向 红灯(1s-65s) 绿灯(66s-95s) 黄灯(96s-100s) 左转(101s-115s) 黄灯(116s-120s) 红灯(121s-185s) 以后循环
一般的FPGA里面有多个PLL, DLL模块, 用于产生高质量时钟信号,供特定单元使用
基本的备频原理是由模拟电路提取低频的高次谐波, 再整形输出 高次谐波衰减厉害,备频效率都不高1Hz到4kHz是不可能一次完成的 建议买个24MHz晶振挂在适当的时钟脚, 然后利用PLL分频
以上就是关于用verilog语言编写去抖按键全部的内容,包括:用verilog语言编写去抖按键、verilog用什么软件编写vcs、Verilog程序 流水灯等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)