| 
 
初级会员 
 
	积分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
 
 
 | 
 |