xxbwang 发表于 2010-5-23 16:52:24

新手求救:一个简单的移位函数都编不过,求助啊

我学数电的时候涉及到这个,想写个小程序,但怎么也编不过!我知道对大家很简单,麻烦写两句吧
module roundshift(result,order,origindata);
input origindata;
input order;
output result;
wire shift;
assign shift=order;
for(shift;shift>=0;shift--)
assign result={origindata,origindata};
endmodule

xxbwang 发表于 2010-5-23 17:01:23

补充一下:错误提示
Info: Command: quartus_map --read_settings_files=on --write_settings_files=off roundshift -c roundshift
Error (10170): Verilog HDL syntax error at roundshift.v(7) near text "for";expecting an identifier ("for" is a reserved keyword ), or "endmodule", or a parallel statement
Error (10170): Verilog HDL syntax error at roundshift.v(8) near text "}";expecting ";", or ","
Error (10112): Ignored design unit "roundshift" at roundshift.v(1) due to previous errors
Info: Found 0 design units, including 0 entities, in source file roundshift.v
Error: Quartus II Analysis & Synthesis was unsuccessful. 3 errors, 0 warnings
        Error: Peak virtual memory: 194 megabytes
        Error: Processing ended: Sun May 23 16:45:32 2010
        Error: Elapsed time: 00:00:02
        Error: Total CPU time (on all processors): 00:00:01
Error: Quartus II Full Compilation was unsuccessful. 5 errors, 0 warnings

tiancaigao7 发表于 2010-5-23 17:20:05

wire shift
这个变量是一个一位的线性变量不能够利用4位的线型变量来赋值

sk_dlmu 发表于 2010-5-23 18:04:25

for(shift;shift>=0;shift--)
verilog语言中不支持--,要使用shift=shift-1

tear086 发表于 2010-5-23 21:19:32

咳。移位就直接<<或>>嘛。for只能在always块内使用,用于复制电路;用在其他地方则无法综合。


----------------------------------------
流水灯小例
----------------------------------------
module rider_led(
input      CLOCK_50,                // 板载时钟50MHz
input      Q_KEY,                   // 板载按键RST
output LED                      // LED ~ LED
);   

//++++++++++++++++++++++++++++++++++++++
// 分频部分 开始
//++++++++++++++++++++++++++++++++++++++
reg cnt;                         // 计数子

// 溢出后自动重新计数
always @ (posedge CLOCK_50, negedge Q_KEY)
if (!Q_KEY)
    cnt <= 0;
else
    cnt <= cnt + 1'b1;

wire led_clk = cnt;               // 每(2^24/50M = 0.3355)sec取一次
//--------------------------------------
// 分频部分 结束
//--------------------------------------


//++++++++++++++++++++++++++++++++++++++
// 跑马灯部分 开始
//++++++++++++++++++++++++++++++++++++++
reg led_r;                     // 定义输出寄存器
reg      dir;                         // 循环方向控制;上电缺省值为0

always @ (posedge led_clk, negedge Q_KEY)
if (!Q_KEY)                           // 复位后右移
    dir <= 0;                           
else
    // 到达左右端点否?到达则换向
    if(led_r)                        // led_r == 8'h40
      dir <= 1;   
    else if(led_r)                   // led_r == 8'b02
      dir <= 0;

always @ (posedge led_clk, negedge Q_KEY)
if (!Q_KEY)                           // 复位后右移
    led_r <= 8'h01;         
else
    // 根据dir,左右移位
    // 注意LED实际以为方向与led_r移位方向相反
    // 因为开发板上LED在左,LED在右
    if(!dir)
      led_r <= led_r << 1;            // LED右移
    else   
      led_r <= led_r >> 1;            // LED左移

// 为什么要取反?
// 因为开发板上的LED是送0亮,送1灭
assign LED = ~led_r;                  // 寄存器输出
//--------------------------------------
// 跑马灯部分 结束
//--------------------------------------

endmodule

xxbwang 发表于 2010-5-23 22:41:52

回复【4楼】tear086 .COM 缺氧
-----------------------------------------------------------------------
谢谢!
-_-!嘿嘿   原来for还有这种讲究
我刚学所以很多东风没法从c那种编程语言转换到描述语言,一时很难适应啊
又没人教只能试了
万分感谢

xxbwang 发表于 2010-5-23 22:42:30

回复【2楼】tiancaigao7 天才杨威利
-----------------------------------------------------------------------

这个明白
谢谢!

xxbwang 发表于 2010-5-23 22:45:42

回复【3楼】sk_dlmu
-----------------------------------------------------------------------
谢谢! 突然想起我看过这一条不过没放心上
C后遗症啊

suipeng70 发表于 2010-5-24 12:34:28

在Verilog综合时,for语句会被展开,也就是逻辑块的复制。楼主可以写一个简单的程序,然后综合看看RTL图,就可以理解。
所以在Verilog综合时,for语句是要谨慎使用的。
verlog HDL不像C,代码简洁不等于电路简洁。
页: [1]
查看完整版本: 新手求救:一个简单的移位函数都编不过,求助啊