当前位置:网站首页>[Digital IC manual tearing code] Verilog automatic beverage machine | topic | principle | design | simulation
[Digital IC manual tearing code] Verilog automatic beverage machine | topic | principle | design | simulation
2022-07-06 21:37:00 【myhhhhhhhh】
Preface
This series aims to provide 100% Accurate numbers IC Design / Verify the title of the hand tearing code link , principle ,RTL Design ,Testbench And reference simulation waveform , The content of each article is checked by simulation . The quick navigation links are as follows :
Odd frequency division
Even frequency division
Semi integer batch
decimal / Fractional frequency division
Sequence detector
Mode three detector
Beverage machine
Asynchronous reset , Simultaneous release
Edge detection ( Rising edge , Falling edge , On both sides )
Full adder , Half adder
Gray code to binary
single bit Cross clock domain ( Two beats , Edge synchronization , Pulse synchronization )
Sync FIFO
Ought to say , The hand tearing code link is in the interview process Both important and simple A part of , Compared with software jobs , Numbers IC Hand tear code Fixed topic , Limited number , It belongs to a link that must be scored in the whole interview , Outside this series , I also recommend numbers IC Job seekers use “HdlBits” Code Training
Links are as follows
HDLBits — Verilog Practice
Problem of automatic beverage machine
1. Use Verilog Design circuit , Complete the following functions : Each bottle of drink 1.5 element , You can only put in one coin at a time , Available input 0.5 And 1.0 Two kinds of coins , With change function .
Principle of automatic beverage selling machine
First , It is obvious that , This hand tearing code should be used State machine To complete
The distinction between States , We can classify according to the amount remaining in the beverage machine , Because there are only two kinds of coins ,0.5/1 element , therefore The state can be divided as follows
- IDLE: Reset state , Indicates that the balance in the beverage machine is 0 element
- s1: The balance of the beverage machine is 0.5 element
- s2: The balance in the beverage machine is 1 element
- s3: The balance in the beverage machine is 1.5 element ( Export drinks , No change )
- s4: The balance in the beverage set is 2 element ( Export drinks , Give change )
So for the input and output of this state machine
Input : Two of you input Represents the coin put ,input[1] Pulling up means investing one yuan ,input[0] Higher means investment 0.5 element , By default, only one coin can be inserted at a time .
Output :drink Represents the output of drinks ,coin Represents the output of coins .
Veilog Design
module drink_machine( clk ,rst_n, money,drink,coin);
input clk;
input rst_n;
input [1:0] money;
output drink;
output coin;
parameter IDLE = 3'd0, s1=3'd1 ,s2=3'd2, s3=3'd3,s4=3'd4;
reg [2:0] state,nstate;
[email protected](posedge clk or negedge rst_n)
begin
if(!rst_n)
state<=IDLE;
else
state<=nstate;
end
[email protected](*)
begin
case(state)
IDLE:nstate = money[1] ? s2 : (money[0] ? s1 :IDLE);
s1: nstate = money[1] ? s3 : (money[0] ? s2 : s1);
s2: nstate = money[1] ? s4 : (money[0] ? s3 : s2);
s3: nstate = money[1] ? s2 : (money[0] ? s1 :IDLE);
s4: nstate = money[1] ? s2 : (money[0] ? s1 :IDLE);
default nstate = IDLE;
endcase
end
assign drink = (state == s3 || state == s4)? 1:0;
assign coin = (state == s4)? 1:0;
endmodule
Testbench Design
module drink_machine_tb();
reg clk;
reg rst_n;
reg [1:0] money;
wire drink;
wire coin;
drink_machine u1 (.clk(clk),.rst_n(rst_n),.money(money),.drink(drink),.coin(coin));
always #5 clk = !clk;
always #10.001 money = {
$random} % 3;
initial
begin
clk = 0;
rst_n = 1;
#10
rst_n = 0;
#20
rst_n = 1;
#1000
$stop;
end
endmodule
Simulation results
from 20ns To 80ns In the process of , Cast Five cents a piece , One by one ,drink Output is 1.
Then , Cast a piece , Throw another piece ,drink Output is 1 At the same time coin Also output as 1
Other state jumps also meet expectations , Design establishment .
边栏推荐
- Nodejs教程之Expressjs一篇文章快速入门
- Is this the feeling of being spoiled by bytes?
- [in depth learning] pytorch 1.12 was released, officially supporting Apple M1 chip GPU acceleration and repairing many bugs
- R language for text mining Part4 text classification
- 红杉中国,刚刚募资90亿美元
- It's not my boast. You haven't used this fairy idea plug-in!
- Tips for web development: skillfully use ThreadLocal to avoid layer by layer value transmission
- Start the embedded room: system startup with limited resources
- One line by line explanation of the source code of anchor free series network yolox (a total of ten articles, you can change the network at will after reading it, if you won't complain to me)
- Yyds dry inventory run kubeedge official example_ Counter demo counter
猜你喜欢
红杉中国,刚刚募资90亿美元
愛可可AI前沿推介(7.6)
JPEG2000 matlab source code implementation
数字化转型挂帅复产复工,线上线下全融合重建商业逻辑
麦趣尔砸了小众奶招牌
Chris LATTNER, the father of llvm: why should we rebuild AI infrastructure software
Z function (extended KMP)
[interpretation of the paper] machine learning technology for Cataract Classification / classification
20220211 failure - maximum amount of data supported by mongodb
Aike AI frontier promotion (7.6)
随机推荐
Yuan Xiaolin: safety is not only a standard, but also Volvo's unchanging belief and pursuit
Redistemplate common collection instructions opsforhash (IV)
Absolute primes (C language)
Nodejs教程之Expressjs一篇文章快速入门
jvm:大对象在老年代的分配
Thinking about agile development
20220211 failure - maximum amount of data supported by mongodb
guava: Multiset的使用
Replace Internet TV set-top box application through digital TV and broadband network
js中,字符串和数组互转(二)——数组转为字符串的方法
Comparison between multithreaded CAS and synchronized
JS according to the Chinese Alphabet (province) or according to the English alphabet - Za sort &az sort
1292_FreeROS中vTaskResume()以及xTaskResumeFromISR()的实现分析
ROS error: could not find a package configuration file provided by "move_base“
50 commonly used numpy function explanations, parameters and usage examples
string的底层实现
中国白酒的5场大战
JS learning notes OO create suspicious objects
ViT论文详解
js通过数组内容来获取数组下标