自己写的,通过测试,就是不知道符不符合规范,请各位斧正
设计思路,首先根据硬件电路,可知控制器需要有3个输出口进行驱动595,分别是移位时钟、串行数据输入、并行数据输出
另外控制器还需提供 时钟、复位端口和供使用者操作的并行数据输入端口。
根据芯片手册
使用12M的时钟频率;
三根控制线之间的时序如图所示
设计的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;
[email protected](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,将时钟取反
[email protected](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