FPGA——zhixin培训 Day_03——任意奇偶分频+自动售货机
A、任意奇偶分频
- 设计背景:
上一篇已讲分频,但其为偶数分频,占空比只为1:1;有时候需要奇数分频,本文所介绍的就是任意奇偶分频。
二、设计需求:
利用verilog语言编写代码使其可任意分频。
如奇数分频:实现5分频;高电平占用3个时钟周期;低电平占用两个时钟周期。
- 系统架构图:
- 思路与方案:
-
四、代码:
0 module divide(clk,rst_n,clk_out);
1
2 input clk; //50MHz
3 input rst_n; //低电平有效
4
5 output reg clk_out; //输出的时钟:5分频
6
7 parameter wide = 10;
8 parameter s0 = 1'b0;
9 parameter s1 = 1'b1;
10 parameter HW = 3;
11 parameter LW = 2;
12
13 reg[wide-1:0] cnt;
14 reg state;
15
16 always @(posedge clk or negedge rst_n)
17 begin
18 if(!rst_n)
19 begin
20 cnt <= 10'd0;
21 clk_out <= 0;
22 state <= s0;
23 end
24 else
25 begin
26 case(state)
27 s0:begin
28 if(cnt < HW-1)
29 begin
30 cnt <= cnt + 1'b1;
31 end
32 else
33 begin
34 cnt <= 10'b0;
35 clk_out <= 1'b0;
36 state <= s1;
37 end
38 end
39
40 s1:begin
41 if(cnt <LW-1)
42 begin
43 cnt <= cnt + 1'b1;
44 end
45 else
46 begin
47 cnt <= 10'b0;
48 clk_out <= 1'b1;
49 state <= s0;
50 end
51 end
52
53 default: state <= 0;
54 endcase
55 end
56
57 end
58
59 endmodule
四、仿真验证:
-
编写完仿真代码后进行仿真:
与设计相符
B、自动售货机(练习)
一、设计需求:
1、1种商品(饮料);
2、一种价格(3.5);
3、只能一次性输入金币面额(5角,1元);
4、输入金钱数大于3.5元,需要找零,并售出该商品。
要求:能够在仿真里面能看到所需设计功能。使用状态机实现。
二、架构图:
Clk
50MHz
Rst_n
复位
M05
五角
M10
一元
M
找零
Good
商品
Led
报警警示
-
- 代码:
-
0 module auto_good(clk,rst_n,M05,M10,M,good,led);
1
2 input clk; //50MHz
3 input rst_n;
4 input M05; //五角
5 input M10; //一元
6
7 output reg M; //找零
8 output reg good; //商品
9 output reg led; //报警,警示
10
11 reg [9:0] state;
12
13 parameter s00 = 10'b000_000_0001;
14 parameter s05 = 10'b000_000_0010;
15 parameter s10 = 10'b000_000_0100;
16 parameter s15 = 10'b000_000_1000;
17 parameter s20 = 10'b000_001_0000;
18 parameter s25 = 10'b000_010_0000;
19 parameter s30 = 10'b000_100_0000;
20 parameter s35 = 10'b001_000_0000;
21 parameter s40 = 10'b010_000_0000;
22
23 always @(posedge clk or negedge rst_n)
24 begin
25 if(!rst_n)
26 begin
27 state <= s00;
28 led <= 1;
29 good <= 0;
30 M <= 0;
31 end
32 else
33 begin
34 case(state)
35 s00:begin
36 if(M05)
37 begin
38 state <= s05;
39 end
40 else if(M10)
41 begin
42 state <= s10;
43 end
44 else
45 begin
46 state <= s00;
47 led <= 1;
48 good <= 0;
49 M <= 0;
50 end
51 end
52 s05:begin
53 if(M05)
54 begin
55 state <= s10;
56 end
57 else if(M10)
58 begin
59 state <= s15;
60 end
61 end
62 s10:begin
63 if(M05)
64 begin
65 state <= s15;
66 end
67 else if(M10)
68 begin
69 state <= s20;
70 end
71 end
72 s15:begin
73 if(M05)
74 begin
75 state <= s20;
76 end
77 else if(M10)
78 begin
79 state <= s25;
80 end
81 end
82 s20:begin
83 if(M05)
84 begin
85 state <= s25;
86 end
87 else if(M10)
88 begin
89 state <= s30;
90 end
91 end
92 s25:begin
93 if(M05)
94 begin
95 state <= s30;
96 end
97 else if(M10)
98 begin
99 state <= s35;
100 end
101 end
102 s30:begin
103 if(M05)
104 begin
105 state <= s35;
106 end
107 else if(M10)
108 begin
109 state <= s40;
110 end
111 end
112 s35:begin
113 if(M05 || M10)
114 begin
115 led <= 1'b0;
116 end
117 else
118 begin
119 good <= 1'b1;
120 M <= 1'b0;
121 state <= s00;
122 end
123 end
124 s40:begin
125 if(M05 || M10)
126 begin
127 led <= 1'b0;
128 end
129 else
130 begin
131 good <= 1'b1;
132 M <= 1'b1;
133 state <= s00;
134 end
135 end
136 default: state <= s00;
137 endcase
138 end
139 end
140
141 endmodule
-
五、仿真验证:
0 `timescale 1ns/1ns
1
2 module tb_auto_good();
3
4 reg clk; //50MHz
5 reg rst_n;
6 reg M05; //五角
7 reg M10; //一元
8
9 wire M; //找零
10 wire good; //商品
11 wire led; //报警,警示
12
13 auto_good auto_good_inst(
14 .clk(clk),
15 .rst_n(rst_n),
16 .M05(M05),
17 .M10(M10),
18 .M(M),
19 .good(good),
20 .led(led)
21 );
22
23 initial
24 begin
25 clk = 1;
26 rst_n = 0;
27 M10 = 0;
28 M05 = 0;
29 #100.1
30 rst_n = 1;
31 #100
32 M10 = 1;
33 #20
34 M10 = 1;
35 #20
36 M10 = 1;
37 #20
38 M05 = 0;
39 M10 = 1;
40 #20
41 M05 = 0;
42 M10 = 0;
43 #20
44 M05 = 0;
45 M10 = 0;
46 #1000
47 $stop;
48 end
49 always #10 clk = ~clk;
50
51 endmodule
例:投四元,输出商品一件,找零,满足条件
- 重要说明
-
注意仿真时候对M05和M10的赋值,应该在一个周期赋一次,并且最后一定要将赋的值清零;
仿真多试验各种情况。