用verilog语言编写去抖按键

用verilog语言编写去抖按键,第1张

按键去抖 最经典的程序,你应该能看懂,自己试着改一下吧,这样才能进步啊

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程序 流水灯等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/10212418.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-06
下一篇 2023-05-06

发表评论

登录后才能评论

评论列表(0条)

保存