在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 3727|回复: 11

[求助] 请教两个写verilog代码的基本问题(已解决,谢谢)

[复制链接]
发表于 2012-2-10 15:25:10 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
本帖最后由 atlandis 于 2012-2-14 15:20 编辑

问题一

如果case有很多种可能性,比如,WRITE_0,WRITE_1,WRITE_2,WRITE_3,WRITE_4,WRITE_5,WRITE_6,等等
在1,2,3,4周期写数据,其他情况默认不变,default应该怎么写?

case (fsm)

WRITE_0:
   
    wdata_d [7:0]   <= #1 i_data;

WRITE_1:
   
    wdata_d [15:8]  <= #1 i_data;

WRITE_2:
   
    wdata_d [23:16] <= #1 i_data;

WRITE_3:
   
    wdata_d [31:24] <= #1 i_data;
   
default:
   

    endcase

问题二

输出信号o_data

如果是reg,怎么赋值

假如,output reg[7:0] o_data;

always @(*) o_data<= 0'b1;

如果不是reg,怎么赋值

假如,output reg[7:0] o_data;

assign o_data = 0'b1;


上面的写法对么?有什么区别么?
发表于 2012-2-10 15:32:10 | 显示全部楼层
回复 1# atlandis


    default: ;

这样写就好了。

输出也是case()输出就好了。跟上面的case()类似。
 楼主| 发表于 2012-2-10 16:12:10 | 显示全部楼层
回复 2# wyj_whu


   嗯,对于时序逻辑这个应该没有什么影响吧,
可以帮我回答 问题二 不?
发表于 2012-2-10 18:53:29 | 显示全部楼层
问题2 好像不对吧。
如果是reg,必须是always @(posedge/negedge clk) o_data<= 0'b1;有时钟它才叫寄存器。
如果不是reg,你这样写没有报错吗?assign不可以给reg变量赋值。改成wire型的就好了。
 楼主| 发表于 2012-2-10 20:43:12 | 显示全部楼层
回复 4# fl_5588


   假如,output reg[7:0] o_data;

always @(*) o_data<= 0'b1;

如果不是reg

假如,output [7:0] o_data;

assign o_data = 0'b1;

不好意思,copy错了,第二个没有reg, 我说就是没有reg, 所以用assign 赋值,这两种综合有区别么?另外,第一个always @(*)  没有报错,这个语法不对么?
 楼主| 发表于 2012-2-10 20:45:34 | 显示全部楼层
回复 4# fl_5588


   wire类型的信号不用另外声明出来吧

比如reg型  output reg 『』data;


wire型      output 『』data;
发表于 2012-2-10 21:12:14 | 显示全部楼层
可以不用声明,默认就是wire类型。
这样写always @(*) o_data<= 0'b1 与 assign o_data = 0'b1 效果是一样的,但是两个都是组合逻辑。但是如果说组合逻辑的话,这一句always @(*) o_data<= 0'b1 中<=应该改为=,这样写语法没有问题,不会报错,但是不规范。
严格来说,组合逻辑与时序逻辑不能用reg不reg来区分。组合逻辑你可以简单地理解为没有时钟的逻辑,时序逻辑则是有时钟的。
你的本意是有要综合成时序逻辑是吧,修改方法就是我前面提到的 always @(posedge/negedge clk) o_data<= 0'b1。这样才会综合出DFF来。
如理解有误,欢迎拍砖。
发表于 2012-2-11 13:29:32 | 显示全部楼层
给你一个不用reg的解答
wire [31:0] wdata_d;

assign wdata_d [7:0]  = #1 (fsm == WRITE_0) ? i_data:default;
assign wdata_d [15:8]  = #1 (fsm == WRITE_1) ? i_data:default;
assign wdata_d [23:16]  = #1 (fsm == WRITE_2) ? i_data:default;
assign wdata_d [31:24]  = #1 (fsm == WRITE_3) ? i_data:default;

状态机里面越简单越好。组合逻辑要么直接赋值,要么用异步做。
 楼主| 发表于 2012-2-11 13:47:54 | 显示全部楼层
回复 9# freeme_up

assign wdata_d [31:24]  = #1 (fsm == WRITE_3) ? i_data:default;

竟然有这种写法,呵呵,少见少见,但是这对于综合来说,效果一样的吧,因为后面有个default,是不是说也会生成一个latch啊。
发表于 2012-2-11 14:15:42 | 显示全部楼层
你没给我default值,我也不好瞎猜。如果为了综合,通常给个'hz,或者'h0就可以了,除非你有特定值。

延时写错了,应该是 assign #1 wdata_d [31:24]  =  (fsm == WRITE_3) ? i_data:default;

这样有个坏处,会吃掉小于#1的毛刺
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

X

小黑屋| 手机版| 关于我们| 联系我们| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2025-6-9 18:36 , Processed in 0.040311 second(s), 9 queries , Gzip On, MemCached On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表