日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

HDLBits答案(22)_基于有限状态机的计数器

發布時間:2023/12/19 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HDLBits答案(22)_基于有限状态机的计数器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

基于有限狀態機的計數器

HDLBits鏈接


前言

今天更新搭建更大的電路部分的習題,內容主要跟計數器和有限狀態機有關。


題庫

Counter with period 1000

構造一個0-999的計數器,同步高電平復位。

Solution

module top_module (input clk,input reset,output [9:0] q);always @(posedge clk) beginif(reset) beginq <= 10'd0;endelse if(q == 10'd999) beginq <= 10'd0;endelse beginq <= q + 1'b1;endendendmodule

4-bit shift register and down counter

構造一個4bit的移位寄存器,同時也可以做倒數的計數器使用。其中當shift_ena為1時數據data的高位先進到移位寄存器中;當count_ena為1時,計數器從寄存器中存儲的數開始逐時鐘遞減;shift_ena和count_ena沒有重要級先后順序,因為他們不會同時使能。

Solution:

module top_module (input clk,input shift_ena,input count_ena,input data,output [3:0] q);reg [3:0] q_temp;always @(posedge clk) beginif(shift_ena) beginq_temp <= {q_temp[2:0],data};endelse if(count_ena) beginif(q_temp == 4'd0) beginq_temp <= 4'd15;endelse beginq_temp <= q_temp - 1'b1;endendendassign q = q_temp;endmodule

我以為計數器到0時停止計數,本來按這個邏輯寫的,然后在線提交時出錯。作者的意思是0后面下一個狀態是15,這個大家做題時需注意。

FSM:Sequence 1101 recognizer

構造一個有限狀態機檢測data中的1101序列,如果檢測到該序列,則將輸出一直拉高直到同步復位信號為高。

Solution

module top_module (input clk,input reset, // Synchronous resetinput data,output start_shifting);parameter IDLE = 3'd0, S1 = 3'd1, S2 = 3'd2;parameter S3 = 3'd3, OUT = 3'd4;reg [2:0] current_state, next_state;always @(*) begincase(current_state)IDLE: next_state = data ? S1 : IDLE;S1: next_state = data ? S2 : IDLE;S2: next_state = data ? S2 : S3;S3: next_state = data ? OUT : IDLE;OUT: next_state = OUT;default: next_state = IDLE;endcaseendalways @(posedge clk) beginif(reset) begincurrent_state <= IDLE;endelse begincurrent_state <= next_state;endendassign start_shifting = current_state == OUT;endmodule

FSM:Enable shift register

當有限狀態機被復位時,將shift_ena拉高4個周期,之后保持為0直到再次復位。

Solution

module top_module (input clk,input reset, // Synchronous resetoutput shift_ena);parameter IDLE = 2'd0, ENA = 2'd1, STOP = 2'd2;reg [1:0] current_state, next_state;reg [2:0] counter;always @(*) begincase(current_state)IDLE: next_state = ENA;ENA: next_state = (counter == 3'd3) ? STOP : ENA;STOP: next_state = STOP;default: next_state = IDLE;endcaseendalways @(posedge clk) beginif(reset) begincurrent_state <= IDLE;endelse begincurrent_state <= next_state;endendalways @(posedge clk) beginif(reset) begincounter <= 3'd0;endelse begincase(next_state)IDLE: counter <= 3'd0;ENA: counter <= counter + 1'b1;STOP: counter <= 3'd0;default: counter <= 3'd0;endcaseend endassign shift_ena = current_state == ENA | current_state == IDLE;endmodule

需注意的是復位一直為高的時候輸出也一直為高電平;

FSM:The complete FSM

官方提供的狀態轉移圖

Solution

module top_module (input clk,input reset, // Synchronous resetinput data,output shift_ena,output counting,input done_counting,output done,input ack );parameter S = 4'd0, S1 = 4'd1, S11 = 4'd2, S110 = 4'd3;parameter B0 = 4'd4, B1 = 4'd5, B2 = 4'd6, B3 = 4'd7;parameter Count = 4'd8, Wait = 4'd9;reg [3:0] current_state, next_state;always @(*) begincase(current_state)S: next_state = data ? S1 : S;S1: next_state = data ? S11 : S;S11: next_state = data ? S11 : S110;S110: next_state = data ? B0 : S;B0: next_state = B1;B1: next_state = B2;B2: next_state = B3;B3: next_state = Count;Count: next_state = done_counting ? Wait : Count;Wait: next_state = ack ? S : Wait;default: next_state = S;endcaseendalways @(posedge clk) beginif(reset) begincurrent_state <= S;endelse begincurrent_state <= next_state;endendassign shift_ena = current_state == B0 | current_state == B1 | current_state == B2 | current_state == B3;assign counting = current_state == Count;assign done = current_state == Wait;endmodule

標準的FSM格式,沒啥說的,畫出狀態轉移表寫就行了。

The complete timer

該道狀態機就是前面幾道狀態機的組合,大家需注意的是計數那邊的部分;之前我將計數子的位寬設置不當,導致這題卡的挺久,希望大家做題分析時注意。

Solution

module top_module (input clk,input reset, // Synchronous resetinput data,output [3:0] count,output counting,output done,input ack );parameter IDLE = 4'd0, S1 = 4'd1, S2 = 4'd2, S3 = 4'd3;parameter C0 = 4'd4, C1 = 4'd5, C2 = 4'd6, C3 = 4'd7;parameter Count_1000 = 4'd8, Done = 4'd9;reg [3:0] current_state, next_state;reg [15:0] num;reg [3:0] delay;reg [3:0] already_count;wire count_state;assign count_state = (num == (delay + 1'b1)*1000) ? 1'b1 : 1'b0;always @(*) beginif(num <= 16'd1000) beginalready_count = 4'd0;endelse if(num > 16'd1000 && num <= 16'd2000) beginalready_count = 4'd1;endelse if(num > 16'd2000 && num <= 16'd3000) beginalready_count = 4'd2;endelse if(num > 16'd3000 && num <= 16'd4000) beginalready_count = 4'd3;endelse if(num > 16'd4000 && num <= 16'd5000) beginalready_count = 4'd4;endelse if(num > 16'd5000 && num <= 16'd6000) beginalready_count = 4'd5;endelse if(num > 16'd6000 && num <= 16'd7000) beginalready_count = 4'd6;endelse if(num > 16'd7000 && num <= 16'd8000) beginalready_count = 4'd7;endelse if(num > 16'd8000 && num <= 16'd9000) beginalready_count = 4'd8;endelse if(num > 16'd9000 && num <= 16'd10000) beginalready_count = 4'd9;endelse if(num > 16'd10000 && num <= 16'd11000) beginalready_count = 4'd10;endelse if(num > 16'd11000 && num <= 16'd12000) beginalready_count = 4'd11;endelse if(num > 16'd12000 && num <= 16'd13000) beginalready_count = 4'd12;endelse if(num > 16'd13000 && num <= 16'd14000) beginalready_count = 4'd13;endelse if(num > 16'd14000 && num <= 16'd15000) beginalready_count = 4'd14;endelse beginalready_count = 4'd15;endendalways @(posedge clk) beginif(reset) beginnum <= 16'd0;endelse if(next_state == Done) beginnum <= 16'd0;endelse if(next_state == Count_1000) beginnum <= num + 16'd1;endendalways @(*) begincase(current_state)IDLE: next_state = data ? S1 : IDLE;S1: next_state = data ? S2 : IDLE;S2: next_state = data ? S2 : S3;S3: next_state = data ? C0 : IDLE;C0:beginnext_state = C1;delay[3] = data;end C1:beginnext_state = C2; delay[2] = data;end C2:beginnext_state = C3; delay[1] = data;end C3:beginnext_state = Count_1000; delay[0] = data;end Count_1000: next_state = count_state ? Done : Count_1000;Done: next_state = ack ? IDLE : Done;default: next_state = IDLE;endcaseendalways @(posedge clk) beginif(reset) begincurrent_state <= IDLE;endelse begincurrent_state <= next_state;endendassign count = (current_state == Count_1000) ? (delay - already_count) : 4'd0;assign counting = (current_state == Count_1000);assign done = current_state == Done;endmodule

FSM:One-hot logic equations

用one-hot編碼的狀態寫出狀態轉移代碼。

Solution

module top_module(input d,input done_counting,input ack,input [9:0] state, // 10-bit one-hot current stateoutput B3_next,output S_next,output S1_next,output Count_next,output Wait_next,output done,output counting,output shift_ena ); //// You may use these parameters to access state bits using e.g., state[B2] instead of state[6].parameter S=0, S1=1, S11=2, S110=3, B0=4, B1=5, B2=6, B3=7, Count=8, Wait=9;assign B3_next = state[B2];assign S_next = ~d & state[S] | ~d & state[S1] | ~d & state[S110] | ack & state[Wait];assign S1_next = d & state[S];assign Count_next = state[B3] | ~done_counting & state[Count];assign Wait_next = done_counting & state[Count] | ~ack & state[Wait];assign done = state[Wait];assign counting = state[Count];assign shift_ena = state[B0] | state[B1] | state[B2] | state[B3];endmodule

結語

該小結就算更新結束了,下面剩的也不多了,爭取在開學前全部刷完。如有不對的還望大家指正。

總結

以上是生活随笔為你收集整理的HDLBits答案(22)_基于有限状态机的计数器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 久久99精品波多结衣一区 | 国产精品日韩欧美大师 | 1024手机在线观看 | av在线二区| www.成年人 | 麻豆黄色一级片 | 国产黄色片子 | 久久伊人影院 | 悠悠色影院 | 亚洲日本在线观看视频 | 操操操综合 | 欧美精品99久久 | 亚洲欧美在线视频 | 久久久久久毛片 | 久久久无码人妻精品一区 | 天天综合色网 | 五月婷婷在线播放 | 99精品国产99久久久久久97 | 图片区视频区小说区 | av专区在线 | 亚洲 自拍 另类 欧美 丝袜 | 温柔少妇的高潮呻吟 | 美丽姑娘免费观看在线观看 | 最新中文字幕av专区 | 台湾a级艳片潘金莲 | 国产欧美在线观看 | 一级黄色片视频 | av黄网站 | 精品视频久久久久久久 | 久久久久国产综合av天堂 | 亚欧成人精品一区二区 | 日本xxxx在线观看 | 精品在线视频免费观看 | 蜜桃av噜噜一区二区三区麻豆 | www.youjizz.com日本| 超碰666 | 激情xxx| 亚洲人体一区 | 特黄老太婆aa毛毛片 | 五月天六月婷 | 国产乱码精品一区二区三区亚洲人 | 日韩欧美成人一区二区 | 亚洲国产精品一区二区久久hs | 亚洲伊人天堂 | julia在线播放88mav | 日韩欧美性视频 | 美女搡bbb又爽又猛又黄www | 韩国主播青草200vip视频 | 欧美日韩免费在线视频 | 久青草影院 | 久久99伊人| 中国少妇无码专区 | 亚洲一级中文字幕 | 国产精品一区二区无码免费看片 | 视频1区| 人人妻人人澡人人爽久久av | 成人天堂av | 色大师av一区二区三区 | 精品一区免费观看 | 欧美另类xxxx| 插插插干干干 | 久久av高潮av | 久久老女人 | 欧美成人一区二免费视频软件 | 久久精品国产99国产精品 | 18禁一区二区 | 亚洲国产精品va在线看黑人 | 涩色网| 国产午夜精品一区二区三区欧美 | av高清一区| 欧美日韩亚洲国产一区 | 奇米网7777 | 国产精品国产三级国产专区52 | aaa影院 | 日韩视频一二三区 | 亚洲人成无码网站久久99热国产 | 美日韩一二三区 | 国产成人无遮挡在线视频 | 成人性生活免费看 | 视屏一区| 九色视频91 | 黄色小说在线观看视频 | 极度诱惑香港电影完整 | 国产人妖在线视频 | 丁香婷婷色 | 国产精品一区二区三区久久 | 91精品视频免费在线观看 | 激情插插插 | 久久精品av | chien国产乱露脸对白 | 亚洲欧美日韩图片 | 亚洲欧美一区二区三区四区 | 中文字幕亚洲高清 | 双性高h1v1| 国产黄色精品网站 | 国产经典久久 | 中文在线字幕免费观 | 怡红院毛片| 91av免费在线观看 |