这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 请教关于运算符

共17条 1/2 1 2 跳转至

请教关于运算符

菜鸟
2012-11-18 00:05:10     打赏
这一部分模块就是让灯大约1s亮一次但是如果把 下面标示红色的两句led_2<=8'b11111111;
led_2<=~led_2;改为led_2=8'b11111111;led_2=~led_2;灯就不会亮了,为什么?如果说这是信号的赋值符号,那为什么其余三个        led_yellow=led_yellow;     led_red=led_red; led_green=led_green;就没有问题????
还有就是把@(posedge sys_clk)去掉,也不行,这又是为什么,如果去掉的话难道不是每个时钟周期去执行完一行代码吗?跟加上的区别又在哪里?

  
      
module led_2
(led_2,
led_green,
led_red,
led_yellow,
sys_clk);
output [8:1] led_2;
output led_red;
output led_green;
output led_yellow;
input sys_clk;
reg [8:1] led_2;
reg flag;
reg flag_times;
reg [27:0] delay_ms;
reg led_red;
reg led_green;
reg led_yellow;
always@(posedge sys_clk)
    begin
    if(delay_ms>28'd50999999)
    delay_ms=28'd0;
    else delay_ms=delay_ms+1;
    end
always@(posedge sys_clk)
    begin
    led_2<=8'b11111111;
    if (delay_ms==28'd50999999)
        begin
        led_2<=~led_2;
        led_yellow=~led_yellow;
        led_red=~led_red;
        led_green=~led_green;
        end
    else
        begin
        led_2<=led_2;
        led_yellow=led_yellow;
        led_red=led_red;
        led_green=led_green;
        end
    end
endmodule
----------------------
上面的帖子是11月18号写的,后来也没有人给出直接的回复,这两天自己仿真了一下,结果跟大家一起讨论分享。
首先为了仿真方便,我把code里的reg [27:0] delay_ms;值缩小了



直接上仿真波形,,如果led的值为0,执行取反操作后,led变为1,
可以看出,跟单片机不同的时,即使一个时钟周期下,所有的代码都会被执行到
同时发现else begin下的led<=led的赋值优先权竟然高于第一句的led<=8'b00000000;



如果将上面的程序中按照我说的,改为led=8'b00000000;led=~led;仿真结果如下图所示




可以看出,led的高电平只是持续了一个周期,执行完if (delay_ms==2'b11);后,下一个时钟沿时先去执行led=8'b00000000;(阻塞语句),然后再执行后面的语句。
但是即使有先后,也会在一个时钟周期内执行,这点跟单片机确实不一样。
再次回到我原来的问题,这一部分模块就是让灯大约1s亮一次但是如果把 下面标示红色的两句led_2<=8'b11111111;
led_2<=~led_2;改为led_2=8'b11111111;led_2=~led_2;灯就不会亮了,为什么?
其实灯只是亮了一个时钟周期,也就是20ns,人眼是不会发觉的

同时在仿真中发现,下面的这些值应该设定初始值,否则仿真不成功
这也说明芯片在实际工作时,若不设定初始值,会默认为低电平
output [8:1] led=8'b00000000;
output led_red=0;
output led_green=0;
output led_yellow=0;
reg [1:0] delay_ms=0;



关键词: 请教     关于     运算符     yellow     green    

高工
2012-11-18 01:24:07     打赏
2楼
教程数码篇的日积月累里有提到的:阻塞语句,非阻塞语句
我光看也没懂区别在哪,看了楼主的实际效果,才知道这2种语句的后果是不一样的.

高工
2012-11-18 01:48:28     打赏
3楼
还是找本verilog HDL的书综合看一下语法吧
自学最怕的就是这种,

照着别人的程序能实现一些功能,
但是对整个知识体系没有一个完整的学习,很多基础知识不了解

高工
2012-11-18 01:49:59     打赏
4楼
倒现在为止,
都没怎么见到有人讨论FPGA里面一个非常基础的东西:状态机
可能这是论坛学习的一个弊端

高工
2012-11-18 10:12:30     打赏
5楼

建议先把数字电路的基础打牢,熟悉verilog的基本语法,不要用单片机编程的思想来学FPGA


高工
2012-11-18 10:15:05     打赏
6楼
状态机后续教程都会讲到的,我觉得对于初学者来说,前期最好不要接触状态机,不利于理解FPGA的并行操作。特别是在高速数字设计中,状态机很少用到的,速度太慢!

高工
2012-11-18 10:48:37     打赏
7楼
“特别是在高速数字设计中,状态机很少用到的,速度太慢!”
“前期最好不要接触状态机,不利于理解FPGA的并行操作“”

这些结论不知道怎么得出来的,无语
状态机本身就是 数字电路基础 里面讲过的概念
不知道大侠不用状态机,在高速数字设计里面用什么实现时序逻辑啊?画寄存器?

另外,我的帖子很明显指的是论坛里面有些新入门网友的对FGPA的知识体系缺乏系统学习
而状态机,阻塞非阻塞,都是FPGA学习最最基础的东西



高工
2012-11-18 10:49:13     打赏
8楼
“特别是在高速数字设计中,状态机很少用到的,速度太慢!”
“前期最好不要接触状态机,不利于理解FPGA的并行操作“”

这些结论不知道怎么得出来的,无语
状态机本身就是 数字电路基础 里面讲过的概念
不知道大侠不用状态机,在高速数字设计里面用什么实现时序逻辑啊?画寄存器?

另外,我的帖子很明显指的是论坛里面有些新入门网友的对FGPA的知识体系缺乏系统学习
而状态机,阻塞非阻塞,都是FPGA学习最最基础的东西

高工
2012-11-18 11:11:38     打赏
9楼
状态机是数字电路基础,但并不是时序逻辑的全部,状态机往往用来做控制,不用状态机就不能实现时序逻辑设计?我觉得你还是对时序逻辑设计不够了解吧,状态机设计不过是时序设计中的一种罢了,像D触发器,移位寄存器,计数器你能说不是时序逻辑设计吗,状态机在低速的数字电路中用的比较多,但在高速数字电路设计里面很少用到,特别是通信方面,流水设计,高速数据流控制和算法设计中,状态机影响速度,真正做过高速逻辑设计的都会深有体会的。
前期不建议初学者学习状态机,并不是说状态机不重要,而是想让初学者先掌握像编码器、译码器、D触发器、移位寄存器、计数器等一些基本的数字电路后再接触状态机。

“特别是在高速数字设计中,状态机很少用到的,速度太慢!”
“前期最好不要接触状态机,不利于理解FPGA的并行操作“,这两句话不是我总结的,而是在华为有多年逻辑设计经验工程师,在给我们做培训时总结的,开始我也很不理解,后来接触高速逻辑设计方面的项目,才慢慢体会到!

菜鸟
2012-11-18 12:14:17     打赏
10楼
为什么就没有关于这个问题的最直接的答案呢?
这个例子就是led灯,也就是第一个fpga实验就会接触到的例子,怎么绕过去???

共17条 1/2 1 2 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]