当前位置:首页 > FPGA课程设计报告 - 图文
//系统输入
reg clk;//外部输入时钟 reg rst_n;//系统复位
reg key_rd;//读信号(低电平有效) //系统输出
wire scl;//iic的时钟线
wire [15:0] data_out;//输出数据 wire sda; //iic的数据线
iic iic(
.clk(clk), //外部输入时钟 .rst_n(rst_n), //系统复位
.key_rd(key_rd), //读信号(低电平有效) .scl(scl), //iic的时钟 .sda(sda), //iic的数据线 .data_out(data_out)//输出数据 );
initial begin clk = 1; rst_n = 0; key_rd = 1;
#1000.1 rst_n = 1; #10000
key_rd = 0;//读信号有效
#40000 key_rd = 1;//读写号释放 end
always #10 clk=~clk; //50M的时钟
endmodule
top.v文件代码
module top(
clk, //外部输入时钟 rst_n, //系统复位
key_in, //读信号(低电平有效) scl, //iic的数据线 sda, //iic的时钟线 sel, seg );
input clk; //外部输入时钟 input rst_n; //系统复位
19
input key_in;//读信号(低电平有效) //系统输出
output scl; //iic的时钟线 inout sda; //iic的数据线 output [2:0] sel; output [7:0] seg;
wire key_out;
wire [15:0] data_out;
key_filter key_filter( .clk (clk), .rst_n (rst_n),
.key_in (key_in), .key_out(key_out) );
iic iic(
.clk (clk), //外部输入时钟 .rst_n (rst_n), //系统复位
.key_rd (key_out), //读信号(低电平有效) .scl (scl), //iic的数据线 .sda (sda), //iic的时钟线 .data_out (data_out) //输出数据 ); led led(
.clk (clk), .rst_n (rst_n), .data_in (data_out),
.sel (sel), //位选
.seg (seg) //段选 都是低电平点亮 );
endmodule
top_tb.v文件代码
module top_tb;
reg clk; //外部输入时钟 reg rst_n; //系统复位
reg key_in; //读信号(低电平有效) wire scl; //iic的数据线 wire sda; //iic的时钟线
20
wire [2:0] sel; wire [7:0] seg;
initial begin clk = 1; rst_n = 0; key_in = 1;
#1000.1 rst_n = 1; #10000
key_in = 0; //读信号有效 #40000 key_in = 1;//读写号释放 end
always #10 clk=~clk; //50M的时钟
top top(
.clk (clk), //外部输入时钟 .rst_n (rst_n), //系统复位
.key_in (key_in), //读信号(低电平有效) .scl (scl), //iic的数据线 .sda (sda), //iic的时钟线 .sel (sel), .seg (seg) );
endmodule
key_filter.v文件代码
`timescale 1ns/1ps
module key_filter(clk, rst_n, key_in, key_out);
parameter MASK_TIME = 1_00; //20ms/20ns=10^6
input clk; input rst_n; input key_in;
output reg key_out;
localparam s0 = 1'b0; localparam s1 = 1'b1;
reg temp;
reg [31:0] count; reg state;
21
always @ (posedge clk, negedge rst_n) begin
if (!rst_n) begin
count <= 0; key_out <= 1; temp <= 1; state <= s0; end else
case (state)
s0 : if (key_in == temp) state <= s0; else
begin
temp <= key_in; state <= s1; end
s1 : if (key_in == temp)
if (count < MASK_TIME) begin
count <= count + 1; state <= s1; end else
begin
key_out <= temp; count <= 0; state <= s0; end else
begin
count <= 0; temp <= key_in; state <= s1; end endcase end
endmodule
led.v文件代码
22
共分享92篇相关文档