ddr 发表于 2010-4-12 10:35:56

编程问题,帧头搜索定位,容错的程序,高手指点一下

module test11(clk,din,reset,dout);
input clk,reset;      //时钟/复位
input din;         //输入数据
output dout;
reg locate_47;   //锁定47的位置
regnum;            //搜索阶段记录连续47的个数即搜索的帧数<=7
reg count;         //计数
reg lock,p;               //开始锁定阶段的控制位
regdin_r,din_r_1;//数据寄存
reg dout_r;wire dout_r_1;
regk;
//-------开始复位---------
always@(posedge clk)
begin
if(reset)
    begin
    count=0;locate_47=0;
    num=0;lock=0;k=3;p=1'b0;
    dout_r=0;
    end end
//-------计数和数据输入-----------
always@(posedge clk)
begin
din_r=din;         
count=count+1'b1;
if(count==4'b1010)
    count=4'b0000;
end
//--------------------------------------
always@(posedge clk)
begin
   if(count==locate_47)
   din_r_1=din_r;   //
   if(din_r_1==47)   //
      num=num+1'b1;
   else
      begin
      if(k==3)
      locate_47=locate_47+1'b1;
      end         
   if(locate_47==4'd10)
      locate_47=4'b0000;
end
//-------------------------------------
always@(posedge clk)
begin
if(num==3'b011)
    num=3'b000;
    lock=1'b1;
end
//----------------------------------
always@(posedge clk)
begin
if(lock)
    begin
p=~p;
   if(din_r_1==8'h47)
       dout_r=~dout_r;
   else
      begin
      k=k+3'b001;
      if(k==3'b010)
          begin
    k=3'b011;
          lock=0;
       end
      end
end
end
assign dout=dout_r;
endmodule

加入assign dout=dout_r;时就出现下面错误,,没加时只出现警告。

是哪里语法出现错误呢,,请高手指点。。
程序的功能是搜索和容错功能,每个时钟进来一个字(8位)数据,十个字为一帧,要搜索出帧的头个字(即帧头),每个帧头都是47,但2个帧头中间也可能出现47,当连续检测到3个在帧中同样位置的都为47,就确定其为帧头,这时就有一个out输出高,定位后每到帧的这个位置out就为高,但如果连续出现2个不为47,又要重新进入搜索程序。

错误:
Info: *******************************************************************
Info: Running Quartus II Analysis & Synthesis
Info: Version 9.1 Build 222 10/21/2009 SJ Web Edition
Info: Processing started: Fri Apr 09 00:52:25 2010
Info: Command: quartus_map --read_settings_files=on --write_settings_files=off test11 -c test11
Info: Found 1 design units, including 1 entities, in source file test11.v
Info: Found entity 1: test11
Info: Elaborating entity "test11" for the top level hierarchy
Error (10028): Can't resolve multiple constant drivers for net "locate_47" at test11.v(30)
Error (10029): Constant driver at test11.v(13)
Error (10028): Can't resolve multiple constant drivers for net "locate_47" at test11.v(30)
Error (10028): Can't resolve multiple constant drivers for net "locate_47" at test11.v(30)
Error (10028): Can't resolve multiple constant drivers for net "locate_47" at test11.v(30)
Error (10028): Can't resolve multiple constant drivers for net "count" at test11.v(22)
Error (10028): Can't resolve multiple constant drivers for net "count" at test11.v(22)
Error (10028): Can't resolve multiple constant drivers for net "count" at test11.v(22)
Error (10028): Can't resolve multiple constant drivers for net "count" at test11.v(22)
Error (10028): Can't resolve multiple constant drivers for net "lock" at test11.v(45)
Error (10028): Can't resolve multiple constant drivers for net "dout_r" at test11.v(52)
Error (10028): Can't resolve multiple constant drivers for net "k" at test11.v(52)
Error (10028): Can't resolve multiple constant drivers for net "k" at test11.v(52)
Error (10028): Can't resolve multiple constant drivers for net "k" at test11.v(52)
Error: Can't elaborate top-level user hierarchy
Error: Quartus II Analysis & Synthesis was unsuccessful. 15 errors, 0 warnings
Error: Peak virtual memory: 164 megabytes
Error: Processing ended: Fri Apr 09 00:52:27 2010
Error: Elapsed time: 00:00:02
Error: Total CPU time (on all processors): 00:00:01

ddr 发表于 2010-4-12 10:36:13

LZ是UESTC的吧

luckymiaojw 发表于 2011-5-9 22:52:06

一个变量是不可以在两个always模块中被赋值的,就比如说locate_47在开始复位那里被赋值一次在,然后在倒数第三个always模块里又被赋值一次,所以不能通过。还有就是你写的程序,时序逻辑怎么都是用的非阻塞赋值啊,一般时序逻辑都用阻塞赋值,不过我也不知道你的用途,只是说这里得注意下。

至芯兴洪 发表于 2011-5-9 23:13:30

建议书写规范:时序逻辑用非阻塞,组合逻辑该用阻塞,阻塞非阻塞无用也会出现错误的
1:你的输出信号dout用于assign的话应该定义成wir型:
2:你的复位信号在每个沿促发always块中都应该使用上;
3:注意下你的if语句的使用 你代码中会出现不少的锁存器
页: [1]
查看完整版本: 编程问题,帧头搜索定位,容错的程序,高手指点一下