用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;

module voter7(pass, vote);

output pass;

input [6:0] vote;

reg [2:0] sum;

integer i;

reg pass;

always @(vote)

begin

sum=0;

for(i=0;i<=6;i=i+1)

if(vote[i])sum=sum+1;

if(sum[2])pass=1;

pass=1

else pass=0;

end

endmodule

module run_led(clk,rst,led); //module port

input clk;//system clock

input rst;//system reset

output [7:0] led; // 8bits led

reg [7:0] led;

reg [25:0] count;

always @ (posedge clk ) begin

if(rst || count[25]==1) begin

count<=26'b0;

end

else

count<=count+1;

end

always @ (posedge clk) begin

if(rst)

led<=8'b0000_0001;

else begin

if(count[25]==1) begin

led<=((led<<1)+1);

end

end

end

endmodule

这是我自己写的,实验正确符合楼主要求!嘿嘿。。。

这是一个 RAM的程序。

这里面用到了类似 数组 的概念。

reg[7:0] Memory [63:0]; 这个定义表示 64 个 8bits 数。

always @(posedge dataInterrupt)

begin

if(dataIn ==8'h30)

begin // 这个if 表示 输入数据为 8'h30 的时候,

memIndex<=0; // 地址为 0

Memory[0]<=8'hff; // 0地址存储的数据为 8'hff

end

else

begin

Memory[memIndex]<=dataIn; // 将输入数据写入对应的地址中

memIndex<=memIndex+1'b1; // 地址自增 1

if (memIndex == 63)

begin

memIndex<=63; // 写满了64个数据,就不动了,除非输入数据为 8'h30

end

end

end

assign dataOut = Memory[Address]; //这是读数据,将 address 地址对应的数据读出来。

verilog用ALTERA软件编写vcs。

如果只是仿真的话,可以使用modelsim;如果要对程序进行编译、综合、烧写且调试的话,可以使用altera公司的quartus ii和xilinx公司的ise软件。这几种软件我都用过,网上都可以下到相关的安装软件。verilog hdl是一种硬件描述语言,跟C语言有点像,比较容易上手。

verilog设计:

描述复杂的硬件电路,设计人员总是将复杂的功能划分为简单的功能,模块是提供每个简单功能的基本结构。设计人员可以采取“自顶向下”的思路,将复杂的功能模块划分为低层次的模块。这一步通常是由系统级的总设计师完成。

而低层次的模块则由下一级的设计人员完成。自顶向下的设计方式有利于系统级别层次划分和管理,并提高了效率、降低了成本。“自底向上”方式是“自顶向下”方式的逆过程。

使用Verilog描述硬件的基本设计单元是模块(module)。构建复杂的电子电路,主要是通过模块的相互连接调用来实现的。模块被包含在关键字module、endmodule之内。

module Timer_Design( 

input wire clk, //时钟信号输入端;F = 1Hz P = 1s

input wire res,    //复位信号,Low Active低有效

input wire [1:0] data,   //定时模式[长短]选择

output  reg x       

);

/功能描述

data = 2'b00 -> 无定时, 告警信号X一直为0

data = 2'b01 -> 5s定时, 告警信号X保持6s的高,但是5s就会输出一个

    告警,这个有一点冲突

data = 2'b10 -> 10s定时,每隔10s输出一个告警信号,告警信号保持6s

data = 2'b11 -> 15s定时,每隔15输出一个告警有效信号

/

//这里有一个不明确的地方,是否定时是一直在运行,如果一直在运行定时,那么第一个假设定时时间是5s

//5s到了之后告警信号拉高,此时定时清零继续运行,告警信号要保持6s的高,那么5s定时到的时候告警信

//号依旧是高,以此循环,5S定时的话X会一直保持高。

//另外一种情况是定时一直在运行,但是X持续高时间需要低于定时周期5s

//第三种可能是定时不一直运行,定时到5s之后,X输出6s的高,此时定时是停止的,6s之后重新开始定时

//但是这个定时周期的定义就有问题了

//所以考虑以上情况,我选择第二种,将X持续时间缩短到3s

reg [3:0] timer_cnt;

always @(posedge clk,negedge res) begin

if(!rss) begin

x <= 1'b0;

timer_cnt <= 4'd0;

end

else case(data)

2'b00 : begin

x <= 1'b0;

timer_cnt <= 4'd0;

end

2'b01 : begin //定时5s

if(timer_cnt <= 4'd1) begin

x <= x; //刚开始定时的时候不能将之拉高,所以这里用保持

timer_cnt <= timer_cnt + 1'b1;

end

else if(timer_cnt <= 4'd3) begin

timer_cnt <= timer_cnt + 1'b1;

x <= 1'b0;

end

else begin //timer_cnt = 4

timer_cnt  <= 4'd0;

x <= 1'b1;

end

end

2'b10 : begin //定时10

if(timer_cnt <= 4'd1) begin //x保持3s的高

x <= x;  //刚开始定时的时候不能将之拉高,所以这里用保持

timer_cnt <= timer_cnt + 1'b1;

end

else if(timer_cnt <= 4'd8) begin

timer_cnt <= timer_cnt + 1'b1;

x <= 1'b0;

end

else begin //timer_cnt = 9

timer_cnt  <= 4'd0;

x <= 1'b1;

end

end

2'b11 : begin //定时15

if(timer_cnt <= 4'd1) begin //x保持3s的高

x <= x;  //刚开始定时的时候不能将之拉高,所以这里用保持

timer_cnt <= timer_cnt + 1'b1;

end

else if(timer_cnt <= 4'd13) begin   //cnt = 2~(14-1)

timer_cnt <= timer_cnt + 1'b1;

x <= 1'b0;

end

else begin //timer_cnt = 14

timer_cnt  <= 4'd0;

x <= 1'b1;

end

end

            default :;

endcase

end

endmodule

有问题可以补充。。。

以上就是关于用verilog语言编写去抖按键全部的内容,包括:用verilog语言编写去抖按键、求Verilog hdl编写的七人表决器的程序、用Verilog HDL语言设计流水灯实验程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/zz/9725720.html

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

发表评论

登录后才能评论

评论列表(0条)

保存