集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
12
返回列表 发新帖
楼主: inter

求verilog 8位串转并程序和测试程序,要求奇偶校验和数据头探测

[复制链接]
ANG 发表于 2010-6-28 09:11:35 | 显示全部楼层
测试程序,不需要综合!
ups 发表于 2010-6-28 10:07:22 | 显示全部楼层
Harva 程序我拿去改了<br>
加了个计数器,仿真不好使了<br>
又找不到毛病<br>
高手进来帮帮忙<br>
module serial2pal(clk,reset,enable,data_in,data_head,odd_bits,even_bits,data_out);<br>
<br>
input clk;<br>
input reset;<br>
<br>
input enable;<br>
input data_in;<br>
input [2:0] data_head;<br>
<br>
output odd_bits;<br>
output even_bits;<br>
output [7:0] data_out;<br>
reg[3:0] count;<br>
<br>
reg [7:0] data_out;<br>
<br>
reg set;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; <br>
reg [2:0] check_head;&nbsp; &nbsp;<br>
<br>
always@(posedge clk or negedge reset)<br>
begin<br>
&nbsp; &nbsp;&nbsp;&nbsp;if(!reset)<br>
&nbsp; &nbsp;&nbsp;&nbsp;begin<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;count&lt;=0;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;set&lt;=0;<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;check_head&lt;=0;<br>
&nbsp; &nbsp;&nbsp;&nbsp;end<br>
&nbsp; &nbsp;&nbsp;&nbsp;else if(enable==1)<br>
&nbsp; &nbsp;&nbsp;&nbsp;begin<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;check_head&lt;={check_head,data_in};<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; if(check_head==data_head)<br>
&nbsp; &nbsp;begin&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; set&lt;=1;<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;count&lt;=4'b0111;<br>
end<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;else <br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;set&lt;=0;<br>
&nbsp; &nbsp; end<br>
end<br>
<br>
always@(posedge clk or negedge reset)<br>
begin<br>
&nbsp; &nbsp; if(!reset)<br>
&nbsp; &nbsp;&nbsp; &nbsp; data_out&lt;=0;<br>
&nbsp; &nbsp; else if(enable==0)<br>
&nbsp; &nbsp;&nbsp; &nbsp; begin<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;if((set&lt;=1)&amp;&amp;(count&gt;=7))<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;begin<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;data_out&lt;={data_out,data_in};<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; count&lt;=count+1;<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;end<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;else<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;data_out&lt;=8'bz;<br>
&nbsp; &nbsp;&nbsp; &nbsp; end<br>
end<br>
<br>
assign odd_bits=^data_out;<br>
assign even_bits=~odd_bits;<br>
<br>
endmodule<br>
<br>
[ 本帖最后由 zaochenyu 于 2006-9-6 12:38 编辑 ]
CHAN 发表于 2010-6-28 12:06:53 | 显示全部楼层
问题处在你的else if(enable==1)<br>
&nbsp; &nbsp;&nbsp;&nbsp;begin<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;check_head&lt;={check_head,data_in};<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; if(check_head==data_head)<br>
&nbsp; &nbsp;begin&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; set&lt;=1;<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;count&lt;=4'b0111;<br>
end<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;else <br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;set&lt;=0;<br>
&nbsp; &nbsp; end<br>
中的else语句,由于check_head也是随输入变的,而你有没有积存set的值,也就是说<br>
在你的描述中set只是一个脉冲(宽度可能为1各clk周期),而不是你所希望的一直高电平,<br>
所以,应给去掉else&nbsp;&nbsp;set&lt;=0;语句,对set的值进行锁存。
VVC 发表于 2010-6-28 13:13:10 | 显示全部楼层
测试程序,不需要综合!测试程序,不需要综合!测试程序,不需要综合!
wwwwwwasd 发表于 2010-8-24 09:58:30 | 显示全部楼层
我觉得应该这样写:
`timescale 1ns / 1ps
module serial2pal(
                  //input
                  clk,              //clock signal
                  reset,            //reset signal
                  enable,           //enable signal
                  data_in,          //serial data in
                  data_head,        //head of the useful data, used for head check
                  data_tail,        //tail of the useful data, used for tail check
                  
                  //output
                  odd_bits,         //indicate the result of odd and even check
                  even_bits,
                  data_out,
                                                check_head,                        //add
                                                check_tail,                        //add
                                                seta                                        //add
                  );
//clock and reset signal description
input clk;
input reset;

//input signal description
input enable;
input data_in;
input [7:0] data_head;
input [7:0] data_tail;

//output description
output odd_bits;
output even_bits;
output [7:0] data_out;
output [7:0] check_head;             //add
output [7:0] check_tail;                  //add
output seta;                                                          //add

reg [3:0] n;
reg [7:0] data_out;
parameter temp_head=8'b11111111;                 //add
parameter temp_tail=8'b00000000;                 //add

//internal signal description
reg seta;               //used to indicate whether we have got the data header.
reg [7:0] check_head;   //used to check the data_head
reg [7:0] check_tail;   //used to check the end of the useful data

always@(posedge clk or negedge reset)
begin
     if(!reset)
       begin
            seta<=0;
            check_head<=0;
            check_tail<=0;
       end
     else
            begin


                check_head={check_head[6:0],data_in};
                check_tail={check_tail[6:0],data_in};
                  if(check_head==temp_head)
                                      seta<=1;
                            else if(check_tail==temp_tail)
                                      seta<=0;

            end
end

always@(posedge clk or negedge reset)
begin
    if(!reset)
       data_out<=0;
    else
       begin
                     if(n<=7)
                            begin         //
               if(seta==1)
                                 begin
                    data_out<={data_out[6:0],data_in};
                                        n=n+1;
                                      end
               else
                               n=0;
                            end
                          else
                            begin
                               n=0;
                             data_out=8'bx;
                            end
       end
end

//assign odd_bits=^data_out;         
//assign even_bits=~odd_bits;       

endmodule
wwwwwwasd 发表于 2010-8-24 09:59:21 | 显示全部楼层
测试部分:
`timescale 1ns / 1ps

module test_v;

        // Inputs
        reg clk;
        reg reset;
        reg enable;
        reg data_in;
        reg [7:0] data_head;
        reg [7:0] data_tail;

        // Outputs
        wire odd_bits;
        wire even_bits;
        wire [7:0] data_out;
        wire [7:0] check_head;
        wire [7:0] check_tail;
        wire seta;

   parameter period =40 ;

        // Instantiate the Unit Under Test (UUT)
        serial2pal uut (
                .clk(clk),
                .reset(reset),
                .enable(enable),
                .data_in(data_in),
                .data_head(data_head),
                .data_tail(data_tail),
                .odd_bits(odd_bits),
                .even_bits(even_bits),
                .data_out(data_out),
                .check_head(check_head),
                .check_tail(check_tail),
                .seta(seta)

        );


always #20 clk<=~clk;      
                              
initial
begin
                 reset=1;
                 data_in=0;
       clk=0;
                 enable=1;

#period   data_in=0;
#period   data_in=1;
#period   data_in=0;
#period   data_in=1;
#period   data_in=0;
#period   data_in=1;
#period   data_in=0;
#period   data_in=1;

#period   data_in=1;          //1
#period   data_in=1;
#period   data_in=1;
#period   data_in=1;
#period   data_in=1;
#period   data_in=1;
#period   data_in=1;
#period   data_in=1;

#period   data_in=0;
#period   data_in=1;
#period   data_in=0;
#period   data_in=1;
#period   data_in=0;
#period   data_in=1;
#period   data_in=0;
#period   data_in=1;

#period   data_in=0;
#period   data_in=1;
#period   data_in=0;
#period   data_in=1;
#period   data_in=0;
#period   data_in=1;
#period   data_in=0;
#period   data_in=1;

#period   data_in=0;
#period   data_in=1;
#period   data_in=0;
#period   data_in=1;
#period   data_in=0;
#period   data_in=1;
#period   data_in=0;
#period   data_in=1;

#period   data_in=0;
#period   data_in=1;
#period   data_in=0;
#period   data_in=1;
#period   data_in=0;
#period   data_in=1;
#period   data_in=0;
#period   data_in=1;

#period   data_in=0;
#period   data_in=1;
#period   data_in=0;
#period   data_in=1;
#period   data_in=0;
#period   data_in=1;
#period   data_in=0;
#period   data_in=1;

#period   data_in=0;
#period   data_in=1;
#period   data_in=0;
#period   data_in=1;
#period   data_in=0;
#period   data_in=1;
#period   data_in=0;
#period   data_in=1;

#period   data_in=0;
#period   data_in=1;
#period   data_in=0;
#period   data_in=1;
#period   data_in=0;
#period   data_in=1;
#period   data_in=0;
#period   data_in=1;

#period   data_in=0;         //0
#period   data_in=0;
#period   data_in=0;
#period   data_in=0;
#period   data_in=0;
#period   data_in=0;
#period   data_in=0;
#period   data_in=0;

#period   data_in=0;
#period   data_in=1;
#period   data_in=0;
#period   data_in=1;
#period   data_in=0;
#period   data_in=1;
#period   data_in=0;
#period   data_in=1;

#period   data_in=0;
#period   data_in=1;
#period   data_in=0;
#period   data_in=1;
#period   data_in=0;
#period   data_in=1;
#period   data_in=0;
#period   data_in=1;

#period   data_in=0;
#period   data_in=1;
#period   data_in=0;
#period   data_in=1;
#period   data_in=0;
#period   data_in=1;
#period   data_in=0;
#period   data_in=1;

#period   data_in=0;
#period   data_in=1;
#period   data_in=0;
#period   data_in=1;
#period   data_in=0;
#period   data_in=1;
#period   data_in=0;
#period   data_in=1;

#period   data_in=0;
#period   data_in=1;
#period   data_in=0;
#period   data_in=1;
#period   data_in=0;
#period   data_in=1;
#period   data_in=0;
#period   data_in=1;

#period   data_in=1;         //1
#period   data_in=1;
#period   data_in=1;
#period   data_in=1;
#period   data_in=1;
#period   data_in=1;
#period   data_in=1;
#period   data_in=1;

#period   data_in=0;
#period   data_in=1;
#period   data_in=0;
#period   data_in=1;
#period   data_in=0;
#period   data_in=1;
#period   data_in=0;
#period   data_in=1;

#period   data_in=0;
#period   data_in=1;
#period   data_in=0;
#period   data_in=1;
#period   data_in=0;
#period   data_in=1;
#period   data_in=0;
#period   data_in=1;

#period   data_in=0;
#period   data_in=1;
#period   data_in=0;
#period   data_in=1;
#period   data_in=0;
#period   data_in=1;
#period   data_in=0;
#period   data_in=1;

#period   data_in=0;
#period   data_in=1;
#period   data_in=0;
#period   data_in=1;
#period   data_in=0;
#period   data_in=1;
#period   data_in=0;
#period   data_in=1;

#period   data_in=0;
#period   data_in=1;
#period   data_in=0;
#period   data_in=1;
#period   data_in=0;
#period   data_in=1;
#period   data_in=0;
#period   data_in=1;

#period   data_in=1;
#period   data_in=1;
#period   data_in=1;
#period   data_in=1;
#period   data_in=1;
#period   data_in=1;
#period   data_in=1;
#period   data_in=1;

#period   data_in=0;
#period   data_in=1;
#period   data_in=0;
#period   data_in=1;
#period   data_in=0;
#period   data_in=1;
#period   data_in=0;
#period   data_in=1;

#period   data_in=0;
#period   data_in=1;
#period   data_in=0;
#period   data_in=1;
#period   data_in=0;
#period   data_in=1;
#period   data_in=0;
#period   data_in=1;

#period   data_in=0;
#period   data_in=0;
#period   data_in=0;
#period   data_in=0;
#period   data_in=0;
#period   data_in=0;
#period   data_in=0;
#period   data_in=0;

#period   data_in=0;
#period   data_in=1;
#period   data_in=0;
#period   data_in=1;
#period   data_in=0;
#period   data_in=1;
#period   data_in=0;
#period   data_in=1;

#period   data_in=0;
#period   data_in=0;
#period   data_in=0;
#period   data_in=0;
#period   data_in=0;
#period   data_in=0;
#period   data_in=0;
#period   data_in=0;

#period   data_in=0;
#period   data_in=1;
#period   data_in=0;
#period   data_in=1;
#period   data_in=0;
#period   data_in=1;
#period   data_in=0;
#period   data_in=1;

end        //后加的



      
endmodule
您需要登录后才可以回帖 登录 | 我要注册

本版积分规则

关闭

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

QQ|小黑屋|手机版|Archiver|集成电路技术分享 ( 京ICP备20003123号-1 )

GMT+8, 2024-5-5 02:18 , Processed in 0.076946 second(s), 16 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表