FPGA学习日记——01Verilog程序设计

一、电路设计的语法

  1. 设计不用的语法

    • initial:设计不用,仿真时使用
    • task/function:设计不用,仿真时少用
    • for/while/repeat/forever:设计不用,仿真时少用
    • integer:设计不用
    • 模块内部不能有X态、Z态,内部不能有三态接口
    • casex/casez:设计和仿真都不用
    • force/wait/fork:设计不用,仿真少用
    • #5:设计不用,仿真时使用
  2. 设计时使用的语法

    • reg/wire、paremeter
    • assign(建议改名时使用)、always
    • 只使用if else/case两种条件语句
    • 算术运算符(+、-、*、/、%)
    • 赋值运算符(=、<=时序逻辑用<=,组合逻辑用=)
    • 关系运算符(>、<、=、<=)
    • 逻辑运算符(&&、||、!)
    • 位运算符(~、|、^、&)
    • 移位运算符(<<、>>)
    • 拼接运算符({})

二、电路设计的结构

  1. 电路设计的3种结构

    • 组合逻辑
    always @(*) begin
       语句 
    end
    
    • 同步复位时序逻辑
    always @(posedge clk) begin
        if(rst_n == 1'b0) begin
        	语句
        end
        else begin
            语句
        end
    end
    
    • 异步复位时序逻辑
    always @(posedge clk or negedge rst_n)begin
        if(rst_n == 1'b0) begin
             语句
        end
        else begin
            语句
        end
    end
    
  2. 电路举例

    • 组合逻辑
    always @(*) begin
        if(a == 1'b1)
            b = 1'b0;
        else
            b = 1'b1;
    end
    
    always @(*) begin
        case(a)
            1'b0:b = 1'b1;
            1'b1:b = 1'b0;
            default:b = 1'b0;
        endcase
    end
    
    • 同步复位时序电路
    always @(posedge clk) begin
        if(rst_n == 1'b0) begin
        	b <= 1'b0;
        end
        else begin
            if(a == 1'b0)
                b <= 1'b1;
            else
                b <= 1'b0;
        end
    end
    
    always @(posedge clk) begin
        if(rst_n == 1'b0) begin
            b <= 1'b0;
        end
        else begin
            case(a)
                1'b0:b <= 1'b1;
                1'b1:b <= 1'b0;
                default:b <= 1'b0;
            endcase
        end
    end
    
    • 异步复位时序电路
    always @(posedge clk or negedge rst_n) begin
        if(rst_n == 1'b0) begin
            b <= 1'b0;
        end
        else begin
            if(a == 1'b0)
                b <= 1'b1;
            else
                b <= 1'b0;
        end
    end
    
    always @(posedge clk or negedge rst_n) begin
        if(rst_n == 1'b0) begin
            b <= 1'b0;
        end
        else begin
            case(a)
                1'b0:b <= 1'b1;
                1'b1:b <= 1'b0;
                default:b <= 1'b0;
            endcase
        end
    end
    

三、电路设计要点

  1. 一个always只产生一个信号

    always @(posedge clk or negedge rst_n) begin
        if(rst_n == 1'b0) begin
            b <= 1'b0;
        end
        else begin
            b <= 1'b1;
        end
    end
    always @(posedge clk or negedge rst_n) begin
        if(rst_n == 1'b0) begin
            a <= 1'b0;
        end
        else begin
            a <= 1'b1;
        end
    end
    
  2. 一个信号只能在一个always产生

  3. always是描述一个信号产生的方法,即在什么情况下,这个信号的值是多少;在其他情况下值为多少,要全面考虑

  4. 条件判断只允许使用if else和case,其他全部不用

  5. 含有posedge和negedge的,一定是D触发器,是时序电路

  6. 设计时,如果想立即有结果,使用组合逻辑;如果想延时一拍有结果,就用时序逻辑

  • 20
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

功成狮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值