当前位置:网站首页>自动收售报机
自动收售报机
2022-06-29 17:12:00 【长水曰天】
设计一个自动售报机,报纸价钱为八角,纸币有1角,2角,5角,一元。该自动售报机不考虑投币为大额面值等特殊情况。
下图为自动售报机的状态转移图:

S0~S7为状态机的8个状态,下角标代表已投币的总和,八个状态分别代表没有投币、已投币1角、已投币2角、已投币3角、已投币4角、已投币5角、已投币6角、已投币7角。
M代表输入,M1表示投入1角硬币,M2表示投入2角硬币,M5表示投入5角硬币,M10表示投入一元。
data_out = 1表示给出报纸,data_out_return1 = 1表示找回1角硬币,data_out_return2 = 1表示找回2角硬币。
代码如下:
module auto_sellor(current_state, data_out, data_out_return1, data_out_return2, clk, rst_n, data_in);
parameter state_width = 3, data_in_width = 3;
output [state_width-1:0]current_state;
output data_out, data_out_return1, data_out_return2;
input [data_in_width-1:0]data_in;
input clk, rst_n;
reg [state_width-1:0]current_state, next_state;
reg data_out, data_out_return1, data_out_return2;
[email protected](current_state or data_in)
case(current_state)
3'b000:case(data_in)//0
3'b000:begin
next_state <= 3'b000;//0+0=0
data_out <= 1'b0;
data_out_return1 <= 1'b0;
data_out_return2 <= 1'b0;
end
3'b001:begin
next_state <= 3'b001;//0+1=1
data_out <= 1'b0;
data_out_return1 <= 1'b0;
data_out_return2 <= 1'b0;
end
3'b010:begin
next_state <= 3'b010;//0+2=2
data_out <= 1'b0;
data_out_return1 <= 1'b0;
data_out_return2 <= 1'b0;
end
3'b011:begin
next_state <= 3'b101;//0+5=5
data_out <= 1'b0;
data_out_return1 <= 1'b0;
data_out_return2 <= 1'b0;
end
3'b100:begin
next_state <= 3'b000;//0+10=10
data_out <= 1'b1;
data_out_return1 <= 1'b0;
data_out_return2 <= 1'b1;
end
endcase
3'b001:case(data_in)//1
3'b000:begin
next_state <= 3'b001;//1+0=0
data_out <= 1'b0;
data_out_return1 <= 1'b0;
data_out_return2 <= 1'b0;
end
3'b001:begin
next_state <= 3'b010;//1+1=2
data_out <= 1'b0;
data_out_return1 <= 1'b0;
data_out_return2 <= 1'b0;
end
3'b010:begin
next_state <= 3'b011;//1+2=3
data_out <= 1'b0;
data_out_return1 <= 1'b0;
data_out_return2 <= 1'b0;
end
3'b011:begin
next_state <= 3'b110;//1+5=6
data_out <= 1'b0;
data_out_return1 <= 1'b0;
data_out_return2 <= 1'b0;
end
endcase
3'b010:case(data_in)//2
3'b000:begin
next_state <= 3'b010;//2+0=2
data_out <= 1'b0;
data_out_return1 <= 1'b0;
data_out_return2 <= 1'b0;
end
3'b001:begin
next_state <= 3'b011;//2+1=3
data_out <= 1'b0;
data_out_return1 <= 1'b0;
data_out_return2 <= 1'b0;
end
3'b010:begin
next_state <= 3'b100;//2+2=4
data_out <= 1'b0;
data_out_return1 <= 1'b0;
data_out_return2 <= 1'b0;
end
3'b011:begin
next_state <= 3'b111;//2+5=7
data_out <= 1'b0;
data_out_return1 <= 1'b0;
data_out_return2 <= 1'b0;
end
endcase
3'b011:case(data_in)//3
3'b000:begin
next_state <= 3'b011;//3+0=3
data_out <= 1'b0;
data_out_return1 <= 1'b0;
data_out_return2 <= 1'b0;
end
3'b001:begin
next_state <= 3'b100;//3+1=4
data_out <= 1'b0;
data_out_return1 <= 1'b0;
data_out_return2 <= 1'b0;
end
3'b010:begin
next_state <= 3'b101;//3+2=5
data_out <= 1'b0;
data_out_return1 <= 1'b0;
data_out_return2 <= 1'b0;
end
3'b011:begin
next_state <= 3'b000;//3+5=8
data_out <= 1'b1;
data_out_return1 <= 1'b0;
data_out_return2 <= 1'b0;
end
endcase
3'b100:case(data_in)//4
3'b000:begin
next_state <= 3'b000;//4+0=4
data_out <= 1'b0;
data_out_return1 <= 1'b0;
data_out_return2 <= 1'b0;
end
3'b001:begin
next_state <= 3'b101;//4+1=5
data_out <= 1'b0;
data_out_return1 <= 1'b0;
data_out_return2 <= 1'b0;
end
3'b010:begin
next_state <= 3'b110;//4+2=6
data_out <= 1'b0;
data_out_return1 <= 1'b0;
data_out_return2 <= 1'b0;
end
3'b011:begin
next_state <= 3'b000;//4+5=9
data_out <= 1'b1;
data_out_return1 <= 1'b1;
data_out_return2 <= 1'b0;
end
endcase
3'b101:case(data_in)//5
3'b000:begin
next_state <= 3'b101;//5+0=5
data_out <= 1'b0;
data_out_return1 <= 1'b0;
data_out_return2 <= 1'b0;
end
3'b001:begin
next_state <= 3'b110;//5+1=6
data_out <= 1'b0;
data_out_return1 <= 1'b0;
data_out_return2 <= 1'b0;
end
3'b010:begin
next_state <= 3'b111;//5+2=7
data_out <= 1'b0;
data_out_return1 <= 1'b0;
data_out_return2 <= 1'b0;
end
3'b011:begin
next_state <= 3'b000;//5+5=10
data_out <= 1'b1;
data_out_return1 <= 1'b0;
data_out_return2 <= 1'b1;
end
endcase
3'b110:case(data_in)//6
3'b000:begin
next_state <= 3'b110;//6+0=6
data_out <= 1'b0;
data_out_return1 <= 1'b0;
data_out_return2 <= 1'b0;
end
3'b001:begin
next_state <= 3'b111;//6+1=7
data_out <= 1'b0;
data_out_return1 <= 1'b0;
data_out_return2 <= 1'b0;
end
3'b010:begin
next_state <= 3'b000;//6+2=8
data_out <= 1'b01
data_out_return1 <= 1'b0;
data_out_return2 <= 1'b0;
end
endcase
3'b111:case(data_in)//7
3'b000:begin
next_state <= 3'b111;//7+0=7
data_out <= 1'b0;
data_out_return1 <= 1'b0;
data_out_return2 <= 1'b0;
end
3'b001:begin
next_state <= 3'b000;//7+1=8
data_out <= 1'b1;
data_out_return1 <= 1'b0;
data_out_return2 <= 1'b0;
end
endcase
endcase
[email protected](posedge clk or rst_n)
if(!rst_n)
current_state <= 3'b000;
else
current_state <= next_state;
endmodule
上述代码中大的case语句里current_state分别对应S0到S7,即当前已投币的数目总和;而每个大case中的小case里的data_in则对应M0,M1,M2,M5,M10这几个投入硬币的数目。
边栏推荐
猜你喜欢

基于C语言开发实现的一个用户级线程库

MySQL foundation - multi table query

After eight years of testing and opening experience and interview with 28K company, hematemesis sorted out high-frequency interview questions and answers

curl: (56) Recv failure: Connection reset by peer

机器学习7-支持向量机

腾讯云发布自动化交付和运维产品Orbit,推动企业应用全面云原生化

「科普大佬说」AI与创造力

AI and creativity

Redis 原理 - Sorted Set (ZSet)

Word2vec vector model of Wiki Chinese corpus based on deep learning
随机推荐
Redis布隆过滤器和布谷鸟过滤器
[R language data science]: Text Mining (taking Trump's tweet data as an example)
Viewing splitchunks code segmentation from MPX resource construction optimization
Word2vec vector model of Wiki Chinese corpus based on deep learning
Pancakeswap Technology: development principle of gripper robot system
元代理模型可迁移对抗攻击
反射
6.25atcoderabc257e - addition and multiplication 2
固定资产管理系统让企业动态掌握资产情况
Calibration of binocular camera based on OpenCV
首批!腾讯云通过中国信通院政务协同平台解决方案能力评估
外部自动(PLC启动机器人)
英联邦国家有哪些
Leetcode 984. 不含 AAA 或 BBB 的字符串(网友思路)
C语言练习----指针字符串、链表
Redis bloom filter and cuckoo filter
Summary of problems during xampp Apache installation
Interrupt怎么用
Graduates are confused and middle-aged people are anxious. How can the career path become wider and wider?
Review of mathematical knowledge: curve integral of type I