赞
踩
- always @(posedge sys_clk or negedge sys_rst_n) begin
- if (count == COUNT_MAX) //
- led_out <= ~led_out; // 时序逻辑块中用非阻塞赋值
- else if(sys_rst_n == 1'b0)
- led_out <= 1'b0;
- else
- led_out <= led_out;
- end
显然,复位信号没有在第一条if语句中进行判断,故出错!
- always @(posedge sys_clk or negedge sys_rst_n) begin
- if (sys_rst_n == 1'b0) //
- led_out <= 1'b0;
- else if(count == COUNT_MAX)
- led_out <= ~led_out; // 时序逻辑块中用非阻塞赋值
- else
- led_out <= led_out;
- end
parameter COUNT_MAX = 25'd24_999_999
- parameter MIN = 25'd10_999_999,
- parameter MAX = 25'd24_999_999
由于wire型变量才是表示电路中的物理连接,因此模块间连接的中间变量要使用wire型,而不是reg!否则会报错:Error (10663): Verilog HDL Port Connection error at capKey_ctrl_Led.v(41): output or inout port "key_out" must be connected to a structural net expression
常用的场景为在一个模块中实例化另一个模块时,他们之间连接的中间变量用wire型!
- module A(
- port
- );
- // 连接两个模块的中间变量要用wire型变量
- wire moduleB_out;
-
- // 实例化模块B
- B B_int1(
- .in(in),
- .out(moduleB_out)
- );
-
- endmodule
-
- // 另一个文件中定义的模块
- module B(
- input wire in,
- output reg out
- );
- endmodule
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
注意:与原模块中输出信号的类型无关,模块间连接的中间信号都用wire型!
状态机(FSM),主要用于在时序电路中描述具有先后顺序的事物。主要分为两类:
如上图所示,显然Mealy型状态机的状态数较少,故选择该状态机进行进一步的设计!
注意:输入有多少种情况,每个状态的跳转就有多少种情况!(应避免画状态图时跳转状态遗漏)
如上述三个状态的编码方式为:
- // 定义状态(3个状态),使用独热编码(效率高,占用寄存器资源多)
- parameter IDLE = 3'b001;
- parameter ONE = 3'b010;
- parameter TWO = 3'b100;
如上述三个状态的编码方式为:
- // 二进制编码(效率低,占用寄存器资源少)
- parameter IDLE = 2'b00;
- parameter ONE = 2'b01;
- parameter TWO = 2'b10;
编码方式: 相邻两个状态仅有一位不同,消耗位宽与二进制编码相同
如上述三个状态的编码方式为:
- // 格雷码(相邻两个状态只有一位不同),折中的编码方式
- parameter IDLE = 2'b00;
- parameter ONE = 2'b01;
- parameter TWO = 2'b11;
把状态转移和数据输出分别用不同的always块描述
状态转移用一个always块
当有多个输出时,每个输出用一个always块进行描述
- // 状态转换的描述
- always @(posedge sys_clk or negedge sys_rst_n) begin
- if(sys_rst_n == 1'b0)
- state <= IDLE;
- else begin
- case(state)
- IDLE: if (in== 1'b1)
- state <= ONE;
- else
- state <= IDLE;
- ONE: if (in== 1'b1)
- state <= TWO;
- else
- state <= ONE;
- TWO: if (in== 1'b1)
- state <= IDLE;
- else
- state <= TWO;
- default: state <= IDLE;
- endcase
- end
- end
-
- // 输出1设置
- always @(posedge sys_clk or negedge sys_rst_n) begin
- out1
- end
-
- // 输出2设置
- always @(posedge sys_clk or negedge sys_rst_n) begin
- out2
- end
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
FPGA中基于系统时钟可以产生任意分频/倍频的时钟信号。若锁相环(PLL)资源充足,可优先选用锁相环产生分频、倍频、任意占空比、任意相位的信号。
当需要多路分频信号且PLL资源不够用时可选择降频的方式产生系统时钟分频后的时钟信号:
如图所示,用标志信号的方式产生降频时钟,捕捉标志信号的下降沿即可实现5分频!
PLL和降频方式的优势在于输出的时钟信号仍通过系统时钟树到达相应的寄存器,使得每路时钟信号到达每个寄存器时间几乎保持一致,避免了时序错误!
- assign posedge = ~( (~sig_reg1) | sig_reg2 );
-
- assign negedge = (~sig_reg1) & sig_reg2 ;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。