集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
楼主: fpgaw

至芯科技【夏宇闻教授专栏】与你一起搞定FPGA设计!

[复制链接]
夏宇闻 该用户已被删除
夏宇闻 发表于 2012-4-3 16:22:36 | 显示全部楼层
夏老师,您好,我verilog初学者,在学习中遇到个问题想请教您
我最近做一个加法器通过串口通信实现,发送和 ...
hjchen 发表于 2012-3-28 12:53

你如果没有认真读过并彻底理解我书上第16章和第17章的内容,不要开始做任何比较复杂的项目。因为你不能理解数字系统的基本设计方法,我也无从下手来指导您的设计。读懂这二章中每一段代码的细节,按思考题要求独立编写一个页面读写的接口和多几条指令的RlSC CPU,否则您不可能理解真实的设计途径,自己乱写,没办法验证,如何能设计出功能完善正确的电路呢? 要理解设计方法学的概念,不仅仅是语法,这是一个完整的设计体系,可以帮助您发现问题改进设计直至完善。
夏宇闻 该用户已被删除
夏宇闻 发表于 2012-4-3 16:23:32 | 显示全部楼层
夏老师,您好:
        我是刚学Verilog不久,最近一直在研究FPGA的串口通讯问题,但是编写的接收程序不能 ...
Newrenlan 发表于 2012-3-31 14:57



    你如果没有认真读过并彻底理解我书上第16章和第17章的内容,不要开始做任何比较复杂的项目。因为你不能理解数字系统的基本设计方法,我也无从下手来指导您的设计。读懂这二章中每一段代码的细节,按思考题要求独立编写一个页面读写的接口和多几条指令的RlSC CPU,否则您不可能理解真实的设计途径,自己乱写,没办法验证,如何能设计出功能完善正确的电路呢? 要理解设计方法学的概念,不仅仅是语法,这是一个完整的设计体系,可以帮助您发现问题改进设计直至完善。
夏宇闻 该用户已被删除
夏宇闻 发表于 2012-4-3 16:24:45 | 显示全部楼层
回复  fpgaw
我要做一个动态可重构,用两个FPGA实现两种算法的动态切换,也就是用一个FPGA控制另一个FPGA ...
science361 发表于 2012-3-31 19:29


你如果没有认真读过并彻底理解我书上第16章和第17章的内容,不要开始做任何比较复杂的项目。因为你不能理解数字系统的基本设计方法,我也无从下手来指导您的设计。读懂这二章中每一段代码的细节,按思考题要求独立编写一个页面读写的接口和多几条指令的RlSC CPU,否则您不可能理解真实的设计途径,自己乱写,没办法验证,如何能设计出功能完善正确的电路呢? 要理解设计方法学的概念,不仅仅是语法,这是一个完整的设计体系,可以帮助您发现问题改进设计直至完善。
夏宇闻 该用户已被删除
夏宇闻 发表于 2012-4-3 16:26:22 | 显示全部楼层
夏老师 ,您好 我用的 DE4(Stratix IV GX EP4SGX230)开发板,其中有个例子调用了altpll和altgx   不知道怎么 ...
tjy389945230 发表于 2012-4-2 20:16

    你如果没有认真读过并彻底理解我书上第16章和第17章的内容,不要开始做任何比较复杂的项目。因为你不能理解数字系统的基本设计方法,我也无从下手来指导您的设计。读懂这二章中每一段代码的细节,按思考题要求独立编写一个页面读写的接口和多几条指令的RlSC CPU,否则您不可能理解真实的设计途径,自己乱写,没办法验证,如何能设计出功能完善正确的电路呢? 要理解设计方法学的概念,不仅仅是语法,这是一个完整的设计体系,可以帮助您发现问题改进设计直至完善。
zx023c110 发表于 2012-4-3 21:46:53 | 显示全部楼层
夏老师:
      你好,我想请问一个关于ram的问题;
   ram ram(
             .addr(addr_in),
                   .clk(clk_r)'
                           .
                           .
                           .);
这样构建的一个ram就具有了存储功能吗,不用编写他的具体功能实现吗??
夏宇闻 该用户已被删除
夏宇闻 发表于 2012-4-5 12:04:18 | 显示全部楼层
夏老师:
      你好,我想请问一个关于ram的问题;
   ram ram(
             .addr(addr_in),
      ...
zx023c110 发表于 2012-4-3 21:46

当然要有具体的功能描述模块为基础,这个实例引用才能起作用。具体功能模块可以是自己用行为语句描述的模块,也可以是引用宏库中现成的模块,这样就不用自己编写,但在仿真时必须编译该模块的代码并加载后才能显示其功能。
开心果 发表于 2012-4-5 15:21:45 | 显示全部楼层
夏老师!!您好!!我刚开始学verilog,这是我写的AD芯片的TCL549的驱动程序,可是一直不好用,请您看看哪里错了?
module  ad_convert(
         clk,                          //系统时钟50MH
         rst_n,                  //复位信号
         adc_clk,                  //AD转换时钟
         adc_data,          //输出的AD数据
         adc_cs_n,          //AD片选信号
         digit_o,                  //数码管段选信号
         cs                                  //数码管位选信号
           );
input    clk;           
input    rst_n;            
input    adc_data;
         
output   adc_clk;           
output   adc_cs_n;           
output [7:0] digit_o;           
output [1:0]   cs;            

reg   [4:0] count;
reg   clk_64;      
always @(posedge clk)
        begin
                count<=count+1;
                if(count==0)
                        clk_64<=~clk_64;
        end
assign adc_clk=clk_64;
integer i;
parameter
        ini                =                10'b1000000000,
        waite                =                10'b0100000000,
        conver_1        =                10'b0010000000,
        conver_2        =                10'b0001000000,
        conver_3        =                10'b0000100000,
        conver_4        =                10'b0000010000,
        conver_5        =                10'b0000001000,
        conver_6        =                10'b0000000100,
        conver_7        =                10'b0000000010,
        conver_8        =                10'b0000000001;
reg [9:0]state,state_next;
reg [2:0] cnt;
reg [1:0] num;
reg adc_cs_n;
initial state_next<=ini;
always @ (posedge clk_64 or negedge rst_n)
        begin
                if(!rst_n)
                        state<=ini;
                else
                        begin
                        state<=state_next;
                        end
        end
reg [7:0] cs_n,digit;
always @ (state)  
        begin
                case(state)
                        ini      :                begin
                                                                        num<=num+1;
                                                                        adc_cs_n<=0;
                                                                        if(num==0)
                                                                                begin
//                                                                                        adc_cs_n<=0;
                                                                                        state_next<=conver_1;
                                                                                end
                                                                end                       
                                                               
                        conver_1        :                begin
                                                //                        adc_cs_n<=0;
                                                                        digit[7]<=adc_data;
                                                                        state_next<=conver_2;
                                                                end
                        conver_2        :                begin
                                        //                                adc_cs_n<=0;
                                                                        digit[6]<=adc_data;
                                                                        state_next<=conver_3;
                                                                end
                        conver_3        :                begin
                                        //                                adc_cs_n<=0;
                                                                        digit[5]<=adc_data;
                                                                        state_next<=conver_4;
                                                                end
                        conver_4        :                begin
                                        //                                adc_cs_n<=0;
                                                                        digit[4]<=adc_data;
                                                                        state_next<=conver_5;
                                                                end
                        conver_5        :                begin
                                        //                                adc_cs_n<=0;
                                                                        digit[3]<=adc_data;
                                                                        state_next<=conver_6;
                                                                end
                        conver_6        :                begin
                                        //                                adc_cs_n<=0;
                                                                        digit[2]<=adc_data;
                                                                        state_next<=conver_7;
                                                                end
                        conver_7        :                begin
                                        //                                adc_cs_n<=0;
                                                                        digit[1]<=adc_data;
                                                                        state_next<=conver_8;
                                                                end
                        conver_8        :                begin
                                        //                                adc_cs_n<=0;
                                                                        digit[0]<=adc_data;
                                                                        state_next<=waite;
                                                                end
                        waite                :                begin
                                                                        cnt<=cnt+1;
                                                                        adc_cs_n<=1;
                                                                        if(cnt==0)
                                                                                begin
                                                                                state_next<=ini;       
                                                                                end
                                                                end
                        default  :                state_next<='bx;
                endcase                                                                       
        end
nixie_light(0,digit[7:0],cs,digit_o);
endmodule
转换时钟小于17us
开心果 发表于 2012-4-5 15:22:03 | 显示全部楼层
夏老师!!您好!!我刚开始学verilog,这是我写的AD芯片的TCL549的驱动程序,可是一直不好用,请您看看哪里错了?
module  ad_convert(
         clk,                          //系统时钟50MH
         rst_n,                  //复位信号
         adc_clk,                  //AD转换时钟
         adc_data,          //输出的AD数据
         adc_cs_n,          //AD片选信号
         digit_o,                  //数码管段选信号
         cs                                  //数码管位选信号
           );
input    clk;           
input    rst_n;            
input    adc_data;
         
output   adc_clk;           
output   adc_cs_n;           
output [7:0] digit_o;           
output [1:0]   cs;            

reg   [4:0] count;
reg   clk_64;      
always @(posedge clk)
        begin
                count<=count+1;
                if(count==0)
                        clk_64<=~clk_64;
        end
assign adc_clk=clk_64;
integer i;
parameter
        ini                =                10'b1000000000,
        waite                =                10'b0100000000,
        conver_1        =                10'b0010000000,
        conver_2        =                10'b0001000000,
        conver_3        =                10'b0000100000,
        conver_4        =                10'b0000010000,
        conver_5        =                10'b0000001000,
        conver_6        =                10'b0000000100,
        conver_7        =                10'b0000000010,
        conver_8        =                10'b0000000001;
reg [9:0]state,state_next;
reg [2:0] cnt;
reg [1:0] num;
reg adc_cs_n;
initial state_next<=ini;
always @ (posedge clk_64 or negedge rst_n)
        begin
                if(!rst_n)
                        state<=ini;
                else
                        begin
                        state<=state_next;
                        end
        end
reg [7:0] cs_n,digit;
always @ (state)  
        begin
                case(state)
                        ini      :                begin
                                                                        num<=num+1;
                                                                        adc_cs_n<=0;
                                                                        if(num==0)
                                                                                begin
//                                                                                        adc_cs_n<=0;
                                                                                        state_next<=conver_1;
                                                                                end
                                                                end                       
                                                               
                        conver_1        :                begin
                                                //                        adc_cs_n<=0;
                                                                        digit[7]<=adc_data;
                                                                        state_next<=conver_2;
                                                                end
                        conver_2        :                begin
                                        //                                adc_cs_n<=0;
                                                                        digit[6]<=adc_data;
                                                                        state_next<=conver_3;
                                                                end
                        conver_3        :                begin
                                        //                                adc_cs_n<=0;
                                                                        digit[5]<=adc_data;
                                                                        state_next<=conver_4;
                                                                end
                        conver_4        :                begin
                                        //                                adc_cs_n<=0;
                                                                        digit[4]<=adc_data;
                                                                        state_next<=conver_5;
                                                                end
                        conver_5        :                begin
                                        //                                adc_cs_n<=0;
                                                                        digit[3]<=adc_data;
                                                                        state_next<=conver_6;
                                                                end
                        conver_6        :                begin
                                        //                                adc_cs_n<=0;
                                                                        digit[2]<=adc_data;
                                                                        state_next<=conver_7;
                                                                end
                        conver_7        :                begin
                                        //                                adc_cs_n<=0;
                                                                        digit[1]<=adc_data;
                                                                        state_next<=conver_8;
                                                                end
                        conver_8        :                begin
                                        //                                adc_cs_n<=0;
                                                                        digit[0]<=adc_data;
                                                                        state_next<=waite;
                                                                end
                        waite                :                begin
                                                                        cnt<=cnt+1;
                                                                        adc_cs_n<=1;
                                                                        if(cnt==0)
                                                                                begin
                                                                                state_next<=ini;       
                                                                                end
                                                                end
                        default  :                state_next<='bx;
                endcase                                                                       
        end
nixie_light(0,digit[7:0],cs,digit_o);
endmodule
转换时钟小于17us
夏宇闻 该用户已被删除
夏宇闻 发表于 2012-4-6 05:40:16 | 显示全部楼层
夏老师!!您好!!我刚开始学verilog,这是我写的AD芯片的TCL549的驱动程序,可是一直不好用,请您看看哪里 ...
开心果 发表于 2012-4-5 15:22


错的地方很多,看来您读书不仔细,语法和可综合性问题您没有理解,测试模块也没有见到,可见您对数字系统的设计方法还没有入门。您读的是哪一本书?建议您从头到尾认真读一遍我编写的Verilog数字系统设计教程第二版,理解每个例题和思考题后再开始做设计项目。
开心果 发表于 2012-4-6 09:16:15 | 显示全部楼层
回复 298# 夏宇闻


    谢谢夏老师
您需要登录后才可以回帖 登录 | 我要注册

本版积分规则

关闭

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

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

GMT+8, 2024-7-3 02:42 , Processed in 0.098895 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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