tastynoob
Articles58
Tags18
Categories7
FPGA学习-8:简单的时序电路

FPGA学习-8:简单的时序电路

简单的时序电路

经过上一章的了解

组合电路的最大优势就是能直接根据输入进行输出

但其也有很多的缺点:占大量的电路资源,功耗较大,电路固定…

这一次我们来讲基本的时序电路,写一个简单的时序控制电路

再在此基础上将之前的组合电路乘法器改成时序电路


首先我们要来了解下安路FPGA的时钟信号

安路FPGA的外部24Mhz晶振信号由k14号引脚提供

使用 “IO Constraint” 引脚映射工具

将veilog模块的某一输入端口映射到k14引脚上即可得到24Mhz的时钟信号

先来设计个简单的 “可变分频器”

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
module Start(
input clk,
input button,
output[2:0] led
);


reg[31:0] pll,cnt;
reg[2:0] out;

assign led = ~out;

initial begin
pll = 32'd24000000;
cnt = 32'd0;
out = 3'b001;
end

always @(posedge clk )begin
if(cnt <= pll) begin
cnt = cnt + 32'd1;
end
else begin
cnt = 32'd0;
out = out << 1;
if(out == 3'd0)begin
out = 3'b001;
end

end
end

integer i=1;

always @(posedge button)begin
case(i)
1:begin
i=2;
pll=32'd12000000;
end
2:begin
i=3;
pll=32'd6000000;
end
3:begin
i=1;
pll=32'd24000000;
end

endcase

end

endmodule

引脚映射如下:

1.png

正常编译再烧录进tang perimer里,led就会交错闪烁

按下user按键,闪烁的频率就会发生改变

这最简单的分频器设计


接下来我们再尝试将上一节中的组合电路单周期乘法器改造

变成时序电路多周期乘法器

额,就不要说什么多此一举了

我们的目的是学习

代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
module Mul(
input clk, //时钟信号
input rst, //复位信号
output reg flag,//是否完成信号
input[7:0] Ai,
input[7:0] Bi,
output reg[15:0] result
);

reg[15:0] bi;

initial begin
bi = {8'd0,Bi};
flag = 0;
result= 0;
end

integer i=0;

always @(posedge clk or posedge rst) begin
if(rst == 1)begin
bi = Bi;
flag = 0;
result = 0;
i=0;
end
else if(flag == 0)begin
result = result + (Ai[i] ? bi:0);
bi = bi << 1;
i = i + 1;
if(i>=8)begin
flag = 1;
end
end
end

endmodule

可以看到时序逻辑会比组合逻辑复杂得多

但是也正是因为时序电路的“记忆性”

让cpu这类复杂的运算电路得以实现

Author:tastynoob
Link:https://tastynoob.github.io/1970/01/01/FPGA_/FPGA9/
版权声明:本文采用 CC BY-NC-SA 3.0 CN 协议进行许可
×