FPGA Verilog 4 bit LED 計數器

前言:

計數器每秒 +1,所以LED會以二進制方式表示 0~15 的計數顯示

程式碼:


module led_test
(
   input            clk,           // 系統 50 Mhz 時鐘
   output [3:0]     led            // 板子上有 4 顆 LED,宣告為輸出
);  

    reg [31:0]      timer; // 宣告 32 bit 的整數變數    (計數 Clock, 每一秒清零)
    reg [3:0]       count; // 宣告  4 bit 的整數變數 (之後計數0~15,用於顯示)

    // 每個 Clock 都會觸發
    always@(posedge clk)
    begin         
         // 每個 Clock 將 timer 自動加一
         timer <= timer + 32'd1; 

         // timer 達到 49999999 ( 1秒 ) 時,將 timer 清零
         if(timer == 32'd49_999_999)
            begin
              timer <= 32'd0;
                  count <= count + 4'b1;
            end         
    end

     assign led = ~ count; // 將 count 變數與外部 4 顆 LED 電路連接起來  

endmodule

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基本的FPGA I2C驱动程序的Verilog代码,它可以通过I2C总线与其他设备进行通信。 ```verilog module i2c_master( input clk, input rst, output scl, inout sda ); // I2C状态机定义 parameter IDLE = 2'b00; // 空闲状态 parameter START = 2'b01; // 发送START信号 parameter ADDR = 2'b10; // 发送地址 parameter DATA = 2'b11; // 发送数据 reg [1:0] state; // 当前状态 reg [7:0] addr; // 设备地址 reg [7:0] data; // 待发送数据 reg wr; // 写标志位,0表示读,1表示写 reg ack; // ACK标志位,0表示ACK,1表示NACK reg [3:0] bit_cnt; // 位计数器 wire set_sda; // 控制SDA线的输出 wire read_sda; // 读取SDA线的输入 // I2C状态机 always @(posedge clk) begin if (rst) begin // 复位 state <= IDLE; bit_cnt <= 0; set_sda <= 1; ack <= 1; end else begin case (state) IDLE: begin // 空闲状态 if (addr != 0) begin // 如果设备地址不为0,开始传输 state <= START; bit_cnt <= 0; set_sda <= 0; end end START: begin // 发送START信号 if (bit_cnt == 0) begin // SCL线为低电平时发送START信号 set_sda <= 1; bit_cnt <= bit_cnt + 1; end else if (bit_cnt == 1) begin // SDA线为低电平时发生STOP信号 set_sda <= 0; bit_cnt <= 0; state <= ADDR; end end ADDR: begin // 发送设备地址 if (bit_cnt < 8) begin // 发送第0到第7位 set_sda <= addr[bit_cnt]; bit_cnt <= bit_cnt + 1; end else if (bit_cnt == 8) begin // 发送第9位(写控制位) set_sda <= wr; bit_cnt <= bit_cnt + 1; end else if (bit_cnt == 9) begin // 读ACK/NACK标志位 state <= DATA; bit_cnt <= 0; set_sda <= 1; ack <= read_sda; end end DATA: begin // 发送数据 if (bit_cnt < 8) begin // 发送第0到第7位 set_sda <= data[bit_cnt]; bit_cnt <= bit_cnt + 1; end else if (bit_cnt == 8) begin // 读ACK/NACK标志位 bit_cnt <= bit_cnt + 1; set_sda <= 1; ack <= read_sda; if (wr == 0) begin // 读数据 state <= START; // 读取数据后发送STOP信号 end else begin // 写数据 state <= DATA; // 继续发送数据 end end else if (bit_cnt == 9) begin // 发送STOP信号 state <= IDLE; bit_cnt <= 0; set_sda <= 0; ack <= 1; end end endcase end end // 控制SCL线 reg scl_reg; // SCL寄存器 wire scl_out; // SCL输出 always @(posedge clk) begin if (rst) begin scl_reg <= 1; end else begin if (state == START || state == DATA) begin // SCL线在START和DATA状态下翻转 scl_reg <= ~scl_reg; end end end assign scl_out = scl_reg; // 控制SDA线 assign sda = set_sda; // 设置SDA输出 assign read_sda = sda; // 读取SDA输入 endmodule ``` 该代码使用状态机来控制I2C总线的传输,可以通过修改addr和data来发送不同的地址和数据。需要将clk和rst连接到FPGA的时钟和复位信号上,scl和sda分别连接到I2C总线的SCL和SDA线上。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值