我们从2011年坚守至今,只想做存粹的技术论坛,记录你的技术足迹,有空就回来看看。  由于网站在外面,点击附件后可能要20秒才弹出下载,请耐心等待,勿重复点击

 找回密码
 立即注册
搜索
查看: 1162|回复: 8

[资料贡献] Verilog实现LED流水灯+基础入门语法+Modelsim仿真技巧+计数器+

[复制链接]

该用户从未签到

126

主题

239

回帖

0

积分

二级逆天

积分
0

终身成就奖金点子奖原创先锋奖

发表于 2020-6-6 17:09:54 | 显示全部楼层 |阅读模式
PGA设计的一个难点,就是设计技巧和规则的掌握,下面来看一个简单例子的实现过程,作为初级入门案例。
一、按键按下实现LED点亮
当LED引脚输出低电平时LED点亮,
(1)代码实现如下

module test(clk,rst_n,led); input clk ;input rst_n ;output reg led ; always @ ( posedge clk or negedge rst_n)begin        if(!rst_n)                begin                        led<=0;                end        else        begin                        led<=1;        endendendmodule


(2)基础语法要点:
在always里面被赋值必须是reg变量。
凡是在时序电路中被赋值的变量 必须是非阻塞赋值。always @ ( posedge clk or negedge rst_n)
凡是在组合电路中被赋值的变量 必须是阻塞赋值always @ ( *)
(3)Modelsim仿真测试文件。

`timescale 1 ps/ 1 psmodule test_tb();reg clk;reg rst_n;                                             wire led;                 test i1 (        .clk(clk),        .led(led),        .rst_n(rst_n));initial                                                begin                                                                                            $display("Running testbench");      clk=0;rst_n=0;#1000 rst_n=1;end                                                    always #10 clk=~clk;                                                    endmodule测试文件设计要点(点击生成测试文件)



输入都改为reg(系统产生)输出都改为wire:连线(系统产生)实例化模块并连接导线。(系统产生)initial中初始化变量。(自己修改)always产生时钟。(自己修改)
(4)Modelsim仿真


仿真中常用命令:
do wave.do
restart
run 0.1ms
(5)如果点亮四个LED呢?
改变led输出变量的位宽:

module test(clk,rst_n,led); input clk ;input rst_n ;output reg [3:0]]led ; always @ ( posedge clk or negedge rst_n)begin        if(!rst_n)                begin                        led<=4'b1111;                end        else        begin                        led<=4'b0000;        endendendmodule
同样改变测试文件位宽

wire [3:0] led ;
二、状态机设计实现流水灯
(1)模块代码
reg[1:0] state;

module test(clk,rst_n,led); input clk ;input rst_n ;output reg [3:0]led ; reg[1:0] state; always @ ( posedge clk or negedge rst_n)begin        if(!rst_n)                begin                        led<=4'b1111;                        state<=0;                end        else        begin                case(state)                        0:begin                                led<=4'b0111;                                state<=1;                        end                        1:begin                                led<=4'b1011;                                state<=2;                                                end                        2:begin                                led<=4'b1101;                                        state<=3;                                                        end                        3:begin                                led<=4'b1110;                                state<=0;                                                end                        default:                                 state<=0;                        endcase        endendendmodule
(2)状态机正确仿真:


(3)设计要点
注意state变量的赋初值。
(4)频率反转太快、看不出LED效果。
改善方法1:
状态机中增加计数器。

module test(clk,rst_n,led); input clk ;input rst_n ;output reg [3:0]led ; reg[1:0] state;reg [3:0] counter;always @ ( posedge clk or negedge rst_n)begin        if(!rst_n)                begin                        led<=4'b1111;                        state<=0;                        counter<=0;                end        else        begin                case(state)                        0:begin                                led<=4'b0111;                                if(counter<12)                                        counter<=counter+1;                                else                                        begin                                                counter<=0;                                                state<=1;                                        end                        end                        1:begin                                led<=4'b1011;                                if(counter<12)                                        counter<=counter+1;                                else                                        begin                                                counter<=0;                                                state<=2;                                        end                                        end                        2:begin                                led<=4'b1101;                                        if(counter<12)                                        counter<=counter+1;                                else                                        begin                                                counter<=0;                                                state<=3;                                        end                                                        end                        3:begin                                led<=4'b1110;                                if(counter<12)                                        counter<=counter+1;                                else                                        begin                                                counter<=0;                                                state<=0;                                        end                                                end                        default:                                 state<=0;                        endcase        endendendmodule

12的时候应该反转为什么延时一个周期呢?
因为是寄存器,等于是一个触发器,Q输出端等于get输入端 在上升沿来的时候

改善方法2:
分频,控制上升沿。

module test(clk,rst_n,led); input clk ;input rst_n ;output reg [3:0]led ; reg[1:0] state;reg [3:0] counter;reg clk_show; always @ ( posedge clk or negedge rst_n)begin        if(!rst_n)                begin                        clk_show<=0;                        counter<=0;                end        else                if(counter<12)                        counter<=counter+1;                else                        begin                                counter<=0;                                                        clk_show=~clk_show;                        endend always @ ( posedge clk_show or negedge rst_n)begin        if(!rst_n)                begin                        led<=4'b1111;                        state<=0;                end        else        begin                case(state)                        0:begin                                led<=4'b0111;                                state<=1;                        end                        1:begin                                led<=4'b1011;                                state<=2;                                end                        2:begin                                led<=4'b1101;                                        state<=3;                                                end                        3:begin                                led<=4'b1110;                                state<=0;                                end                        default:                                 state<=0;                        endcase        endendendmodule


测试:

`timescale 1 ps/ 1 psmodule test_tb();// constants                                           // general purpose registers// test vector input registersreg clk;reg rst_n;// wires                                               wire [3:0]led; // assign statements (if any)                          test i1 (// port map - connection between master ports and signals/registers           .clk(clk),        .led(led),        .rst_n(rst_n));initial                                                begin                                                  // code that executes only once                        // insert code here --> begin                                                                                 // --> end                                             $display("Running testbench");      clk=0;rst_n=0;#1000 rst_n=1;                 end                                                      always #10 clk=~clk;                                                    endmodule

(5)设计要点:
同一变量不能同时在两个always块内复制,如分频和状态机的两个always块,复位时复位什么变量由本块内用到的变量决定。基础十分重要,是FPGA设计的前提。通过以上学习我们学会了状态机  计数器  时钟分频电路的设计。
---------------------
版权声明:本文为CSDN博主「【星星之火】」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/fengyuwuzu0519/article/details/72457366[sub][/sub][sup][/sup][strike][/strike]
回复

使用道具 举报

该用户从未签到

0

主题

4979

回帖

6

积分

二级逆天

积分
6

终身成就奖社区居民优秀斑竹奖

QQ
发表于 2020-6-6 20:07:56 | 显示全部楼层
谢谢分享Verilog实现LED流水灯
回复

使用道具 举报

该用户从未签到

61

主题

2234

回帖

50

积分

二级逆天

积分
50

终身成就奖特殊贡献奖优秀斑竹奖

发表于 2020-6-6 20:39:30 | 显示全部楼层
好好学习,天天向上
回复

使用道具 举报

该用户从未签到

0

主题

26

回帖

0

积分

一级逆天

积分
0

终身成就奖

发表于 2020-6-6 22:19:45 | 显示全部楼层
回复

使用道具 举报

该用户从未签到

1

主题

4704

回帖

5

积分

二级逆天

积分
5

终身成就奖特殊贡献奖原创先锋奖优秀斑竹奖

发表于 2020-6-7 08:05:09 | 显示全部楼层
回复

使用道具 举报

该用户从未签到

61

主题

5330

回帖

0

积分

PADS-181217初级班

积分
0

终身成就奖特殊贡献奖原创先锋奖优秀斑竹奖

发表于 2020-6-7 08:57:56 | 显示全部楼层
回复

使用道具 举报

  • TA的每日心情
    奋斗
    前天 11:31
  • 签到天数: 25 天

    [LV.4]偶尔看看III

    60

    主题

    1万

    回帖

    8201

    积分

    二级逆天

    积分
    8201

    终身成就奖特殊贡献奖原创先锋奖社区居民灌水天才奖优秀斑竹奖宣传大使奖忠实会员最爱沙发社区劳模

    QQ
    发表于 2020-6-7 15:09:04 | 显示全部楼层
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 08:53
  • 签到天数: 28 天

    [LV.4]偶尔看看III

    2

    主题

    7129

    回帖

    1万

    积分

    三级逆天

    积分
    10343

    终身成就奖特殊贡献奖原创先锋奖

    QQ
    发表于 2020-6-8 09:03:05 | 显示全部楼层
    回复

    使用道具 举报

    该用户从未签到

    0

    主题

    4

    回帖

    0

    积分

    一级逆天

    积分
    0

    终身成就奖

    发表于 2023-10-29 09:23:31 | 显示全部楼层
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    Copyright ©2011-2024 NTpcb.com All Right Reserved.  Powered by Discuz! (NTpcb)

    本站信息均由会员发表,不代表NTpcb立场,如侵犯了您的权利请发帖投诉

    平平安安
    TOP
    快速回复 返回顶部 返回列表