初级会员
- 积分
- 95
- 金钱
- 95
- 注册时间
- 2020-12-19
- 在线时间
- 18 小时
|
由于是刚接触fpga一周,对Verilog语法只是懂一点点。
例程里学到的东西或者说是疑问:
top_seg_led.v:
module top_seg_led(
input sys_clk , // 全局时钟信号
input sys_rst_n, // 复位信号(低有效)
output [5:0] seg_sel , // 数码管位选信号,为什么不是output reg [5:0] seg_sel
output [7:0] seg_led // 数码管段选信号,为什么不是output reg [7:0] seg_led
);
wire [19:0] data; // 数码管显示的数值,为什么不是 reg [19:0] data
seg_led.v:
localparam CLK_DIVIDE = 4'd10 ; // 时钟分频系数
localparam MAX_NUM = 13'd5000 ;
parameter可用作在顶层模块中例化底层模块时传递参数的接口,
localparam的作用域仅仅限于当前module,不能作为参数传递的接口。
wire [3:0] data0 ; // 个位数,不能定义为reg [3:0] data0
wire [3:0] data1 ; // 十位数,不能定义为reg [3:0] data1
wire [3:0] data2 ; // 百位数,不能定义为reg [3:0] data2
wire [3:0] data3 ; // 千位数,不能定义为reg [3:0] data3
wire [3:0] data4 ; // 万位数,不能定义为reg [3:0] data4
wire [3:0] data5 ; // 十万位数,不能定义为reg [3:0] data5
//提取显示数值所对应的十进制数的各个位
assign data0 = data % 4'd10; // 个位数
assign data1 = data / 4'd10 % 4'd10 ; // 十位数
assign data2 = data / 7'd100 % 4'd10 ; // 百位数
assign data3 = data / 10'd1000 % 4'd10 ; // 千位数
assign data4 = data / 14'd10000 % 4'd10; // 万位数
assign data5 = data / 17'd100000; // 十万位数
学会了产生分频时钟:
//对系统时钟10分频,得到的频率为5MHz的数码管驱动时钟dri_clk
always @(posedge clk or negedge rst_n) begin
if(!rst_n) begin
clk_cnt <= 4'd0;
dri_clk <= 1'b1;
end
else if(clk_cnt == CLK_DIVIDE/2 - 1'd1) begin
clk_cnt <= 4'd0;
dri_clk <= ~dri_clk;
end
else begin
clk_cnt <= clk_cnt + 1'b1;
dri_clk <= dri_clk;
end
end
|
|