新手求救:一个简单的移位函数都编不过,求助啊
我学数电的时候涉及到这个,想写个小程序,但怎么也编不过!我知道对大家很简单,麻烦写两句吧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 补充一下:错误提示
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 wire shift
这个变量是一个一位的线性变量不能够利用4位的线型变量来赋值 for(shift;shift>=0;shift--)
verilog语言中不支持--,要使用shift=shift-1 咳。移位就直接<<或>>嘛。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 回复【4楼】tear086 .COM 缺氧
-----------------------------------------------------------------------
谢谢!
-_-!嘿嘿 原来for还有这种讲究
我刚学所以很多东风没法从c那种编程语言转换到描述语言,一时很难适应啊
又没人教只能试了
万分感谢 回复【2楼】tiancaigao7 天才杨威利
-----------------------------------------------------------------------
这个明白
谢谢! 回复【3楼】sk_dlmu
-----------------------------------------------------------------------
谢谢! 突然想起我看过这一条不过没放心上
C后遗症啊 在Verilog综合时,for语句会被展开,也就是逻辑块的复制。楼主可以写一个简单的程序,然后综合看看RTL图,就可以理解。
所以在Verilog综合时,for语句是要谨慎使用的。
verlog HDL不像C,代码简洁不等于电路简洁。
页:
[1]