VL13 时钟分频(偶数)
描述
请使用D触发器设计一个同时输出2/4/8分频的50%占空比的时钟分频器
注意rst为低电平复位
信号示意图:
波形示意图:
输入描述:
输入信号 clk rst
类型 wire
输出描述:
输出信号 clk_out2 clk_out4 clk_out8
类型 wire
题意整理
对于偶数分频电路,在不考虑时钟同步时钟延迟的问题时,直接使用D触发器级联来实现
题解主体
级联D触发器,可以得到状态转换:
关键在于,上升沿才能触发翻转,但是一个周期只有一个上升沿,因此周期翻倍
clkin |
clkout2 |
clkout4 |
clkout8 |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
1 |
0 |
1 |
1 |
1 |
1 |
0 |
1 |
1 |
0 |
0 |
1 |
1 |
1 |
1 |
0 |
1 |
0 |
1 |
0 |
1 |
1 |
0 |
0 |
1 |
根据激励方程和输出方程以及思路整理,关键电路如下:
将电路转换成Verilog代码描述如下
//2 分频
reg clk_div2 ;
always @(posedge clk_in or negedge rst) begin
if (!rst) begin
clk_div2 <= 'b0 ;
end
else begin
clk_div2 <= ~clk_div2 ;
end
end
assign clk_out2 = clk_div2 ;
//4 分频
reg clk_div4 ;
always @(posedge clk_out2 or negedge rst) begin
if (!rst) begin
clk_div4 <= 'b0 ;
end
else begin
clk_div4 <= ~clk_div4 ;
end
end
assign clk_out4 = clk_div4 ;
//8 分频
reg clk_div8 ;
always @(posedge clk_out4 or negedge rst) begin
if (!rst) begin
clk_div8 <= 'b0 ;
end
else begin
clk_div8 <= ~clk_div8 ;
end
end
assign clk_out8 = clk_div8 ;
因此实现方式为如下的电路,综合得到:
`timescale 1ns/1ns
module even_div
(
input wire rst ,
input wire clk_in,
output wire clk_out2,
output wire clk_out4,
output wire clk_out8
);
//2 分频
reg clk_div2 ;
always @(posedge clk_in or negedge rst) begin
if (!rst) begin
clk_div2 <= 'b0 ;
end
else begin
clk_div2 <= ~clk_div2 ;
end
end
assign clk_out2 = clk_div2 ;
//4 分频
reg clk_div4 ;
always @(posedge clk_out2 or negedge rst) begin
if (!rst) begin
clk_div4 <= 'b0 ;
end
else begin
clk_div4 <= ~clk_div4 ;
end
end
assign clk_out4 = clk_div4 ;
//8 分频
reg clk_div8 ;
always @(posedge clk_out4 or negedge rst) begin
if (!rst) begin
clk_div8 <= 'b0 ;
end
else begin
clk_div8 <= ~clk_div8 ;
end
end
assign clk_out8 = clk_div8 ;
endmodule
VL14 自动贩售机1
描述
题目描述:
设计一个自动贩售机,输入货币有三种,为0.5/1/2元,饮料价格是1.5元,要求进行找零,找零只会支付0.5元。
ps:
投入的货币会自动经过边沿检测并输出一个在时钟上升沿到1,在下降沿到0的脉冲信号
注意rst为低电平复位
信号示意图:
d1 0.5元
d2 1元
d3 2元
out1 饮料
out2 零钱
波形示意图:
对应的激励源:
输入描述:
输入信号 clk rst d1 d2 d3
类型 wire
输出描述:
输出信号 out1 [1:0]out2
类型 reg
题解主体
1、确定题目要求
首先根据信号端口图:
考虑状态转移,需要考虑的是有三输入二输出,存在状态0 0.5 1 1.5 2 2.5 3 七个状态,
这样输出信号的特性应该为: out1饮料为一位,out2找零为2位(0 1 2 3个0.5元)
因此先做转移表格:(需要注意的是,0.5/1/2是不会同时给信号的)
现态 |
d1 |
d2 |
d3 |
||||
现态值 |
现态代号 |
次态值 |
次态代号 |
次态值 |
次态代号 |
次态值 |
次态代号 |
0 |
S0 |
0.5 |
S1 |
1 |
S2 |
2 O2=1 |
S4 |
0.5 |
S1 |
1 |
S2 |
1.5 O2=0 |
S3 |
2.5 O2=2 |
S5 |
1 |
S2 |
1.5 O2=0 |
S3 |
2 O2=1 |
S4 |
3 O2=3 |
S6 |
1.5 |
S3 |
||||||
2 |
S4 |
||||||
2.5 |
S5 |
||||||
3 |
S6 |
蓝色格子代表输出
注意没有写输入为0,对于输入为0非蓝色格子状态保持,对于蓝色格子,状态转移至S0
2、画出状态转移
3、按照状态转移写出三段式状态机