按键去抖 最经典的程序,你应该能看懂,自己试着改一下吧,这样才能进步啊
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语言设计流水灯实验程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)