????????閑來無事打個(gè)嵌入式校賽玩玩,旨在用FPGA實(shí)現(xiàn)4位計(jì)數(shù)器,其功能包括上計(jì)、下計(jì)、置位、復(fù)位、暫停。
????????具體實(shí)現(xiàn)大概要先從JK觸發(fā)器的功能表入手:? ? ?
? ? ? ? JK觸發(fā)器在J、K兩個(gè)引腳接的輸入信號(hào)不同時(shí)可以分別代替SR鎖存器、T觸發(fā)器,這也是日常中SR鎖存器、T觸發(fā)器生產(chǎn)量小而JK觸發(fā)器生產(chǎn)量大。emmm具體功能表查一下百度啥的吧,反正在這個(gè)4位計(jì)數(shù)器中主要用了JK觸發(fā)器的“翻轉(zhuǎn)”以及“保持”功能吧。為了讓其通用性更強(qiáng),采用了異步復(fù)位、異步置位:在復(fù)位信號(hào)和置位信號(hào)的上升沿做處理讓輸出為0和1(采用下降沿或者電平觸發(fā)或者脈沖觸發(fā)都行的)
? ? ? ? 下面是JK觸發(fā)器的verilog實(shí)現(xiàn)及vivado生成的電路圖:
//JK觸發(fā)器一共7個(gè)引腳分別是輸入J、K,時(shí)鐘CLK,
// 輸入復(fù)位、置位RST、SET以及輸出Q和Q'
module JKtrigger(J, K, CLK, RST, SET, Q);
input wire J, K, CLK, RST, SET;
output reg Q;
//RESET SET單獨(dú)取上升沿做異步操作
always @(posedge CLK or posedge RST or posedge SET) begin
if (RST)
Q <= 1'b0;
else if (SET)
Q <= 1'b1;
else if (J && ~K)
Q <= 1'b1;
else if (~J && K)
Q <= 1'b0;
else if (J && K)
Q <= ~Q;
end
endmodule
? ? ? ? ?其實(shí)這個(gè)JK觸發(fā)器在寫的過程中就已經(jīng)把復(fù)位、置位信號(hào)的處理方式做好了,所以在頂層設(shè)計(jì)4位計(jì)數(shù)器的時(shí)候只要在例化傳對(duì)信號(hào)即可做復(fù)位、置位的操作。
? ? ? ? 由于計(jì)數(shù)器還應(yīng)有一個(gè)暫停功能,且顯然在這個(gè)計(jì)數(shù)器中信號(hào)的優(yōu)先級(jí)是復(fù)位>=置位>=暫停>上、下計(jì)選擇。由于JK觸發(fā)器在J、K引腳的輸入都為0時(shí)JK觸發(fā)器的輸出是保持不變,也即4位計(jì)數(shù)器的結(jié)果可以保持不變,而在J、K引腳的輸入都為1時(shí)JK觸發(fā)器的輸出是翻轉(zhuǎn),為此JK信號(hào)的邏輯是if pause -> J=K=0? ?else ->J=K=1? ?emmm具體細(xì)節(jié)就直接看代碼吧。
? ? ? ? 下面是例化4個(gè)JK觸發(fā)器的4位計(jì)數(shù)器verilog實(shí)現(xiàn)及vivado生成的電路圖:
//四位計(jì)數(shù)器一共6個(gè)引腳分別是時(shí)鐘CLK,輸入復(fù)位、置位RST、SET
// 計(jì)數(shù)選擇上計(jì)、下計(jì)count_choice,暫停信號(hào)pause
// 輸出信號(hào)count
module four_bit_counter(CLK, RST, SET, count_choice, pause, count);
input wire CLK, RST, SET, count_choice, pause;
output wire [3:0] count;
//中間值
wire [3:0] Q;
wire [3:0] J,K;
reg [3:0] Q_reg;
//控制JK觸發(fā)器的J和K輸入(pause信號(hào)進(jìn)來時(shí)為0讓JK觸發(fā)器保持)
assign J = pause ? {4{1'b0}} : {4{1'b1}};
assign K = pause ? {4{1'b0}} : {4{1'b1}};
//實(shí)例化4個(gè)JK觸發(fā)器
JKtrigger jk0(
.J(J[0]),
.K(K[0]),
.CLK(CLK),
.RST(RST),
.SET(SET),
.Q(Q[0])
);
JKtrigger jk1(
.J(J[1]),
.K(K[1]),
.CLK(count_choice?Q[0]:~Q[0]),
.RST(RST),
.SET(SET),
.Q(Q[1])
);
JKtrigger jk2(
.J(J[2]),
.K(K[2]),
.CLK(count_choice?Q[1]:~Q[1]),
.RST(RST),
.SET(SET),
.Q(Q[2])
);
JKtrigger jk3(
.J(J[3]),
.K(K[3]),
.CLK(count_choice?Q[2]:~Q[2]),
.RST(RST),
.SET(SET),
.Q(Q[3])
);
assign count = Q;
endmodule
整體來說還是比較簡(jiǎn)單的,后續(xù)會(huì)在當(dāng)前基礎(chǔ)上將比特流文件下到PYNQ-Z2的開發(fā)板上利用Arm核與上位機(jī)實(shí)現(xiàn)串口通信將4位計(jì)數(shù)器的結(jié)果實(shí)時(shí)回傳到上位機(jī)的串口界面中。文章來源:http://www.zghlxwxcb.cn/news/detail-772652.html
? ? ? ? 后面再見!?文章來源地址http://www.zghlxwxcb.cn/news/detail-772652.html
到了這里,關(guān)于例化4個(gè)JK觸發(fā)器實(shí)現(xiàn)4位計(jì)數(shù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!