结果:

module seq(ans,clk,reset,x,in);input clk,reset,x,in;output ans;reg [3:0] state;reg ans;parameter IDLE='d0;parameter  A='d1;parameter B='d2;parameter C='d3;parameter D ='d4;parameter E ='d5;always @(posedge clk)if(!reset)begin state <= IDLE;endelse casex(state)IDLE : if (in == 1)begin state <= A;endelsestate <= IDLE;A: if (x == 1)begin state <= B;endB: if (x == 1)begin state <= C;endelse state <= A;C: if (x == 1)begin state <= D;endelse state <= A;D: if (x == 1)begin state <= E;endelse state <=  A;E: if (x == 1)begin ans <= 1'b1;enddefault: state = IDLE;endcase endmodule 

Testbench:

当数据包含连续的4个以上的1时:

`timescale 1 ns / 1 ns
`include"C:/**********/seq.v"module seqdet_Top;reg clk,rst;reg [15:0] data;wire ans;wire x,in;reg ans_out;assign x = data[15];assign in = 1;always #10 clk = ~clk;always @(posedge clk)data = {data[14:0],data[15]};initial begin clk = 0;rst = 1;#50 rst = 0;#50 rst = 1;data = 'b1_00111_11011_00100;#1000 $stop;endseq m(.ans(ans),.clk(clk),.reset(rst),.x(x),.in(in));always @(posedge clk)case(ans)1: ans_out <= 1;default: ans_out <= 0;endcase endmodule 

仿真波形:

当数据不包含连续的4个以上的1时:

`timescale 1 ns / 1 ns
`include"C:/**********/seq.v"module seqdet_Top;reg clk,rst;reg [15:0] data;wire ans;wire x,in;reg ans_out;assign x = data[15];assign in = 1;always #10 clk = ~clk;always @(posedge clk)data = {data[14:0],data[15]};initial begin clk = 0;rst = 1;#50 rst = 0;#50 rst = 1;data = 'b1_10110_11011_00100;#1000 $stop;endseq m(.ans(ans),.clk(clk),.reset(rst),.x(x),.in(in));always @(posedge clk)case(ans)1: ans_out <= 1;default: ans_out <= 0;endcase endmodule 

仿真波形:

简化的EPROM的数据写入过程:

module seqrom(rst,clk ,address,data, sda,acknowledge,link_write,main_state,slave_state,slave_state_buffer,finish);input rst,clk;input [7:0] address, data;output sda, acknowledge;output        link_write;output [3:0]main_state;output [4:0]   slave_state;output  [7:0] slave_state_buffer;output             finish;reg          link_write;reg  [3:0]   main_state;reg  [4:0]   slave_state;reg [7:0] slave_state_buffer;reg            finish;reg          acknowledge;parameter idle = 0,address_write = 1,data_write = 2, stop_acknowledge = 3;parameter bit1 = 1,bit2 = 2,bit3 = 3,bit4 = 4,bit5 = 5,bit6 = 6,bit7 = 7,bit8 = 8;assign sda = link_write ? slave_state_buffer : 1'bz;//当开始写数据时,buffer里的数据就传给sda,没开始写数据时,sda就保持高阻态。always @(posedge clk)begin if(!rst)begin link_write = 0;main_state <= idle;slave_state <= idle;finish <= 0;acknowledge <= 0;slave_state_buffer <= 0;endelse case(main_state)idle: begin link_write <= 0;finish        <= 0;acknowledge<= 0;main_state <= address_write;slave_state_buffer <= address;slave_state<= idle;endaddress_write:beginif(finish == 0)begin Buffer_to_ROM;endelse beginfinish <=0;main_state <= data_write;slave_state_buffer <= data;slave_state <= idle;endenddata_write:beginif(finish == 0)begin Buffer_to_ROM;endelse begin link_write <= 0;finish <= 0;main_state <= stop_acknowledge;acknowledge<= 1;   endendstop_acknowledge:begin acknowledge <= 0;main_state <= idle;endendcase     endtask Buffer_to_ROM;begincase(slave_state)idle:   beginlink_write <= 1;slave_state<= bit1;endbit1:    beginlink_write <= 1;slave_state_buffer <= slave_state_buffer << 1;slave_state<= bit2;endbit2:    beginlink_write <= 1;slave_state_buffer <= slave_state_buffer << 1;slave_state<= bit3;endbit3:    beginlink_write <= 1;slave_state_buffer <= slave_state_buffer << 1;slave_state<= bit4;endbit4:    beginlink_write <= 1;slave_state_buffer <= slave_state_buffer << 1;slave_state<= bit5;endbit5:    beginlink_write <= 1;slave_state_buffer <= slave_state_buffer << 1;slave_state<= bit6;endbit6:    beginlink_write <= 1;slave_state_buffer <= slave_state_buffer << 1;slave_state<= bit7;endbit7:    beginlink_write <= 1;slave_state_buffer <= slave_state_buffer << 1;slave_state<= bit8;end bit8:   beginlink_write <= 0;finish <= 1;end    endcase endendtask
endmodule

Testbench:

`timescale 1ns/100ps
`define clk_cycle 50
module writingTop;reg reset,clk;reg[7:0] data,address;wire ack,sda;wire        link_write;wire [3:0]main_state;wire [4:0]   slave_state;wire    [7:0] slave_state_buffer;wire           finish;always #`clk_cycle clk = ~clk;initialbeginclk=0;reset=1;data=0;address=0;#(20*`clk_cycle) reset=0;#(20*`clk_cycle) reset=1;#(5000*`clk_cycle) $stop;endalways @(posedge ack) //接收到应答信号后,给出下一个处理对象。begindata=data+1;address=address+1;endseqrom seqrom(.rst(reset),.clk(clk),.data(data),.address(address),.acknowledge(ack),.sda(sda),.link_write(link_write),.main_state(main_state),.slave_state(slave_state),.slave_state_buffer(slave_state_buffer),.finish(finish));
endmodule

练习:

module traffic(clk,en,lampAL,lampAG,lampAY,lampAR,lampBL,lampBG,lampBY,lampBR,Acount,Bcount);input clk,en;output reg lampAL,lampAG,lampAY,lampAR,lampBL,lampBG,lampBY,lampBR;output reg [7:0] Acount,Bcount ;wire [7:0] Gcounter ,Ycounter,Lcounter,Rcounter;assign Rcounter = Ycounter + Ycounter + Gcounter + Lcounter;assign Gcounter = 8'd2;assign Ycounter = 8'd1;assign Lcounter = 8'd1;reg [3:0] state;reg [7:0] lamp_counter;reg [32:0] subcounter;    wire div_clk;always @(posedge clk)if (!en)subcounter <= 0;else subcounter <= subcounter + 1;always@(posedge subcounter[4] or negedge en)if (!en)begin{lampAL,lampAG,lampAY,lampAR} <= 4'b0010;{lampBL,lampBG,lampBY,lampBR} <= 4'b0010;lamp_counter <= 0;state  <= 4'b0;end else case (state)4'd0:   //待机状态,全黄begin{lampAL,lampAG,lampAY,lampAR} <= 4'b0010;{lampBL,lampBG,lampBY,lampBR} <= 4'b0010;state <= 4'd1;lamp_counter <= 0;end //--------------A--------------//4'd1:   //A的绿灯beginif(lamp_counter == Gcounter)beginstate <= 4'd2;lamp_counter <= 0;end else begin{lampAL,lampAG,lampAY,lampAR} <= 4'b0100;{lampBL,lampBG,lampBY,lampBR} <= 4'b0001;lamp_counter <= lamp_counter + 1'b1;state <= 4'd1;endend4'd2:  //A的黄灯begin if(lamp_counter == Ycounter)beginstate <= 4'd3;lamp_counter <= 0;endelse begin{lampAL,lampAG,lampAY,lampAR} <= 4'b0010;{lampBL,lampBG,lampBY,lampBR} <= 4'b0001;lamp_counter <= lamp_counter + 1'b1;state <= 4'd2;end end 4'd3:    //A的左转灯begin if(lamp_counter == Lcounter)beginstate <= 4'd4;lamp_counter <= 0;endelse begin{lampAL,lampAG,lampAY,lampAR} <= 4'b1000;{lampBL,lampBG,lampBY,lampBR} <= 4'b0001;lamp_counter <= lamp_counter + 1'b1;state <=4'd3;end end 4'd4:    //A的黄灯begin if(lamp_counter == Ycounter)beginstate <= 4'd5;lamp_counter <= 0;endelse begin{lampAL,lampAG,lampAY,lampAR} <= 4'b0010;{lampBL,lampBG,lampBY,lampBR} <= 4'b0001;lamp_counter <= lamp_counter + 1'b1;state <= 4'd4;end   end //--------------B--------------//       4'd5:  //B的绿灯begin if(lamp_counter == Gcounter)beginstate <= 4'd6;lamp_counter <= 0;end else begin{lampAL,lampAG,lampAY,lampAR} <= 4'b0001;{lampBL,lampBG,lampBY,lampBR} <= 4'b0100;lamp_counter <= lamp_counter + 1'b1;state <= 4'd5;end      end 4'd6:  //B的黄灯begin if(lamp_counter == Ycounter)beginstate <= 4'd7;lamp_counter <= 0;end else begin{lampAL,lampAG,lampAY,lampAR} <= 4'b0001;{lampBL,lampBG,lampBY,lampBR} <= 4'b0010;lamp_counter <= lamp_counter + 1'b1;state <= 4'd6;end end  4'd7:  //B的左转灯begin if(lamp_counter == Lcounter)beginstate <= 4'd8;lamp_counter <= 0;end else begin{lampAL,lampAG,lampAY,lampAR} <= 4'b0001;{lampBL,lampBG,lampBY,lampBR} <= 4'b1000;lamp_counter <= lamp_counter + 1'b1;state <= 4'd7;endend 4'd8:   //B的黄灯beginif(lamp_counter == Ycounter)beginstate <= 4'd1;lamp_counter <= 0;endelse begin{lampAL,lampAG,lampAY,lampAR} <= 4'b0001;{lampBL,lampBG,lampBY,lampBR} <= 4'b0010;lamp_counter <= lamp_counter + 1'b1;state <= 4'd8;end end endcase
endmodule 

testbench:

`timescale 1 ns/ 1 ps
module traffic_vlg_tst();
// constants
// general purpose registers
// test vector input registers
reg clk;
reg en;
// wires
wire [7:0]  Acount;
wire [7:0]  Bcount;
wire lampAG;
wire lampAL;
wire lampAR;
wire lampAY;
wire lampBG;
wire lampBL;
wire lampBR;
wire lampBY;// assign statements (if any)
traffic i1 (
// port map - connection between master ports and signals/registers   .Acount(Acount),.Bcount(Bcount),.clk(clk),.en(en),.lampAG(lampAG),.lampAL(lampAL),.lampAR(lampAR),.lampAY(lampAY),.lampBG(lampBG),.lampBL(lampBL),.lampBR(lampBR),.lampBY(lampBY)
);
initial
begin                                                  #100 clk = 0;#500 en = 1;#500 en = 0;#500 en = 1;#5_00_00000 $stop;
end
always   #10 clk <= ~clk;
endmodule

两种状态机:

moore型: 摩尔 型 状态 机 的 输出 只 与 当前 的 状态 有关。

always@( posedge clk, posedge rst) begin if( rst== 1'b1)state <= 2'b00; else begin case( state)2'b00: begin if( in== 1) state <= 2'b01;else state <= 2'b10; end 2'b01: begin if( in== 1) state <= 2' b11; else state <= 2' b10; end 2'b10: beginif( in== 1)state <= 2'b01else state <= 2'b11; end 2'b11: begin if( in== 1) state <= 2'b01; else state <= 2'b10; endendcase end end always@( posedge clk, posedge rst)begin if( rst== 1'b1) out <= 0;else if( state== 2'b11) out <= 1; else out <= 0; end

最终输出( out) 只在" state== 2' b11" 时 才会 有 输出, 与 输入( in) 没有 直接 的 关系。

Mealy型:输出 除了 与 当前 的 状态 有关 之外, 还 与 输入 有关。

always@( posedge clk, posedge rst) if( rst== 1' b1) begin state <= 2'b00; out <= 0;end else begin case( state) 2'b00: begin if( in== 1) begin state <= 2'b01; out <= 0; end else begin state <= 2'b10; out <= 0; end end 2'b01: begin if( in== 1) beginstate <= 2'b00; out <= 1;end else begin state <= 2'b10; out <= 0; end end 2'b10: begin if( in== 1) begin state <= 2'b01; out <= 0; end else begin state <= 2'b00; out <= 1; end end default: beginstate <= 2'b00; out <= 0; end endcase end

输出( out) 的 取值 不仅 与 当前 的 状态( state) 有关, 而且 与 输入( in) 也 直接 相关。

【FPGA】【Verilog】【基础模块】状态机相关推荐

  1. Verilog基础模块总结

    verilog基础模块 verilog基础模块包括数据类型,运算符,组合逻辑和时序逻辑四个部分.数据类型包括常量和变量,在常量中有整数,X和Z以及参数.X代表不定制,Z代表高阻值.下划线不具有任何意义 ...

  2. (82)Verilog HDL:状态机二段式

    (82)Verilog HDL:状态机二段式 1.1 目录 1)目录 2)FPGA简介 3)Verilog HDL简介 4)Verilog HDL:状态机二段式 5)结语 1.2 FPGA简介 FPG ...

  3. (81)Verilog HDL:状态机一段式

    (81)Verilog HDL:状态机一段式 1.1 目录 1)目录 2)FPGA简介 3)Verilog HDL简介 4)Verilog HDL:状态机一段式 5)结语 1.2 FPGA简介 FPG ...

  4. Verilog功能模块——取滑动平均值(使用寄存器组)

    我的另一篇博客:Verilog功能模块--取滑动平均值(使用FIFO) 两者用不同的方式实现相同的功能, 使用FIFO占用较少寄存器资源,适用于取值N较大的场合. 使用寄存器组不需要额外的IP,更简单 ...

  5. (61)Verilog HDL模块例化Verilog模块

    (61)Verilog HDL模块例化Verilog模块 1.1 目录 1)目录 2)FPGA简介 3)Verilog HDL简介 4)Verilog HDL模块例化Verilog模块 5)结语 1. ...

  6. (62)Verilog HDL模块例化system Verilog模块

    (62)Verilog HDL模块例化system Verilog模块 1.1 目录 1)目录 2)FPGA简介 3)Verilog HDL简介 4)Verilog HDL模块例化system Ver ...

  7. (63)Verilog HDL模块例化VHDL模块

    (63)Verilog HDL模块例化VHDL模块 1.1 目录 1)目录 2)FPGA简介 3)Verilog HDL简介 4)Verilog HDL模块例化VHDL模块 5)结语 1.2 FPGA ...

  8. (66)Verilog HDL模块参数化例化

    (66)Verilog HDL模块参数化例化 1.1 目录 1)目录 2)FPGA简介 3)Verilog HDL简介 4)Verilog HDL模块参数化例化 5)结语 1.2 FPGA简介 FPG ...

  9. (67)Verilog HDL模块条件例化

    (67)Verilog HDL模块条件例化 1.1 目录 1)目录 2)FPGA简介 3)Verilog HDL简介 4)Verilog HDL模块条件例化 5)结语 1.2 FPGA简介 FPGA( ...

  10. (02)Verilog HDL模块

    (02)Verilog HDL模块 1.1 目录 1)目录 2)FPGA简介 3)Verilog HDL简介 4)Verilog HDL模块 5)结语 1.2 FPGA简介 FPGA(Field Pr ...

最新文章

  1. Redhat 释放cached 内存
  2. Python之re模块 —— 正则表达式操作
  3. 2、leetcode278 第一个错误的版本**
  4. Git操作常用的命令都在这里了
  5. C++工作笔记-调试release版的dll
  6. access insert语句怎么写_擦亮自己的眼睛去看SQLServer之简单Insert
  7. 剑指offer——5.替换空格
  8. 第一天 echo test (()) [[]]
  9. debug常规的基本使用
  10. Silverlight3.0教程下载
  11. 防盗报警器c语言程序,基于AT89C2051设计的无线防盗报警器 附程序
  12. 腾讯+android+hotfix,发布到安卓平台报这个错误,xLua exception : xlua.access, no field __Hotfix0_Update...
  13. Opencv用hsv识别车牌(含源码)
  14. 网页嵌入Twitter的推文
  15. Linux 安装 VSCode 桌面快捷方式创建
  16. 03-04年度国家级精品课程一览
  17. 打造“财务中台”,浪潮云ERP助推企业业财融合、强化管控
  18. 关于使用深度学习进行三维点云几何压缩
  19. 无领导小组讨论面试真题解析(八)—— 是什么影响了利润
  20. H323测试环境搭建--源码安装H32Plus与 PTLib

热门文章

  1. 【Unity】如何制作精灵图呢?
  2. Mysql 硬盘性能测试
  3. 2019年用于机器学习的50个最佳公共数据集
  4. 利用指针反序输出字符串
  5. KEA128调试PIT时不断进入default_isr问题跟踪
  6. 防红跳转(QQ域名防报毒)网站的思路和代码
  7. word排版实例:如何将文档中的公式与文字对齐
  8. 100元起,罗永浩签名锤子手机开卖
  9. excel打开2个独立窗口_在716团队学习2个月了,我的感受:有成长,有震撼,为我打开了一扇门...
  10. AToken全面支持Cosmos生态Cosmos最新进展