基本项目实现

    初学过程中都会有一段时间自发获得荣誉称号“点灯大师”,花式点亮开发板上的led灯珠。译码器、呼吸灯和流水灯是作为组合逻辑和时序逻辑的经典入门案例。在实现过程中因为流水灯有不同实现方法,写起来会比较有趣。下面针对学习过程中需要注意的知识点做简单记录。

3-8译码器

    通过这个实验主要学习到组合逻辑的标志一般是assign以及always@(*),另外,{a, b, c}是能实现拼接功能,这在verilog代码开发中经常被使用到。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
module decoder_3_8(
input in1, //最高位
input in2,
input in3, //最低位
output reg [7:0] out //线型的8位输出信号
);

always @(*) begin // 组合逻辑块
case ({in1, in2, in3}) // 将三个输入拼接为3位二进制数
3'b000: out = 8'b00000001;
3'b001: out = 8'b00000010;
3'b010: out = 8'b00000100;
3'b011: out = 8'b00001000;
3'b100: out = 8'b00010000;
3'b101: out = 8'b00100000;
3'b110: out = 8'b01000000;
3'b111: out = 8'b10000000;
default: out = 8'b00000000;
endcase
end

endmodule

呼吸灯、流水灯

    组合逻辑的输出仅取决于当前输入,与电路的历史状态无关。时序逻辑的核心是D触发器,具有了存储特性。

    因为呼吸灯实现实现起来比较简单这里省略。以流水灯的实现思路,学习几种基本的语法应用。实现思路:

  • 定义一个时间计数器及led标记计数器 + case
  • 循环左移
  • 调用3-8译码器模块

    通过o_led <= o_led << 1;或者o_led <= {o_led[6:0], o_led[7]};都能实现循环左移,并且后者表达起来更加简洁。而调用3-8译码器模块的方法主要学会基于vivoda平台怎么调用已经调试好的模块,并且加深理解一下3-8译码器的8个状态的理解,8bit的结果,7个0和一个1, 1的不同位置就形成了8个状态,这个刚好和流水灯的输出状态是相同的。
    在调试过程中还涉及了.v源文件中计数器最大值参数化以及在实例化过程中参数自定义的语法格式。通过参数化修改仿真参数可以大大减少仿真时间。

参考链接

1.小梅哥-FPGA设计思想与验证方法