FPGA的学习:状态机的实现(三)
生活随笔
收集整理的這篇文章主要介紹了
FPGA的学习:状态机的实现(三)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
用代碼實現fsm
`timescale 1ns/1ns module simple_fsm (input wire sys_clk , //系統時鐘50MHzinput wire sys_rst_n , //全局復位input wire pi_money , //投幣方式可以為:不投幣(0)、投1元(1)output reg po_cola //po_cola為1時出可樂,po_cola為0時不出可樂 ); //parameter define //只有三種狀態,使用獨熱碼 parameter IDLE = 3'b001; parameter ONE = 3'b010; parameter TWO = 3'b100;//reg define reg [2:0] state; //第一段狀態機,描述當前狀態state如何根據輸入跳轉到下一狀態 always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0)state <= IDLE; //任何情況下只要按復位就回到初始狀態else case(state)IDLE : if(pi_money == 1'b1)//判斷輸入情況state <= ONE;elsestate <= IDLE;ONE : if(pi_money == 1'b1)state <= TWO;elsestate <= ONE;TWO : if(pi_money == 1'b1)state <= IDLE;elsestate <= TWO;//如果狀態機跳轉到編碼的狀態之外也回到初始狀態default : state <= IDLE;endcase//第二段狀態機,描述當前狀態state和輸入pi_money如何影響po_cola輸出 always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0)po_cola <= 1'b0;else if((state == TWO) && (pi_money == 1'b1))po_cola <= 1'b1;elsepo_cola <= 1'b0;endmodule然后編寫仿真代碼
`timescale 1ns/1nsmodule tb_simple_fsm(); //reg define reg sys_clk; reg sys_rst_n; reg pi_money;//wire define wire po_cola; //初始化系統時鐘、全局復位 initial beginsys_clk = 1'b1;sys_rst_n <= 1'b0;#20sys_rst_n <= 1'b1; end//sys_clk:模擬系統時鐘,每10ns電平翻轉一次,周期為20ns,頻率為50MHz always #10 sys_clk = ~sys_clk;//pi_money:產生輸入隨機數,模擬投幣1元的情況 always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0)pi_money <= 1'b0;elsepi_money <= {$random} % 2; //取模求余數,產生非負隨機數0、1//將RTL模塊中的內部信號引入到Testbench模塊中進行觀察 wire [2:0] state = simple_fsm_inst.state;initial begin$timeformat(-9, 0, "ns", 6);$monitor("@time %t: pi_money=%b state=%b po_cola=%b", $time, pi_money, state, po_cola); end simple_fsm simple_fsm_inst(.sys_clk (sys_clk ), //input sys_clk.sys_rst_n (sys_rst_n ), //input sys_rst_n.pi_money (pi_money ), //input pi_money.po_cola (po_cola ) //output po_cola );endmodule總結
以上是生活随笔為你收集整理的FPGA的学习:状态机的实现(三)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Booth编码以及运算实例
- 下一篇: CPLD个人学习笔记