前言

  • 之前的文章《如何学习verilog,如何快速入门?》中提到了verilog学习,推荐了一个可以练习的网站:hdlbits网站,那自己也玩玩这个网站。

  • 这篇文章,是接着《verilog练习:hdlbits网站上的做题笔记(6)》写的!

3.3 Building Larger Circuits

3.3.1 Counter with period 1000(Exams/review2015 count1k)

module top_module (input clk,input reset,output [9:0] q);always@(posedge clk)if(reset)q<=0;else if(q >='d999)q <= 'd0;elseq <= q+'d1;endmodule

3.3.2 4-bit shift register and down counter(Exams/review2015 shiftcount)

module top_module (input clk,input shift_ena,input count_ena,input data,output [3:0] q);always@(posedge clk)if(shift_ena)q<={q[2:0],data};else if(count_ena)q<=q-1'b1;elseq<=q;endmodule


3.3.3 FSM: Sequence 1101 recognizer(Exams/review2015 fsmseq)

module top_module (input clk,input reset,      // Synchronous resetinput data,output start_shifting);parameter S0=0,S1=1,S2=2,S3=3,S4=4;reg [2:0]state,next;always@(posedge clk)if(reset)state <= S0;elsestate <= next;always@(*)case(state)S0:next=data?S1:S0;S1:next=data?S2:S0;S2:next=data?S2:S3;S3:next=data?S4:S0;S4:next=S4;default:next=S0;endcasealways@(posedge clk)if(reset)start_shifting <= 0;else if(next==S4) //注意此处的状态是next;start_shifting <= 1;endmodule

3.3.4 FSM: Enable shift register(Exams/review2015 fsmshift)

//方法1,状态机思想
module top_module (input clk,input reset,      // Synchronous resetoutput shift_ena);parameter S0=0,S1=1,S2=2,S3=3,S4=4;reg [2:0]state,next;always@(posedge clk)if(reset)state <= S0;elsestate <= next;always@(*)case(state)S0:next=S1;S1:next=S2;S2:next=S3;S3:next=S4;S4:next=S4;default:next=S0;endcaseassign shift_ena=(state==S0|state==S1|state==S2|state==S3);
endmodule
//第二种做法,计数器
module top_module (input clk,input reset,      // Synchronous resetoutput shift_ena);reg [9:0] cnt_4;//cnt_4(4次计数器)always@(posedge clk)if(reset)cnt_4 <= 'd0;elsecnt_4 <= cnt_4 + 1'b1;assign shift_ena = cnt_4 < 'd4;endmodule
//第三种做法:强烈推荐这种,理解计数器什么时候加,什么时候结束加!(我记得明德扬之前讲,经常是这种思路)
module top_module (input clk,input reset,      // Synchronous resetoutput shift_ena);reg [9:0] cnt_4;//cnt_4(4次计数器)wire cnt_end;always@(posedge clk)if(reset)cnt_4 <= 'd0;else if(shift_ena)cnt_4 <= cnt_4 + 1'b1;elsecnt_4 <= 'd0;assign cnt_end = shift_ena && (cnt_4 == 'd3);always@(posedge clk)if(reset)shift_ena <= 1'b1;else if(cnt_end)shift_ena <= 1'b0;endmodule

3.3.5 FSM: The complete FSM(Exams/review2015 fsm)

  • 此处后面三个题是一个状态机,可以直接看后面两个,希望简单一点
module top_module (input clk,input reset,      // Synchronous resetinput data,output shift_ena,output counting,input done_counting,output done,input ack );parameter S0=0,S1=1,S2=2,S3=3;//序列检测1101的状态parameter S4=4,S5=5,S6=6,S7=7;//S4、S5、S6、S7保持shift_ena为1!parameter S8=8;//counting拉高,等待done_counting拉高,然后在下一状态S9拉低countingparameter S9=9;//等待ack拉高时,传出done信号,并进入S0状态!reg [3:0] state,next;always@(posedge clk)if(reset)state <=S0;    elsestate <= next;always@(*)case(state)S0:next=data?S1:S0;S1:next=data?S2:S0;S2:next=data?S2:S3;S3:next=data?S4:S0;S4:next=S5;S5:next=S6;S6:next=S7;S7:next=S8;S8:next=done_counting?S9:S8;S9:next=ack?S0:S9;default:next=S0;endcaseassign shift_ena=state==S4||state==S5||state==S6||state==S7;assign counting=state==S8;assign done=state==S9;
endmodule

3.3.6 The complete timer(Exams/review2015 fancytimer)

创建一个计时器:①当检测到特定模式(1101)时启动;②再移4位以确定延迟时间;③等待计数器完成计数,然后通知用户并等待用户确认计时器。

当接收到模式1101时,状态机必须在4个时钟周期内断言输出shift_ena。此后,状态机声明其计数输出以指示其正在等待计数器,并等待直到输入done_counting为高。

串行数据在数据输入引脚上可用。当接收到模式1101时,电路必须随后移入接下来的4位,即最高有效位在前。这4位确定定时器延迟的持续时间。将其称为delay [3:0]。

此后,状态机声明其计数输出以指示其正在计数。状态机必须精确计数(delay [3:0] + 1)* 1000个时钟周期。例如,delay = 0表示计数1000个周期,而delay = 5表示计数6000个周期。同时输出当前剩余时间。这应该等于1000个周期的延迟,然后等于1000个周期的delay-1,依此类推,直到1000个周期为0。当电路不计数时,count [3:0]输出无关紧要。

此时,电路必须断言完成,以通知用户计时器已超时,并等待直到输入ack为1才复位,以查找下一次出现的启动序列(1101)。电路应重置为开始搜索输入序列1101的状态。

这是预期输入和输出的示例。“ x”状态可能会使阅读有些混乱,它们表明FSM在该周期中不应关心该特定输入信号。例如,一旦读取了1101和delay [3:0],电路将不再查看数据输入,直到在完成所有其他操作后恢复搜索为止。在此示例中,电路的计数为2000个时钟周期,因为delay [3:0]值为4’b0001。最后几个周期以delay [3:0] = 4’b1110开始另一个计数,该计数将计数15000个周期。

module top_module (input clk,input reset,      // Synchronous resetinput data,output [3:0] count,//输出当前剩余时间output counting,output done,input ack );//与上一题目相比,shift_ena不需要输出!parameter S = 0, S1 = 1, S2 = 2, S3 = 3, B0 = 4, B1 = 5, B2 = 6, B3 = 7, COUNT = 8, WAIT = 9;reg[3:0] state, next_state;reg[3:0] delay;reg[13:0] cnt_delay;//根据这个保持counting为1wire done_counting;wire shift_ena;//与上一题目相比,shift_ena不需要输出!//状态机第一部分always@(posedge clk)beginif(reset)state <= S;elsestate <= next_state;end//状态机的第二部分,状态机和上一题目的一致!always@(*)begincase(state)S:next_state=data?S1:S;S1:next_state=data?S2:S;S2:next_state=data?S2:S3;S3: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;endcaseend//shift_ena和上一题目的一致,就是不需要输出//shift_ena拉高,表示已经检测到1101//后面就开始使用移位寄存器采取count数据,assign shift_ena = (state == B0 || state == B1 || state == B2 || state == B3);//使用移位寄存器采取count数据,always@(posedge clk)beginif(reset)delay <= 0;else if(shift_ena)delay <= {delay[2:0], data};            end//使用计数器,控制counting状态always@(posedge clk)beginif(reset)cnt_delay <= 0;elsecase(state)COUNT:cnt_delay <= cnt_delay + 1;default:cnt_delay <= 0;endcaseend//好好理解此处的题意   assign done_counting = (cnt_delay == (delay + 1) * 1000 - 1);assign count = delay - cnt_delay / 1000;assign counting = state == COUNT;assign done = state == WAIT;endmodule

3.3.7 FSM: One-hot logic equations(Exams/review2015 fsmonehot)

  • 连续三个题目就是这个状态机!

Derive next-state logic equations and output logic equations by inspection assuming the following one-hot encoding is used: (S, S1, S11, S110, B0, B1, B2, B3, Count, Wait) = (10’b0000000001, 10’b0000000010, 10’b0000000100, … , 10’b1000000000)

Derive state transition and output logic equations by inspection assuming a one-hot encoding. Implement only the state transition logic and output logic (the combinational logic portion) for this state machine. (The testbench will test with non-one hot inputs to make sure you’re not trying to do something more complicated).

  • 作者的独热码思维很独特!
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 = ...;// assign S_next = ...;// etc.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

verilog练习:hdlbits网站上的做题笔记(7)!强烈推荐!相关推荐

  1. verilog练习:hdlbits网站上的做题笔记(6)

    前言 之前的文章<如何学习verilog,如何快速入门?>中提到了verilog学习,推荐了一个可以练习的网站:hdlbits网站,那自己也玩玩这个网站. 这篇文章,是接着<veri ...

  2. verilog练习:hdlbits网站上的做题笔记(5)

    前言 之前的文章<如何学习verilog,如何快速入门?>中提到了verilog学习,推荐了一个可以练习的网站:hdlbits网站,那自己也玩玩这个网站. 这篇文章,是接着<veri ...

  3. verilog练习:hdlbits网站上的做题笔记(8)

    前言 之前的文章<如何学习verilog,如何快速入门?>中提到了verilog学习,推荐了一个可以练习的网站:hdlbits网站,那自己也玩玩这个网站. 这篇文章,是接着<veri ...

  4. Verilog 语法练习:HDL Bits做题笔记(3.2 Circuits Sequential Logic )

    目录 1.Lateches and Flip-Flops 1.1.D flip-flop 1.2.D flip-flops 1.3. DFF with reset 1.4.DFF with reset ...

  5. C语言程序设计做题笔记之C语言基础知识(下)

    C 语言是一种功能强大.简洁的计算机语言,通过它可以编写程序,指挥计算机完成指定的任务.我们可以利用C语言创建程序(即一组指令),并让计算机依指令行 事.并且C是相当灵活的,用于执行计算机程序能完成的 ...

  6. 关于数据库设计的做题笔记——选择题+填空题+大题

    ✅ 一点整理后的做题笔记- 文章目录 一.选择题和填空题 二.大题 三.写后感 ● 我们用的教材: 一.选择题和填空题 逻辑设计阶段的任务包括设计视图,形成数据库的外模式.( ) A. 对 B. 错 ...

  7. buuctf-MISC篇做题笔记(2)

    buuctf-MISC篇做题笔记(2) 第七题:基础破解 先看题目提示,可能也要暴力破解 打开后是RAR文件,需要密码 我是用RARpassword暴力破解,且根据题意已知是四位纯数字密码,设置破解的 ...

  8. 攻防世界ctf题目easyupload做题笔记。

    刚刷完upload-labs靶场,做做ctf题目,发现自己掌握的知识并不牢固.做了半天没有解出来,最后还是看别人的题解做出来的.写下做题过程,也就是wp吧.为了方便以后复习巩固. 本题的主要考点为利用 ...

  9. codetop做题笔记

    ##ACM模式 头文件: #include<bits/stdc++.h> #include<iostream> using namespace std; ##206. 反转链表 ...

最新文章

  1. 计算机学win7画图,Win7系统自带画图工具如何打开?win7打开画图工具教程
  2. VBA经典常用语句400句
  3. vb.net2019-多线程并行计算(1)
  4. boost::sort模块实现测试并行稳定排序
  5. 9. 回文数 golang 整数处理
  6. 计算机电路基础答案,计算机电路基础模拟试卷答案(B)
  7. php 应用程序错误,系统化PHP中的Web应用程序的错误代码?
  8. html5的一天,HTML5微电影制作 - 小猫一天的生活
  9. 终于给cs来了一次小整容
  10. 获取微信公众平台的access_token
  11. 惠普win7驱动_hp打印机驱动如何安装 hp打印机驱动安装方法【步骤详解】
  12. java种语言包在线翻译_Java 实现在线翻译功能 调用微软Bing API
  13. 最新WIN10系统封装教程2019系列(一)——定制母盘
  14. RF修改服务器设置,3-RF服务端程序安装手册V1.0(7页)-原创力文档
  15. 强化学习的A3C算法应用(训练Atari游戏)
  16. 查询中国天气网api需要用到的城市代码
  17. 自学计算机基础知识需要什么书,学习计算机基础知识,我强烈推荐这三本书!...
  18. linux 下 packet_mmap 前篇 (抓包实现)
  19. Jmeter的Html报告汉化及解析
  20. HTML吸引人眼球的网页,优秀网页设计:35个吸引眼球的精美作品集网站

热门文章

  1. Received status code 502 from server: Bad Gateway
  2. HDU - 5643 King's Game (约瑟夫环变式)
  3. 期货接盘(期货接盘什么意思)
  4. vlookup匹配不出,原因之一:含有“~”这个符号
  5. 【Python】星号与双星号
  6. 互联网公司招聘,你需要注意这四点
  7. 攒机需要注意的8条技巧 转太平洋网
  8. [xiaoyi和你飞]博弈基础 ——[AB]
  9. 继电保护matlab程序,自适应微机继电保护的matlab仿真实现 程序与算法
  10. 潘多拉路由器搭建php,openwrt PandoraBox(潘多拉)如何安装使用SQM QoS