?74HC595,移位寄存器,串行輸入,8位并行輸出,一般用于數(shù)碼管電路以減少使用的IO口數(shù)量。
管腳介紹:
Q0~Q7 :八位并行輸出位
Q7'? ? ? ?:? 級聯(lián)位,若輸入位數(shù)大于8位,先進入的位會從此口連續(xù)輸出,用于多片之間的級聯(lián)
VCC GND 不多介紹
Ds? ? ? ? :? 串行數(shù)據(jù)輸入位
OE? ? ? ?: 輸出使能位,低有效,一般直接全程給低電平就行
SHcp? ?:? 移位寄存器時鐘輸入,后文詳述
STcp? ? :? 存儲寄存器時鐘輸入,同上
MR? ? ? : 主復(fù)位,低有效,一般直接接到VCC拉高
? ? ? ?上圖為74HC595內(nèi)部結(jié)構(gòu),一個8位的移位寄存器,一個8位的存儲寄存器,再有一個8位的并行輸出。
? ? ? 為講明Q7'的級聯(lián)作用,此處應(yīng)用場景選擇為:6位8段數(shù)碼管,驅(qū)動此數(shù)碼管共需要8位段選端和6位位選端,共14位串行數(shù)據(jù)輸入。
? ? ? ?Ds數(shù)據(jù)輸入端串行輸入時,在SHcp的上升沿將數(shù)據(jù)移入移位寄存器內(nèi),每個SHcp上升沿移入一位單bit數(shù)據(jù),最先輸入的一直向后移直到8個SHcp上升沿后,移位寄存器填滿,此時若數(shù)據(jù)輸入端還有數(shù)據(jù)輸入,下一個SHcp上升沿到來時,最先輸入的1bit數(shù)據(jù)就會從Q7'輸出(此處可理解為隊列,先進先出)。在STcp的上升沿,數(shù)據(jù)會從移位寄存器進入存儲寄存器中,當(dāng)OE低有效時,存儲寄存器中的值從Q0~Q7并行輸出。
?
? ? ? ?上述應(yīng)用場景下,將第一片74HC595的Q7‘串行輸出端接到第二片的數(shù)據(jù)輸入端Ds,實現(xiàn)級聯(lián)功能。經(jīng)過14個時鐘SHcp上升沿后,數(shù)據(jù)已經(jīng)全部移位進入移位寄存器,一次共輸入14位數(shù)據(jù),那么第一位輸入的串行數(shù)據(jù)會在第二片74HC595芯片的Q5輸出,此時給一個上升沿的STcp信號就可以將信號移入存儲寄存器,OE信號持續(xù)給低, 即可輸出。
上述過程中還存在一個問題,SHCP頻率給多少合適?它是有限制的
? ? ? ? 我實驗板子的電壓為3.3V,取圖中2V的亦可,采用50MHZ的四分頻12.5MHZ作為SHCP時鐘,計數(shù)SHCP時鐘上升沿,14個上升沿給出一個STCP的上升沿作為STCP時鐘,相當(dāng)于STCP時鐘是SHCP時鐘的14分頻。
主要難點就在于SHCP和STCP時鐘的獲得,其他的按步驟來即可。
代碼如下,需者自?。o態(tài)數(shù)碼管)文章來源:http://www.zghlxwxcb.cn/news/detail-402045.html
`timescale 1ns/1ns
module seg_static(
input sys_clk,
input sys_rst_n,
output reg [7:0]seg,
output reg [5:0]sel
);
parameter seg_0 = 8'hc0,
seg_1 = 8'hf9,
seg_2 = 8'ha4,
seg_3 = 8'hb0,
seg_4 = 8'h99,
seg_5 = 8'h92,
seg_6 = 8'h82,
seg_7 = 8'hf8,
seg_8 = 8'h80,
seg_9 = 8'h90,
seg_a = 8'h88,
seg_b = 8'h83,
seg_c = 8'hc6,
seg_d = 8'ha1,
seg_e = 8'h86,
seg_f = 8'h8e;
parameter cnt_500ms = 25'd24_999_999 ;
//parameter cnt_500ms = 25'd32_999_999 ;
reg [24:0]cnt;
reg [3:0]num;
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n==1'b0)
cnt <= 25'd0;
else if(cnt==cnt_500ms)
cnt <= 25'd0;
else
cnt <= cnt + 1'b1;
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n==1'b0)
num <= 4'd0;
else if(num==4'd15 && cnt==cnt_500ms)
num <= 4'd0;
else if(cnt==cnt_500ms)
num <= num + 1'b1;
else
num <= num;
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n==1'b0)
seg <= 8'b1111_1111;
else
case(num)
0 : seg <= seg_0;
1 : seg <= seg_1;
2 : seg <= seg_2;
3 : seg <= seg_3;
4 : seg <= seg_4;
5 : seg <= seg_5;
6 : seg <= seg_6;
7 : seg <= seg_7;
8 : seg <= seg_8;
9 : seg <= seg_9;
10 : seg <= seg_a;
11 : seg <= seg_b;
12 : seg <= seg_c;
13 : seg <= seg_d;
14 : seg <= seg_e;
15 : seg <= seg_f;
default : seg <= 8'b1111_1111;
endcase
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n==1'b0)
sel <= 6'b0;
else
sel <= 6'b111_111;
endmodule
`timescale 1ns/1ns
module hc595_ctrl(
input sys_clk,
input sys_rst_n,
input wire [7:0]seg,
input wire [5:0]sel,
output reg shcp,
output reg stcp,
output reg ds,
output wire oe
);
reg [1:0]cnt_4;
reg [3:0]cnt_14;
wire [13:0]data;
assign data = {seg[0],seg[1],seg[2],seg[3],seg[4],seg[5],seg[6],seg[7],sel};
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n==1'b0)
cnt_4 <= 2'b0;
else if(cnt_4==2'd3)
cnt_4 <= 2'b0;
else
cnt_4 <= cnt_4 + 1'b1;
//sys_clk的四分頻當(dāng)作shcp時鐘
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n==1'b0)
shcp <= 1'b0;
else if(cnt_4 <= 2'd1)
shcp <= 1'b0;
else
shcp <= 1'b1;
//產(chǎn)生stcp時鐘
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n==1'b0)
cnt_14 <= 4'b0;
else if(cnt_14==4'd13 && cnt_4==2'd3)
cnt_14 <= 4'b0;
else if(cnt_4==2'd3)
cnt_14 <= cnt_14 + 1'b1;
else
cnt_14 <= cnt_14;
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n==1'b0)
stcp <= 1'b0;
else if(cnt_14==4'd13 && cnt_4==2'd3)
stcp <= 1'b1;
else
stcp <= 1'b0;
//產(chǎn)生ds信號
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n==1'b0)
ds <= 1'b0;
else if(cnt_4==2'd0)
ds <= data[cnt_14];
else
ds <= ds;
//產(chǎn)生oe信號
assign oe = ~sys_rst_n;
endmodule
`timescale 1ns/1ns
module smg_static(
input sys_clk,
input sys_rst_n,
output shcp,
output stcp,
output oe,
output ds
);
wire [7:0]seg;
wire [5:0]sel;
seg_static seg_static_inst(
.sys_clk(sys_clk),
.sys_rst_n(sys_rst_n),
.seg(seg),
.sel(sel)
);
hc595_ctrl hc595_ctrl_inst(
.sys_clk(sys_clk),
.sys_rst_n(sys_rst_n),
.seg(seg),
.sel(sel),
.shcp(shcp),
.stcp(stcp),
.ds(ds),
.oe(oe)
);
endmodule
動態(tài)數(shù)碼管隨緣更新文章來源地址http://www.zghlxwxcb.cn/news/detail-402045.html
到了這里,關(guān)于74HC595工作原理及FPGA實現(xiàn)數(shù)碼管驅(qū)動方法的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!