4.2.4 FPGA项目训练
(1)与门逻辑设计实例
a)显式建模程序:
module and_gate(clk, rst_n, a, b, f);
input clk, rst_n;
input a, b; // output reg f; //
/* // 行为建模 //assign f = a & b; 数据流建模 always @ (posedge clk or negedge rst_n) //结构化建模 begin if (!rst_n) begin f <= 0; end else begin f <= a & b; end end endmodule b)验证代码程序:
c)仿真图形展示:
(2) 流水灯设计实例 a)显式建模程序为:
module ledrun ( clk, rst); input clk, rst; output reg[ 3:0 ]led;
reg [25:0] count; //延时计数器,这里是25位计数器 always @(posedge clk) //每个时钟上升沿进行下面动作 if(rst)
led <= 4'b1000; //复位初始化,只有一个灯亮着,这里做一个
灯的流水灯,如果做两个灯,就是1100
always @(posedge clk)
If(reg[25] == 1) //计数满后再进行下面动作,延时。 begin
if(led <=4b’0001) //当滚到尽头,回到左侧起始端 led <=4b’1000; else
led <={led[0], led[4:1]} //右移,用并置符实现 end
endmodule
此为普通流水灯,可以向右滚动,到最右端返回最左端,也可以通过设置使其向左滚动,到最左端返回最右端。
b)验证代码程序为:
`timescale 1ns/1ps module shiyan2_tb; reg clk; reg rst; wire [3:0] led; parameter T1s = 5;
initial begin clk = 1'b1; rst = 1'b0; # 200.1 rst = 1'b1; # 2000 $stop;
end
always #10 clk = ~clk;//50M shiyan2 #(T1s)
shiyan2_dut(.clk(clk),.rst(rst),.led(led)); endmodule
c)仿真图形及实验照片展示:
(3)边沿检测设计实例 a)显示建模程序为:
b)验证代码程序为:
c)仿真波形展示:
(4) 数码管设计实例
如图所示为本设计所使用的数码管电路结构,使用的是六位共阳极数码管,六个PNP型三极管分别作为六组数码管电源的输入开关,也就是我们常说的位选信号,PNP三极管为低电平导通,所以我们的位选信号低有效。在这里,为了节约FPGA的IO资源,我们把六个位选信号连接到了三八译码器74HC138D。
下面为6个数码管的显示。
一个数码管对应的data位宽为4位,六个数码管就需要24位,而且分时显示需要对六个数码管进行切换。因此我们需要修改原有的seg7.v