模型功能
- always实现时序逻辑
- assign实现组合逻辑
- 两者共同构成数字系统
模型框图
reg r_A;
wire w_A;
always@(posedge clk)
begin
if(!i_rst_n)
begin
r_A <= 1'b0;
end
else
begin
r_A <= ~r_A;
end
end
assign w_A = r_A;
实现步骤
- always的电路描述
- always@(posedge clk)实现触发器FF(也可以作为锁存器,但是FPGA内很少见)
- 触发器的复位包括三种:同步复位、异步复位、时钟使能(本人按照作用进行划分,非传统复位)
- 同步复位不需要将复位加入到敏感列表
- 异步复位则需要加入
- 时钟使能则是需要将值进行保持
- 之所以将前面三种模式联合,是因为这三种信号共同组成了control sets
- 对于FPGA来说,相近的逻辑使用相同的control sets可以提高资源利用率
- 所以always描述应当尽可能保持一致,以降低资源浪费
- 触发器的复位包括三种:同步复位、异步复位、时钟使能(本人按照作用进行划分,非传统复位)
- always@(*)实现的是组合逻辑,一般用于希望使用case的组合逻辑
- assign的简单使用
- 将wire信号和其他信号关联,实现复杂的线逻辑
- assign形成的硬件包含了所有的组合逻辑
- 高低电平转化
- DUT逻辑
- 比较器
- always和generate的综合使用
- always也可以在generate内形成级联逻辑
- 具体的用法可以见前一章的reg级联中的示例
- 本章需要解释的是always级联后的硬件意义
- always级联时,依旧遵循module类似的原则
- 相同位宽进行复制、不同位宽进行补位
- 其底层的硬件逻辑是先构建一定数量的FF
- 然后按照原则将所有的端口进行级联
- always级联时,依旧遵循module类似的原则
- 最终,该级联会形成一个可以调整的逻辑组,用于实现一些复杂的逻辑
parameter STR = "hello";
reg [7:0] r_string [0:9-1];
generate genvar i;
for(i = 0; i < 9; i = i + 1)
begin: FOR_9
always@(posedge clk)
begin
r_string[i] <= STR[8*(i+1)-1:8*i];
end
end
endgenerate
- 上图是一个简单的将字符串缓存到二维变量的例子
- 如果加入一些判断条件,就可以进行字符串的遍历
- 更加重要的时,for里面可以在进行for,实现快速的bit位寻找
- 比如找出128'h00010023000340中的最高位
- 使用for可以得到极其简易的代码,且方便修改
最终效果
- 略
调用接口
- 略