Very good sample NiosII UART

1, Non Interrupt

#include

#include “unistd.h”

#include “system.h”

#include “alt_types.h”

#include “altera_avalon_uart_regs.h”

int main()

{

    printf(“Hello from Nios II\n”);

    alt_u8 txdata = 0;

    alt_u8 rxdata = 0;

    while(1)

    {

       //查询接收准备好信号,如果没有准备好,则等待

while(!((IORD_ALTERA_AVALON_UART_STATUS(UART_BASE)&ALTERA_AVALON_UART_STATUS_RRDY_MSK)));

       //接收准备好,读取UART接收数据

       rxdata = IORD_ALTERA_AVALON_UART_RXDATA(UART_BASE);

       txdata = rxdata;

       //查询发送准备好信号,如果没有准备好,则等待

while(!((IORD_ALTERA_AVALON_UART_STATUS(UART_BASE)&ALTERA_AVALON_UART_STATUS_TRDY_MSK)));

       //发送准备好,发送txdata

       IOWR_ALTERA_AVALON_UART_TXDATA(UART_BASE,txdata);

    }

    return 0;

}

2、中断方式

//中断方式

#include

#include

#include “unistd.h”

#include “system.h”

#include “alt_types.h”

#include “altera_avalon_uart_regs.h”

#include “sys\alt_irq.h”

static alt_u8txdata = 0;

static alt_u8rxdata = 0;

//UART中断服务函数

static void uart_isr(void * context,alt_u32 id)

{

    rxdata = IORD_ALTERA_AVALON_UART_RXDATA(UART_BASE);

    txdata = rxdata;

    //查询发送准备好信号,如果没有准备好,则等待

while(!((IORD_ALTERA_AVALON_UART_STATUS(UART_BASE)&ALTERA_AVALON_UART_STATUS_TRDY_MSK)));

    //发送准备好,发送txdata

    IOWR_ALTERA_AVALON_UART_TXDATA(UART_BASE,txdata);

}

void uart_init()

{

    //清除状态寄存器

    IOWR_ALTERA_AVALON_UART_STATUS(UART_BASE,0);

    //使能接受准备好中断

    IOWR_ALTERA_AVALON_UART_CONTROL(UART_BASE,0X80);

}

int main()

{

    printf(“Please Start!\n”);

    //注册UART中断服务函数

    alt_irq_register(UART_IRQ,NULL,uart_isr);

    uart_init();

    while(1){}

    return 0;

}

 

Link

The method used to create a .jic file with a Nios® II hardware and software image is as follows.

 

1.      Create a flash file for the hardware and software image
sof2flash –input=<hwimage>.sof –output=hwimage.flash –epcs –verbose
elf2flash –input=<elf file>.elf –output=swimage.flash –epcs –after=hwimage.flash –verbose

Note: When creating the software flash image, there is no need to add a boot srec (this is located in the EPCS Controller), the –after option ensures the software image starts immediately after the hardware image.

2.      Convert the flash images into Hex files

nios2-elf-objcopy -I srec -O ihex hwimage.flash  hwimage.hex
nios2-elf-objcopy -I srec -O ihex swimage.flash  swimage.hex

3.      When creating your jic file using Quartus® II Convert Programming File tool, add the Flash Loader and both hex files with absolute addressing option selected.

Note: You do not need to add the .sof file to the jic image.  This is because you created a hardware hex image.  Using the hardware hex image ensures the software hex image is at the proper offset in the EPCS

link

link2

Flash EPCS64 system

The error1 during flashing into EPCS using FPGA board, could not find the epcs register.

  1. This problem comes from EPCS flash controller had its RESET connected to the main Clk_Reset , but not to the JTAG_Reset : so i rebuilt in QSys after having connected the EPCS controller to the JTAG_Reset of NiosII
  2. In my project, I use Qsys> system >Great Global Reset Network to assent the EPCS and other NiosII componts.
  3. The SDRAM S1 port, should connect to both data_master and Instrument_master

In Nios II, when we flashing the EPCS, “No EPCS layout data”

This is because there is no EPCS layout information in the system, we should let the NIOS know the EPCS layout setup.

[EPCS-202011] # EPCS1N (lead-free)
sector_size = 32768
sector_count = 4
[EPCS-202013] # EPCS4N (lead-free)
sector_size = 65536
sector_count = 8
[EPCS-202015] #
EPCS16N (lead-free)
sector_size = 65536
sector_count = 32

[EPCS-010216] #EPCS64N(lead-free)
sector_size = 65536
sector_count = 128

[EPCS-202017] # EPCS64N (lead-free)
sector_size = 65536
sector_count = 128

[EPCS-012018] #EPCS128N(lead-free)
sector_size = 262144
sector_count = 64

Create a folder under the Nios2eds>bin

a document “nios2-flash-override.txt”

 

Always @ Verilog

This note that not all Verilog designs are synthesizable. Usually, only a very specific subset of constructs can be used in a design that is to be realized in hardware.

One important restriction that pops up is that every reg variable can only be assigned to in at most one always statement. In other words, regs have affinity to always blocks.

The following types of always blocks can generally be used.

 

In the former case, the * indicates that the block should be executed whenever any signal used in the block changes or, equivalently, that the block should be executed continuously. Therefore, regs that have affinity to combinatorial always blocks are implemented as signals computed from other signals using combinatorial logic, i.e. gates.

Registers that have affinity to always blocks of the latter type, on the other hand, are outputs of D flip-flops that are clocked on the rising edge of clk (falling edge if negedge is used). Inputs to the flip-flops are, again, computed with combinatorial logic from other signals.

Consider the following, somewhat contrived example.

 

Here, out_n is associated with the first always block, out with the second. out_n will be implemented with a single NOT gate that will drive out_n and be driven from out (note that it is a pure combinatorial logic). On the other hand, out will be driven by a flip-flop clocked from clk. The input to the flip-flop will again be computed by a NOT gate from out (which is driven by the aforementioned flip-flop). Optimizing synthesizers will combine the two NOT gates and use one NOT gate and one flip-flop.

Depending on the hardware you have available, other types of constructs can be used. For example, if the flip-flops have asynchronous resets, the following construct is also synthesizable.

 

FPGA Generate PWM

In FPGA, we use the counter to generate the pulse. What would happen if instead of using a 25 bit counter we used an 8 bit counter? The LED would blink at 50MHz / 2^8 = 195,313 Hz or 195,313 times per second. There is no way our eyes are fast enough to see it blink that fast. Since we can’t see it blink what would it look like? It would not look like a whole lot, it would just appear to always be on! However, the interesting part is that since it is only on for half of the time our eye averages the light and the LED appears to be dimmer than if it was on the entire time!

I recommend you try modifying the code form that tutorial to have one LED blinking from an 8 bit counter and another LED always on so you can see the difference.

How does PWM play into all of this? As you may have guessed, by varying the duty cycle of the signal we can effectively control the brightness of the LED! With a 0% duty cycle the LED is off, with a 100% duty cycle the LED is full brightness, and by controlling the duty cycles we can reach any point in between.

When we were blinking the LED we used a simplification because we always wanted a 50% duty cycle. Instead of saying the LED should be on when the counter is greater than half its max value, we simply used the most significant bit. However, in the case where we want to create a signal with an arbitrary duty cycle we need to be able to control the value we are comparing the counter to.

Here is an example where we want to create the same 33% duty cycle signal shown before.

You can see that by simply raising the value of Compare to 2/3 of Max our duty cycle became 66%!

To implement this in Verilog is pretty simple and only requires a few modifications to the blinker code.

Let’s put this all together in a project. Create a new source file called PWM.v and add the contents of the code above.

 

Parameters

This code has something new, the parameter. Parameters are constants that are used to configure the behavior of a module when your code is synthesized. These are useful for making generic modules that can be reused.

Parameters are declared before the IO ports by using the #( … ) syntax. You can list as many parameters as you like by separating them with commas. If you assign a parameter a value, like we did in this example, then that is the default value and will be used if a value isn’t specified when the module is instantiated.

Instantiating the module

Just like before, since we added a new module, we need to instantiate it in the general file.

For this example we are going to instantiate 8 PWM modules and give each one a different constant compare value. That way we should get each of the LEDs to be at a different brightness.

 

 

For this example we set CTR_LEN to be 3 because we only need 8 different brightness values. For whatever reason, when you instantiate the module the parameters come before the name of the instance.

Go ahead and synthesize the code in ISE and load it onto your Mojo. You should see the top LED is fully on and each one under it is slightly dimmer.

 

 

SoCKit Part I – Blinking LEDs

Creating the Project

Now that you’ve created the project, you can set up the top-level file and assign the pins you need to it. In Quartus, create a Verilog file by clicking “File” -> “New” -> “Verilog HDL file”. Save the file with the same name as your project (so if you called your project “sockit_test”, save it as “sockit_test.v”. I recommend putting your HDL files in a separate subdirectory in your project folder called “rtl”.

Put the following Verilog code in “sockit_test.v”.

If you’re not familiar with Verilog, a “module” is a hardware block. In this code, we are simply specifying what the inputs and outputs of the block are. For the top-level module, the inputs and outputs are the pins of the FPGA. For our example, we only need the 4 push button keys, 4 LEDs, and the 50 MHz clock. You can assign the pins on the FPGA to your inputs and outputs by going to “Assignments” -> “Pin Planner” and entering in the following assignments.

 

 

很多天没有写点儿东西了

越来越接近十月了,心情还是比较紧张地,公司的事儿在我掉了一层头发以后,已经顺利地出了产品,用手指头数数今年任务还真的不少。没有一天是没有任务的状态,大事儿小事儿,这就是磨练的过程吧。工作,要专注,要沉稳,话越少越好。回家,更要专注,不能把工作带回家是吧。

Read more

可爱的老婆

老婆的爱

我的老婆怀孕已经4个月了,肚子越来越大的同时,人也变得珠圆玉润,圆圆的脸,圆圆肚子,本来娇艳可人的小脸变得更加让人想亲一口。呵呵,本意是色狼本性的我,更是欲罢不能,呵呵,能还能怎么能?呵呵,老婆。现在每天我都在珍惜一起的二人世界。因为我们注定要带着一群拖油瓶走完我们两个人的一生,感谢你,为我的带来着那命中注定的小捣蛋鬼。感谢你让我们的生活变得这么美好。我相信,一切随雪花结晶一样命中注定,散落人间,却是有莫大的缘分的人,在结合到了一起,融化成了水,这就是我们的无法分离的一生。

俏粉樱丛蜂冉玄,莹亮露珠鹊鸣弦,催酒无铮鸣净土,愿执枝头共海天

9107

开篇敬礼

荒废了很久的网页也的收拾一下不是?虽然很忙,虽然很累,但是这还是有必要的。当做一个日记,当做一个世外桃源也是一个绝佳的地方?很多人问,那为啥不用facebook或者校内,原因很简单,太他鸟烦,不想让自己在别人眼中变得萝莉啰嗦,也不想让自己的隐私一点都没有,我又没有暴露欲,所以最好的,就是这儿,没人看,也许有一天有人看,哇啦,又如何?呵呵,不想让人看,你就自己写日记好了。不废话了。开始吧,小宇宙,让生活多彩,让爱你的人更加爱你,让你爱得人也有幸福感,我老庄会努力把自己做好,人无完人,别要求太多,我这人很纠结的,玻璃心,哈,铁汉柔情没有听过吗?算了,两头都不找边儿。。。。 Read more

  • Taisen

    Creative, Enthusiasm, Faithful! Welcome to Taisen's blog.  
  • Tag Cloud

  • Contact Me