首页 > 代码库 > 74HC595驱动设计

74HC595驱动设计

自己写的,通过测试,就是不知道符不符合规范,请各位斧正

设计思路,首先根据硬件电路,可知控制器需要有3个输出口进行驱动595,分别是移位时钟、串行数据输入、并行数据输出

另外控制器还需提供 时钟、复位端口和供使用者操作的并行数据输入端口。

 

根据芯片手册

image

使用12M的时钟频率;

三根控制线之间的时序如图所示

image

设计的verilog代码如下

module led_74595_driver
(
    //global clock
    input                clk,              //12MHz
    input                rst_n,            //global reset

    //74hc595 interface
    output reg        led595_dout,    //74hc595 serial data input   
    output               led595_clk,        //74hc595 shift clock (rising edge)
    output               led595_latch,    //74hc595 latch clock (risign edge)

    //user interface
    input    [7:0]        led_data        //led data input   
);


//-------------------------------------------------
//74hc595 control

//-------------------------------------------------
//用于8位数据移位次数

reg [3:0] count;
always@(posedge clk or negedge rst_n)
begin
    if(!rst_n)
        begin
            count<=0;
        end
    else
        begin
            count<=count+1‘b1;
        end
end

wire iclk=~clk;

//为了有一定的setup time和hold time,将时钟取反
always@(posedge iclk or negedge rst_n)
begin
    if(!rst_n)
        begin
            led595_dout<=1‘b0;
        end
    else
        case(count)
            4‘d0:led595_dout<=led_data[7];
            4‘d1:led595_dout<=led_data[6];
            4‘d2:led595_dout<=led_data[5];
            4‘d3:led595_dout<=led_data[4];
            4‘d4:led595_dout<=led_data[3];
            4‘d5:led595_dout<=led_data[2];
            4‘d6:led595_dout<=led_data[1];
            4‘d7:led595_dout<=led_data[0];
        default:led595_dout<=1‘b0;
        endcase
end
assign     led595_latch=(count==4‘d9)?1‘b1:1‘b0;
assign     led595_clk=(count>0&&count<=4‘d8)?clk:1‘b0;


endmodule

74HC595驱动设计