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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 3879|回复: 10

[求助] verilog求助

[复制链接]
发表于 2011-5-1 19:34:09 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 记忆的沙漏 于 2011-5-3 10:48 编辑

自己编了一个代码,modelsim编译通过了,但是仿真出不来,求大神指教
`timescale  1 ns/
1ns        
                                                                                                                                                           
module ts_mux(                                                                                      
ts_in,                                                                                                
clk,                                                                                          
sync,                                                                                         
rst,                                                                                          
din,                                                                                                                                                                           
en,                                                                                          
ts_out                                                                                       
);
                                                                          
parameter   P=8'hff;                                                      //判断第三字节是否全为1                                          
parameter   a1=2'b00,a2=2'b01,a3=2'b11,a4=2'b10;             //四个状态                                 
                                                                                             
input [7:0]     ts_in;                                                                        
output [7:0]   ts_out;                                                                        
input             rst;                                                                           
input          en,clk;                                                                              
input          sync;                            //同步头,每帧的开始,均为h47                                                                          
input [7:0]    din;                            //控制数据
reg [7:0]      ts_out;                            //输出                                          
reg [3:0]      acount;                                                                          
reg            read_in;                           //fifo写信号                                                         
reg [1:0]      state;                                                                                                                                                                                                                                                                                                                                                                           
wire           stack_full,stack_empty,stack_almost_full;                                                                                                
reg [2:0]      read_ptr,write_ptr;     
                                                                              
always@(posedge clk or posedge rst)                                                      
if(rst)begin                                                                                 
     ts_out[7:0]<=8'h00;                                                                              
     acount<=0;                                                                                                                                                   
     state<=a1;   
     read_in<=0;                                                                           
   end                                                                                       
else case(state)                                                                              
        a1:  begin                           //check the sync                                             
               acount<=0;                                                                     
               if(sync==1)begin                                                               
                  state<=a2;                                                                  
                  ts_out[7:0]<=ts_in[7:0];                                                               
                  end                                                                        
               else begin                                                                     
                  state<=a1;                                                                  
                  ts_out[7:0]<=ts_in[7:0];                                                              
                  end                                                                        
              end                                                                             
        a2:  begin                        //secound                                            
                 if(ts_in[4:0]==5'b11111)                                                         
                    begin                                                                     
                     state<=a3;                                                               
                     ts_out[7:0]<=ts_in[7:0];                                                        
                     end                                                                       
                 else begin                                                                  
                    state<=a1;                                                               
                    ts_out[7:0]<=ts_in[7:0];                                                            
                  end                                                                        
              end                                                                             
                                                                                             
        a3:  begin                                    //third                                             
                  if(ts_in==P&&stack_almost_full==1)                                                               
                    begin                                                                     
                    state<=a4;                                                               
                    ts_out[7:0]<=ts_in[7:0];                                                         
                    read_in<=1;                       //read_in ,read from the stack                        
                    end                                                                       
                  else begin                                                                  
                    state<=a1;                                                               
                    ts_out[7:0]<=ts_in[7:0];                                                            
                    end                                                                       
              end                                                                             
         a4 :  begin                                                                          
                acount<=acount+1;                                                               
                if(acount==8'd7)begin                                                         
                  state<=a1;                                                                  
                  acount<=0;                                                                  
                  read_in<=0;                                                                 
                  end  
              end
      default :begin
                state<=a1;
                acount<=0;                                                                  
                read_in<=0;
                ts_out[7:0]<=ts_in[7:0];                                                               
                   end                                                                                                                                                                                                            
     endcase
                                                                                                   
fifo_buffer M1(din,ts_out,en,read_in,stack_almost_full,stack_full,stack_empty,clk,rst);         //调用fifo模块   
                                                                                            
endmodule                                                                                    
                                                                                             
                                                                                               
module fifo_buffer(                                                                           
Data_in ,                                                                                                                                                                    
Data_out,                                                                                    
write_to_stack,                // write signalling depends on the en signal               
read_from_stack,           
stack_almost_full,
stack_full,
stack_empty,                                                                          
clk,                                                                                          
rst                                                                                       
);                                                                                            
                                                                                                                                                                                                                                       
output [7:0]       Data_out;                                                               
input  [7:0]       Data_in ;                                                      
input              write_to_stack,read_from_stack;                                 
input                clk,rst;                                                        
output             stack_full,stack_empty,stack_almost_full;  
                                                                                             
reg [stack_ptr_width-1:0]   read_ptr,write_ptr;                                                
reg [stack_ptr_width:0]     ptr;                                                            
reg [7:0]       Data_out;                                                           
reg [7:0]       stack[stack_height-1:0];                                            

parameter stack_height=10;                                                                                       
parameter AF_level=7;                //判断是不是大于7个字节
parameter stack_ptr_width=3;   
                                                                                             
//info of stack                                                                              
assign stack_full=(ptr==stack_height);                                                     
assign stack_empty=(ptr==0);                                                               
assign stack_almost_full=(ptr>=AF_level);
                                                                                         
always@(posedge clk or posedge rst)                                                         
if(rst)begin                                                                                                                                                              
     read_ptr<=0;                                                                             
     write_ptr<=0;                                                                           
     ptr<=0;                                                                              
end                                                                                          
else if(write_to_stack&&(!stack_full)&&(!read_from_stack))begin                              
     stack[write_ptr]<=Data_in ;                      //write                                 
     write_ptr<=write_ptr+1;                                                                  
     ptr<=ptr+1;                                                                     
     end                                                                                      
else if((!write_to_stack)&&(!stack_empty)&&read_from_stack)begin            
     Data_out<= stack[read_ptr];                       //read                                             
     read_ptr<=read_ptr+1;                                                                    
     ptr<=ptr-1;                                                                     
     end                                                                                      
                                                                                             
else if(write_to_stack&&stack_full&&read_from_stack)begin                                    
     Data_out<= stack[read_ptr];                   //stack is full,only read                          
     read_ptr<=read_ptr+1;                                                                    
     ptr<=ptr-1;                                                                     
     end                                                                                      
                                                                                             
else if(write_to_stack&&stack_empty&&read_from_stack)begin                                    
     stack[write_ptr]<=Data_in ;                       //stack is emtpty,only write            
     write_ptr<=write_ptr+1;                                                                  
     ptr<=ptr+1;                                                                     
     end                                                                                      
                                                                                             
else if(write_to_stack&&(!stack_empty)&&read_from_stack&&(!stack_full))begin                  
     Data_out<=stack[read_ptr];                                //read and write                                    
     stack[write_ptr]<=Data_in ;                                                               
     write_ptr<=write_ptr+1;                                                                  
     read_ptr<=read_ptr+1;                                                                    
     end               
                                                                           
endmodule
 楼主| 发表于 2011-5-1 19:38:36 | 显示全部楼层
这个功能是对空帧加入控制数据,每个帧长度为10个字节,第一个字节为头,h47,如果是空帧,第二个字节最后五位为1,第三个字节全为1,那么可以对其余的七个字节放入控制数据
输入为TS,时钟为clk,控制数据为DIN,en是使能,控制读出的控制信息到TS流的空帧的第三个字节到第十个字节中
发表于 2011-5-2 08:34:37 | 显示全部楼层
ts_mux的ts_out是不是应该定义成wire啊?
因为你是直接从M1的output里连出来的。
发表于 2011-5-2 11:34:17 | 显示全部楼层
这代码写得真是有水平
 楼主| 发表于 2011-5-2 18:28:56 | 显示全部楼层
回复 4# aimar327


    刚学,没怎么写过
发表于 2011-5-2 21:49:24 | 显示全部楼层
回复 1# 记忆的沙漏

简单的看了一下,列举一些我认为的问题:
1.  always@(negedge clk or posedge rst)
    为什么用negedge clk呢?如果是你想时钟的下降沿采样,那么可以将时钟先专门取反(如果是ASIC,则用驱动能力强的buffer,并且在后端做时钟树综合的时候特别注意,如果是FPGA,用一个PLL或者专用的时钟取反单元来实现),然后用(posedge clk),不要在verilog代码中用negedge clk,因为standard cell里面很少会有下降沿触发的寄存器。
2. if(ts_in==8'bx11111)
    这句话不是等效于 tx_in[4:0] = 5'b11111吗?为什么在前面写X呢?画蛇添足,而且容易出错。
3. if(ts_in==H&&stack_almost_full==1)
    ts_in == H, 这里H是什么东西?你想仿真器或者综合器把这个条件认为是什么?H是应该为ASCII码中的“H”字符呢还是什么别的东西?(因为H不是十六进制或者十进制的任何数字)

先写这么多,剩下的我再慢慢看。
 楼主| 发表于 2011-5-3 10:37:07 | 显示全部楼层
回复 6# acgoal


    谢谢,我改改
 楼主| 发表于 2011-5-3 10:43:01 | 显示全部楼层
回复 6# acgoal


    这些问题我改了,我想问的是,那个这个程序当中我想对TS流进行控制数据的插入
就是对ts_out,一部分输出原来TS流内的数据,然后再空帧的第四个字节开始插入控制数据

我能不能像我程序写的那样,通过read_in这个读的操作,对FIFO模块进行调用,从而将控制数据输出?
发表于 2011-5-9 09:49:08 | 显示全部楼层
首先,最重要的一点。hdl语言是硬件描述语言,是用语句描述硬件的。写代码的时候要尽量想象你写的代码会生成什么样的硬件结构。跟c那样的代码开发完全不同。你的代码如果按c来说是可以的。如果按照hdl来说。你离入门还有很远。因为你更本不是在用hdl的思想来解决问题的。
再来,你说的仿真出不来是什么意思?结果不对?还是没有任何输出?因为没看到你的激励文件。不知道问题出在哪里。
看了你的代码,我理解是,控制数据放在fifo里。检索到空帧就开始读存有控制数据的fifo,不知道我的理解对不对。我建议你采用这样的结构,用一个计数器来循环计帧的byte数。用一个模块对帧头的三个数据检验,用一个复用器控制输出端数据流的选择。fifo仍然用来存控制数据。再做一个状态机来驱动这四个部分工作。不论你怎么划分module,最终的rtl级结构应该体现这几个部分。
 楼主| 发表于 2011-5-9 12:39:32 | 显示全部楼层
回复 9# wycawyc


    谢谢,我尝试下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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


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

GMT+8, 2024-11-22 21:10 , Processed in 0.023699 second(s), 8 queries , Gzip On, Redis On.

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